var.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. #include<stdio.h>
  2. #include "interpreter.h"
  3. // --------------var[存储在hash_var节点上]
  4. var *make_var(){ // make var with base
  5. var *tmp;
  6. tmp = malloc(sizeof(var)); // get an address for base var
  7. tmp->name = ""; // can't get the name for the real var
  8. tmp->next = NULL;
  9. tmp->lock = auto_public;
  10. return tmp;
  11. }
  12. void append_var(char *name, GWARF_value value, var *base_var, int lock){ // lock本质为var token
  13. if(lock == auto_public){
  14. lock = public; // 使用自动权限
  15. }
  16. int break_ = 1; // get var[2] or not[1]
  17. var *tmp = base_var; // iter var
  18. while(1){
  19. if (!strcmp(tmp->name, name)){
  20. break_ = 2;
  21. break;
  22. }
  23. if (tmp->next == NULL){ // not var name *name
  24. break_ = 1;
  25. break;
  26. }
  27. tmp = tmp->next; // get the next to iter
  28. }
  29. if(break_ == 2){
  30. if(tmp->lock == lock || tmp->lock == public || (tmp->lock == protect && lock == private)){ // 检查是否具有修改的权限
  31. tmp->value = value;
  32. if(lock != auto_public){ // 检查是否可以改变权限
  33. tmp->lock = lock;
  34. }
  35. }
  36. return;
  37. }
  38. var *new_tmp = make_var();
  39. tmp->next = new_tmp;
  40. new_tmp->lock = lock;
  41. new_tmp->name = malloc(sizeof(name));
  42. strcpy(new_tmp->name, name);
  43. new_tmp->value = value;
  44. }
  45. void free_var(var *base_var){ // free the address
  46. var *tmp = base_var; // iter var
  47. while(1){
  48. if (tmp->next == NULL){ // the last
  49. free(tmp);
  50. break;
  51. }
  52. var *tmp_2 = tmp;
  53. tmp = tmp->next;
  54. free(tmp_2);
  55. }
  56. }
  57. var *get_var(char *name, var *base_var){ // get the address
  58. var *tmp = base_var; // iter var
  59. while(1){
  60. if (!strcmp(tmp->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
  61. return tmp;
  62. }
  63. if (tmp->next == NULL){ // not var name *name
  64. return NULL;
  65. }
  66. tmp = tmp->next; // get the next to iter
  67. }
  68. }
  69. void del_var(char *name, var *base_var){ // free an address
  70. var *tmp = base_var, *last_tmp=NULL; // iter var
  71. while(1){
  72. if (!strcmp(tmp->name, name)){
  73. if(last_tmp != NULL){
  74. last_tmp->next = tmp->next; // if tmp->next is NULL last_tmp->next is NULL too
  75. }
  76. free(tmp);
  77. return;
  78. }
  79. if (tmp->next == NULL){ // not var name *name
  80. return;
  81. }
  82. last_tmp = tmp;
  83. tmp = tmp->next; // get the next to iter
  84. }
  85. }
  86. // --------------hash_var[存储在var_list节点上]
  87. hash_var *make_hash_var(){ // 生成并初始化
  88. hash_var *tmp = NULL;
  89. tmp = malloc(sizeof(hash_var));
  90. tmp->hash = malloc((size_t)(sizeof(var) * MAX_SIZE));
  91. for(int i = 0; i < MAX_SIZE; i++){
  92. tmp->hash[i] = NULL; // 初始化
  93. }
  94. return tmp;
  95. }
  96. unsigned int time33(char *key){
  97. unsigned int hash = 5381;
  98. while(*key){
  99. hash += (hash << 5 ) + (*key++);
  100. }
  101. return (hash & 0x7FFFFFFF) % MAX_SIZE;
  102. }
  103. int login_node(char *name, GWARF_value value, hash_var *the_hash_var, int lock){
  104. unsigned int index = time33(name);
  105. var *base_node = the_hash_var->hash[index]; // 根据下标拿base节点
  106. if(base_node == NULL){ // 生成基本节点
  107. the_hash_var->hash[index] = make_var();
  108. base_node = the_hash_var->hash[index];
  109. }
  110. append_var(name, value, base_node, lock);
  111. return 0;
  112. }
  113. var *find_node(char *name, hash_var *the_hash_var){
  114. if(the_hash_var == NULL){
  115. return NULL;
  116. }
  117. unsigned int index = time33(name);
  118. var *base_node = the_hash_var->hash[index]; // 根据下标拿base节点
  119. if(base_node == NULL){ // 没有节点
  120. return NULL;
  121. }
  122. return get_var(name, base_node);
  123. }
  124. void del_var_node(char *name, hash_var *the_hash_var){ // 删除某个var
  125. if(the_hash_var == NULL){
  126. return;
  127. }
  128. unsigned int index = time33(name);
  129. var *base_node = the_hash_var->hash[index]; // 根据下标拿base节点
  130. if(base_node == NULL){ // 没有节点
  131. return;
  132. }
  133. del_var(name, base_node);
  134. }
  135. // --------------default_var[存储在var_list节点上]
  136. // TODO:: default_var也应该删除对应的var
  137. default_var *make_default_var(){ // make_default_var
  138. default_var *tmp;
  139. tmp = malloc(sizeof(default_var)); // get an address for default_var
  140. tmp->next = NULL;
  141. return tmp;
  142. }
  143. default_var *make_default_var_base(){ // if
  144. default_var *tmp = make_default_var();
  145. tmp->name = "";
  146. tmp->from = 0;
  147. return tmp;
  148. }
  149. void append_default_var_base(char *name ,int from, default_var *base_default_var){ // elif
  150. default_var *start = base_default_var;
  151. while(1){
  152. if (!strcmp(start->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
  153. return; // 不可以二次设置
  154. }
  155. if (start->next == NULL){ // not var name *name
  156. break;
  157. }
  158. start = start->next; // get the next to iter
  159. }
  160. default_var *tmp = make_default_var();
  161. tmp->name = name;
  162. tmp->from = from;
  163. start->next = tmp;
  164. return;
  165. }
  166. int get_default(char *name, default_var *base_default_var){ // get the address
  167. default_var *tmp = base_default_var; // iter var
  168. if(tmp == NULL){
  169. return 0;
  170. }
  171. while(1){
  172. if (!strcmp(tmp->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
  173. return tmp->from;
  174. }
  175. if (tmp->next == NULL){ // not var name *name
  176. return 0;
  177. }
  178. tmp = tmp->next; // get the next to iter
  179. }
  180. }
  181. // --------------var_list[保存default_var和hash_var]
  182. var_list *make_var_list(){ // make a empty var_list node
  183. var_list *tmp;
  184. tmp = malloc(sizeof(var_list)); // get an address for base var
  185. tmp->next = NULL;
  186. tmp->hash_var_base = NULL;
  187. tmp->tag = run_func;
  188. tmp->default_list = make_default_var_base();
  189. return tmp;
  190. }
  191. var_list *make_var_base(hash_var *global_hash_var){ // make the base for global_var
  192. var_list *tmp = make_var_list();
  193. tmp->hash_var_base = global_hash_var;
  194. return tmp;
  195. }
  196. var_list *append_var_list(hash_var *global_hash_var, var_list *var_list_base){ // make var_list[FILO]
  197. var_list *tmp = make_var_list();
  198. tmp->hash_var_base = global_hash_var;
  199. tmp->next = var_list_base;
  200. return tmp;
  201. }
  202. var_list *append_by_var_list(var_list *back_var_list, var_list *var_list_base){ // 拼凑两个var_list
  203. var_list *start = back_var_list;
  204. while(1){
  205. if(start->next == NULL){ // to the last
  206. break;
  207. }
  208. start = start->next;
  209. }
  210. start->next = var_list_base;
  211. return back_var_list;
  212. }
  213. var_list *free_var_list(var_list *var_list_base){ // free one var_list[FILO]
  214. var_list *tmp = var_list_base->next;
  215. if(tmp==NULL){
  216. return var_list_base;
  217. }
  218. free(var_list_base);
  219. return tmp;
  220. }
  221. int get_var_list_len(var_list *var_base){
  222. var_list *start = var_base;
  223. int tmp = 0;
  224. while(1){
  225. if(start->next == NULL){
  226. break;
  227. }
  228. start = start->next;
  229. tmp += 1;
  230. }
  231. return tmp;
  232. }
  233. var *find_var(var_list *var_base, int from, char *name, int *index){ // index表示层数
  234. var_list *start = var_base;
  235. var *return_var;
  236. from += get_default(name, var_base->default_list);
  237. for(int i = 0;i < from;i+= 1){
  238. if(start->next == NULL){
  239. break;
  240. }
  241. start = start->next;
  242. }
  243. if(index != NULL){
  244. *index = from;
  245. }
  246. while (1)
  247. {
  248. return_var = find_node(name, start->hash_var_base);
  249. if((return_var == NULL) && (start->next == NULL)){ // don't get the var and not next
  250. return NULL;
  251. }
  252. else if((return_var == NULL) && (start->next != NULL)){ // don't get the var but can next
  253. start = start->next;
  254. if(index != NULL){
  255. *index += 1;
  256. }
  257. continue;
  258. }
  259. return return_var; //get var success can or can't next
  260. }
  261. }
  262. void add_var(var_list *var_base,int from, char *name, GWARF_value value, int lock){ // add var by func append_var in var_list[iter to find]
  263. var_list *start = var_base;
  264. var *return_var;
  265. from += get_default(name, var_base->default_list);
  266. for(int i = 0;i < from;i+= 1){
  267. if(start->next == NULL){
  268. break;
  269. }
  270. start = start->next;
  271. }
  272. login_node(name, value, start->hash_var_base, lock);
  273. }
  274. void del_var_var_list(var_list *var_base,int from, char *name){
  275. var_list *start = var_base;
  276. var *return_var;
  277. from += get_default(name, var_base->default_list);
  278. for(int i = 0;i < from;i+= 1){
  279. if(start->next == NULL){
  280. break;
  281. }
  282. start = start->next;
  283. }
  284. del_var_node(name, start->hash_var_base);
  285. }
  286. var_list *copy_var_list(var_list *var_list_base){ // 复制一条var链到另一个内存地址上[base不复制]
  287. var_list *start = malloc(sizeof(var_list_base)), *tmp;
  288. memcpy(start, var_list_base, sizeof(var_list_base)); // 复制base节点
  289. tmp = start; // 记录base节点
  290. while(1){ // 复制var_list链
  291. if(var_list_base == NULL){ // 已经匹配到了最后一个
  292. break;
  293. }
  294. var_list *next_tmp = malloc(sizeof(var_list_base));
  295. memcpy(next_tmp, var_list_base, sizeof(var_list_base)); // 复制到新的地方
  296. start->next = next_tmp; // 应用新的地方
  297. start = start->next;
  298. var_list_base = var_list_base->next;
  299. }
  300. return tmp;
  301. }