Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.83 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MEMSIZE 100
  5. #define VARIABLES MEMSIZE
  6.  
  7. struct node_t {
  8. int start, size;
  9. struct node_t *next;
  10. };
  11.  
  12. void printmemory(char memory[], struct node_t* freelist, struct node_t* usedlist){
  13. printf("memory map\n");
  14. for (int i = 0; i < MEMSIZE; i++) {
  15. printf("%c", memory[i]);
  16. }
  17. printf("\n");
  18. printf("free list\n");
  19. int freebyte = 0;
  20. int freenumbers_start[100];
  21. int freenumbers_size[100];
  22. int counter = 0;
  23. while (freelist != NULL) {
  24. freenumbers_start[counter] = freelist->start;
  25. freenumbers_size[counter] = freelist->size;
  26. ++counter;
  27. freebyte += freelist->size;
  28. freelist = freelist->next;
  29. }
  30. --counter;
  31. for(; counter >= 0; --counter){
  32. printf("start=%4d, size=%4d\n", freenumbers_start[counter], freenumbers_size[counter]);
  33. }
  34. counter = 0;
  35. printf("used list\n");
  36. int usedbyte = 0;
  37. int usednumbers_start[100];
  38. int usednumbers_size[100];
  39.  
  40. while (usedlist != NULL) {
  41. usednumbers_start[counter] = usedlist->start;
  42. usednumbers_size[counter] = usedlist->size;
  43. ++counter;
  44. usedbyte += usedlist->size;
  45. usedlist = usedlist->next;
  46. }
  47. --counter;
  48. for(; counter >= 0; --counter){
  49. printf("start=%4d, size=%4d\n", usednumbers_start[counter], usednumbers_size[counter]);
  50. }
  51. printf("%d bytes free, %d bytes used\n", freebyte, usedbyte);
  52. }
  53.  
  54. int mymalloc(char memory[], struct node_t** freelist, struct node_t** usedlist, int size, char* variables[], int addresses[], char* var, int vars_count){
  55. struct node_t* previous_free = NULL;
  56. struct node_t* current_free = *freelist;
  57. while (current_free != NULL && current_free->size < size) {
  58. previous_free = current_free;
  59. current_free = current_free->next;
  60. }
  61. if (current_free == NULL){
  62. return -1;
  63. }
  64. struct node_t* new_node = (struct node_t*)malloc(sizeof(struct node_t));
  65. new_node->start = current_free->start;
  66. new_node->size = size;
  67. new_node->next = NULL;
  68. struct node_t* current_used = *usedlist;
  69. while (current_used != NULL && current_used->next != NULL) {
  70. current_used = current_used->next;
  71. }
  72. if (current_used != NULL){
  73. current_used->next = new_node;
  74. } else {
  75. *usedlist = new_node;
  76. }
  77. for (int i = new_node->start; i < new_node->size + new_node->start; i++) {
  78. memory[i] = 'X';
  79. }
  80. if (size == current_free->size) {
  81. if (previous_free != NULL){
  82. previous_free->next = current_free->next;
  83. } else if (current_free->next != NULL) {
  84. *freelist = current_free->next;
  85. } else {
  86. *freelist = NULL;
  87. }
  88. free(current_free);
  89. } else {
  90. current_free->start = current_free->start + size;
  91. current_free->size = current_free->size - size;
  92. }
  93. strcpy(variables[vars_count], var);
  94. addresses = (int*)realloc(addresses, 8);
  95. addresses[0] = new_node->start;
  96. printf(" %d\n", sizeof(int)*(vars_count + 1));
  97. return new_node->start;
  98. }
  99.  
  100. int main()
  101. {
  102. char memory[MEMSIZE+1];
  103. memory[MEMSIZE] = '\0';
  104. for(int i = 0; i < MEMSIZE; i++){
  105. memory[i] = '.';
  106. }
  107. char cmd;
  108. char var[128];
  109. int input_size;
  110. struct node_t* startfree = (struct node_t*)malloc(sizeof(struct node_t));
  111. startfree->start = 0;
  112. startfree->size = MEMSIZE;
  113. startfree->next = NULL;
  114. struct node_t* startused = NULL;
  115. char* variables[VARIABLES] = {};
  116. int addresses[VARIABLES] = {};
  117. int vars = 0;
  118. while (1) {
  119. printf("Command: ");
  120. scanf(" %c", &cmd);
  121.  
  122. if(cmd == 'q'){
  123. printf("Bye!\n");
  124. return 0;
  125. } else if (cmd == 'm'){
  126. printf("Variable name? ");
  127. scanf(" %c", &var);
  128. printf("Malloc how many bytes? ");
  129. scanf(" %d", &input_size);
  130. if(input_size > 0){
  131. int result = mymalloc(memory, &startfree, &startused, input_size, variables, addresses, var, vars);
  132. if (result == -1){
  133. printf("There is no contiguous memory range that is large enough\n");
  134. } else {
  135. printf("Variable starts at address %d\n", result);
  136. ++vars;
  137. }
  138. } else {
  139. printf("The requested number of bytes must be at least 1\n");
  140. }
  141.  
  142. } else if (cmd == 'p'){
  143. printmemory(memory, startfree, startused);
  144. } /*else if (cmd = 'v') {
  145.  
  146. } else if (cmd = 'f') {
  147.  
  148. } else if (cmd = 'g') {
  149.  
  150. } else if (cmd = 'e') {
  151.  
  152. }*/ else {
  153. printf("Invalid command '%c'\n", cmd);
  154. }
  155. }
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement