var.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. #include<stdio.h>
  2. // #include "interpreter.h"
  3. var *make_var();
  4. void append_var(char *name, GWARF_value, var *);
  5. void free_var(var *);
  6. var *get_var(char *, var *);
  7. void del_var(char *, var *);
  8. default_var *make_default_var();
  9. default_var *make_default_var_base();
  10. void append_default_var_base(char * ,int , default_var *);
  11. int get_default(char *, default_var *);
  12. var_list *make_var_list();
  13. var_list *make_var_base(var *);
  14. var_list *append_var_list(var *, var_list *);
  15. var_list *append_by_var_list(var_list *, var_list *);
  16. var_list *free_var_list(var_list *);
  17. int get_var_list_len(var_list *);
  18. var *find_var(var_list *,int , char *);
  19. void add_var(var_list *,int , char *, GWARF_value);
  20. var_list *copy_var_list(var_list *);
  21. var *make_var(){ // make var with base
  22. var *tmp;
  23. tmp = malloc(sizeof(var)); // get an address for base var
  24. tmp->name = ""; // can't get the name for the real var
  25. tmp->next = NULL;
  26. return tmp;
  27. }
  28. void append_var(char *name, GWARF_value value, var *base_var){
  29. int break_ = 1; // get var[2] or not[1]
  30. var *tmp = base_var; // iter var
  31. while(1){
  32. if (!strcmp(tmp->name, name)){
  33. break_ = 2;
  34. break;
  35. }
  36. if (tmp->next == NULL){ // not var name *name
  37. break_ = 1;
  38. break;
  39. }
  40. tmp = tmp->next; // get the next to iter
  41. }
  42. if(break_ == 2){
  43. tmp->value = value;
  44. return;
  45. }
  46. var *new_tmp = make_var();
  47. tmp->next = new_tmp;
  48. new_tmp->name = malloc(sizeof(name));
  49. strcpy(new_tmp->name, name);
  50. new_tmp->value = value;
  51. }
  52. void free_var(var *base_var){ // free the address
  53. var *tmp = base_var; // iter var
  54. while(1){
  55. if (tmp->next == NULL){ // the last
  56. free(tmp);
  57. break;
  58. }
  59. var *tmp_2 = tmp;
  60. tmp = tmp->next;
  61. free(tmp_2);
  62. }
  63. }
  64. var *get_var(char *name, var *base_var){ // get the address
  65. var *tmp = base_var; // iter var
  66. while(1){
  67. if (!strcmp(tmp->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
  68. return tmp;
  69. }
  70. if (tmp->next == NULL){ // not var name *name
  71. return NULL;
  72. }
  73. tmp = tmp->next; // get the next to iter
  74. }
  75. }
  76. void del_var(char *name, var *base_var){ // free an address
  77. var *tmp = base_var, *last_tmp=NULL; // iter var
  78. while(1){
  79. if (tmp->name == name){
  80. if(last_tmp != NULL){
  81. last_tmp->next = tmp->next; // if tmp->next is NULL last_tmp->next is NULL too
  82. }
  83. free(tmp);
  84. return;
  85. }
  86. if (tmp->next == NULL){ // not var name *name
  87. return;
  88. }
  89. tmp = tmp->next; // get the next to iter
  90. last_tmp = tmp;
  91. }
  92. }
  93. // --------------default_var
  94. default_var *make_default_var(){ // make_default_var
  95. default_var *tmp;
  96. tmp = malloc(sizeof(default_var)); // get an address for default_var
  97. tmp->next = NULL;
  98. return tmp;
  99. }
  100. default_var *make_default_var_base(){ // if
  101. default_var *tmp = make_default_var();
  102. tmp->name = "";
  103. tmp->from = 0;
  104. return tmp;
  105. }
  106. void append_default_var_base(char *name ,int from, default_var *base_default_var){ // elif
  107. default_var *start = base_default_var;
  108. while(1){
  109. if (!strcmp(start->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
  110. return; // 不可以二次设置
  111. }
  112. if (start->next == NULL){ // not var name *name
  113. break;
  114. }
  115. start = start->next; // get the next to iter
  116. }
  117. default_var *tmp = make_default_var();
  118. tmp->name = name;
  119. tmp->from = from;
  120. start->next = tmp;
  121. return;
  122. }
  123. int get_default(char *name, default_var *base_default_var){ // get the address
  124. default_var *tmp = base_default_var; // iter var
  125. if(tmp == NULL){
  126. return 0;
  127. }
  128. while(1){
  129. if (!strcmp(tmp->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
  130. return tmp->from;
  131. }
  132. if (tmp->next == NULL){ // not var name *name
  133. return 0;
  134. }
  135. tmp = tmp->next; // get the next to iter
  136. }
  137. }
  138. var_list *make_var_list(){ // make a empty var_list node
  139. var_list *tmp;
  140. tmp = malloc(sizeof(var_list)); // get an address for base var
  141. tmp->next = NULL;
  142. tmp->var_base = NULL;
  143. tmp->default_list = make_default_var_base();
  144. return tmp;
  145. }
  146. var_list *make_var_base(var *gloabl_var){ // make the base for global_var
  147. var_list *tmp = make_var_list();
  148. tmp->var_base = gloabl_var;
  149. return tmp;
  150. }
  151. var_list *append_var_list(var *var_base, var_list *var_list_base){ // make var_list[FILO]
  152. var_list *tmp = make_var_list();
  153. tmp->var_base = var_base;
  154. tmp->next = var_list_base;
  155. return tmp;
  156. }
  157. var_list *append_by_var_list(var_list *back_var_list, var_list *var_list_base){ // 拼凑两个var_list
  158. var_list *start = back_var_list;
  159. while(1){
  160. if(start->next == NULL){ // to the last
  161. break;
  162. }
  163. start = start->next;
  164. }
  165. start->next = var_list_base;
  166. return back_var_list;
  167. }
  168. var_list *free_var_list(var_list *var_list_base){ // free one var_list[FILO]
  169. var_list *tmp = var_list_base->next;
  170. if(tmp==NULL){
  171. return var_list_base;
  172. }
  173. free(var_list_base);
  174. return tmp;
  175. }
  176. int get_var_list_len(var_list *var_base){
  177. var_list *start = var_base;
  178. int tmp = 0;
  179. while(1){
  180. if(start->next == NULL){
  181. break;
  182. }
  183. start = start->next;
  184. tmp += 1;
  185. }
  186. return tmp;
  187. }
  188. var *find_var(var_list *var_base,int from, char *name){ // find var by func get_var in var_list[iter to find]
  189. var_list *start = var_base;
  190. var *return_var;
  191. from += get_default(name, var_base->default_list);
  192. for(int i = 0;i < from;i+= 1){
  193. if(start->next == NULL){
  194. break;
  195. }
  196. start = start->next;
  197. }
  198. // printf("name = %s, from = %d, address = %x\n", name, from, start->var_base);
  199. while (1)
  200. {
  201. return_var = get_var(name, start->var_base);
  202. if((return_var == NULL) && (start->next == NULL)){ // don't get the var and not next
  203. return NULL;
  204. }
  205. else if((return_var == NULL) && (start->next != NULL)){ // don't get the var but can next
  206. start = start->next;
  207. continue;
  208. }
  209. // printf("find on name = %s, from = %d, address = %x\n", name, from, start->var_base);
  210. return return_var; //get var success can or can't next
  211. }
  212. }
  213. void add_var(var_list *var_base,int from, char *name, GWARF_value value){ // add var by func append_var in var_list[iter to find]
  214. var_list *start = var_base;
  215. var *return_var;
  216. from += get_default(name, var_base->default_list);
  217. for(int i = 0;i < from;i+= 1){
  218. if(start->next == NULL){
  219. break;
  220. }
  221. start = start->next;
  222. }
  223. // printf("----var add address = %d----\n", start);
  224. append_var(name, value, start->var_base);
  225. }
  226. var_list *copy_var_list(var_list *var_list_base){ // 复制一条var链到另一个内存地址上[base不复制]
  227. var_list *start = malloc(sizeof(var_list_base)), *tmp;
  228. memcpy(start, var_list_base, sizeof(var_list_base)); // 复制base节点
  229. tmp = start; // 记录base节点
  230. while(1){ // 复制var_list链
  231. if((start == NULL) || (start->next == NULL)){
  232. break;
  233. }
  234. puts("F1");
  235. var_list *next_tmp = malloc(sizeof(start->next));
  236. memcpy(next_tmp, start->next, sizeof(start->next)); // 复制到新的地方
  237. start->next = next_tmp; // 应用新的地方
  238. start = start->next;
  239. }
  240. return tmp;
  241. }