var.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. #include "__virtualmath.h"
  2. Var *makeVar(wchar_t *name, LinkValue *value, LinkValue *name_, Inter *inter) {
  3. Var *list_tmp = inter->base_var;
  4. Var *tmp;
  5. tmp = memCalloc(1, sizeof(Var));
  6. setGC(&tmp->gc_status);
  7. tmp->name = memWidecpy(name);
  8. tmp->value = copyLinkValue(value, inter);
  9. tmp->name_ = copyLinkValue(name_, inter);
  10. tmp->next = NULL;
  11. tmp->gc_next = NULL;
  12. tmp->gc_last = NULL;
  13. if (list_tmp == NULL){
  14. inter->base_var = tmp;
  15. tmp->gc_last = NULL;
  16. goto return_;
  17. }
  18. for (PASS; list_tmp->gc_next != NULL; list_tmp = list_tmp->gc_next)
  19. PASS;
  20. list_tmp->gc_next = tmp;
  21. tmp->gc_last = list_tmp;
  22. return_:
  23. return tmp;
  24. }
  25. void freeVar(Var **var) {
  26. Var *free_value = *var;
  27. FREE_BASE(free_value, return_);
  28. memFree(free_value->name);
  29. if ((*var)->gc_next != NULL)
  30. (*var)->gc_next->gc_last = (*var)->gc_last;
  31. *var = (*var)->gc_next;
  32. memFree(free_value);
  33. return_: return;
  34. }
  35. HashTable *makeHashTable(Inter *inter) {
  36. HashTable *list_tmp = inter->hash_base;
  37. HashTable *tmp;
  38. tmp = memCalloc(1, sizeof(Value));
  39. tmp->hashtable = (Var **)calloc(MAX_SIZE, sizeof(Var *));
  40. setGC(&tmp->gc_status);
  41. tmp->gc_next = NULL;
  42. tmp->gc_last = NULL;
  43. if (list_tmp == NULL){
  44. inter->hash_base = tmp;
  45. tmp->gc_last = NULL;
  46. goto return_;
  47. }
  48. for (PASS; list_tmp->gc_next != NULL; list_tmp = list_tmp->gc_next)
  49. PASS;
  50. list_tmp->gc_next = tmp;
  51. tmp->gc_last = list_tmp;
  52. return_:
  53. return tmp;
  54. }
  55. void freeHashTable(HashTable **value) {
  56. HashTable *free_value = *value;
  57. FREE_BASE(free_value, return_);
  58. memFree(free_value->hashtable);
  59. if ((*value)->gc_next != NULL)
  60. (*value)->gc_next->gc_last = (*value)->gc_last;
  61. *value = (*value)->gc_next;
  62. memFree(free_value);
  63. return_: return;
  64. }
  65. VarList *makeVarList(Inter *inter, bool make_hash) {
  66. VarList *tmp = calloc(1, sizeof(VarList));
  67. tmp->next = NULL;
  68. if (make_hash)
  69. tmp->hashtable = makeHashTable(inter);
  70. else
  71. tmp->hashtable = NULL;
  72. tmp->default_var = NULL;
  73. return tmp;
  74. }
  75. VarList *freeVarList(VarList *vl) {
  76. VarList *next_var = NULL;
  77. FREE_BASE(vl, return_);
  78. next_var = vl->next;
  79. for (PASS; vl->default_var != NULL; vl->default_var = freeDefaultVar(vl->default_var))
  80. PASS;
  81. memFree(vl);
  82. return_:
  83. return next_var;
  84. }
  85. DefaultVar *makeDefaultVar(wchar_t *name, vnum times) {
  86. DefaultVar *tmp;
  87. tmp = memCalloc(1, sizeof(DefaultVar));
  88. tmp->name = memWidecpy(name);
  89. tmp->times = times;
  90. tmp->next = NULL;
  91. return tmp;
  92. }
  93. DefaultVar *freeDefaultVar(DefaultVar *dv) {
  94. DefaultVar *next = dv->next;
  95. memFree(dv->name);
  96. memFree(dv);
  97. return next;
  98. }
  99. DefaultVar *connectDefaultVar(DefaultVar *base, wchar_t *name, vnum times) {
  100. for (DefaultVar **tmp = &base; PASS; tmp = &(*tmp)->next){
  101. if (*tmp == NULL){
  102. *tmp = makeDefaultVar(name, times);
  103. break;
  104. }
  105. if (eqWide((*tmp)->name, name)){
  106. (*tmp)->times = times;
  107. break;
  108. }
  109. }
  110. return base;
  111. }
  112. vnum findDefault(DefaultVar *base, wchar_t *name) {
  113. for (DefaultVar **tmp = &base; *tmp != NULL; tmp = &(*tmp)->next)
  114. if (eqWide((*tmp)->name, name))
  115. return (*tmp)->times;
  116. return 0;
  117. }
  118. /**
  119. * hashTable使用time33算法
  120. * @param key
  121. * @return
  122. */
  123. vhashn time33(wchar_t *key){ // hash V_func
  124. vhashn hash = 5381;
  125. while(*key)
  126. hash += (hash << (vhashn)5) + (*key++);
  127. return (hash & (vhashn)0x7FFFFFFF) % MAX_SIZE;
  128. }
  129. static void addVarCore(Var **base, wchar_t *name, LinkValue *value, LinkValue *name_, Inter *inter) {
  130. for (PASS; true; base = &(*base)->next) {
  131. if (*base == NULL) {
  132. *base = makeVar(name, value, name_, inter);
  133. break;
  134. } else if (eqWide((*base)->name, name)) {
  135. (*base)->value->value = value->value;
  136. (*base)->value->belong = value->belong;
  137. break;
  138. }
  139. }
  140. }
  141. void addVar(wchar_t *name, LinkValue *value, LinkValue *name_, Inter *inter, HashTable *ht) {
  142. vhashn index = time33(name);
  143. addVarCore(&ht->hashtable[index], name, value, name_, inter);
  144. }
  145. void updateHashTable(HashTable *update, HashTable *new, Inter *inter) {
  146. for (int i = 0; i < MAX_SIZE; i++)
  147. for (Var *tmp = new->hashtable[i]; tmp != NULL; tmp = tmp->next)
  148. addVarCore(&update->hashtable[i], tmp->name, tmp->value, tmp->name_, inter);
  149. }
  150. LinkValue *findVar(wchar_t *name, VarOperation operating, Inter *inter, HashTable *ht) {
  151. LinkValue *tmp = NULL;
  152. vhashn index = time33(name);
  153. for (Var **base = &ht->hashtable[index]; *base != NULL; base = &(*base)->next){
  154. if (eqWide((*base)->name, name)){
  155. tmp = (*base)->value;
  156. if (operating == del_var) {
  157. Var *next = (*base)->next;
  158. (*base)->next = NULL;
  159. *base = next;
  160. }
  161. goto return_;
  162. }
  163. }
  164. return_: return operating == get_var ? copyLinkValue(tmp, inter) : tmp;
  165. }
  166. /**
  167. * @param name
  168. * @param times
  169. * @param operating read_var-不复制读取 get_var-复制读取 del_var-删除且返回(不复制)
  170. * @param inter
  171. * @param var_list
  172. * @return
  173. */
  174. LinkValue *findFromVarList(wchar_t *name, vnum times, VarOperation operating, INTER_FUNCTIONSIG_CORE) {
  175. LinkValue *tmp = NULL;
  176. vnum base = findDefault(var_list->default_var, name) + times;
  177. for (vnum i = 0; i < base && var_list->next != NULL; i++)
  178. var_list = var_list->next;
  179. if (operating == del_var && var_list != NULL)
  180. tmp = findVar(name, del_var, inter, var_list->hashtable);
  181. else
  182. for (PASS; var_list != NULL && tmp == NULL; var_list = var_list->next)
  183. tmp = findVar(name, operating, inter, var_list->hashtable);
  184. return tmp;
  185. }
  186. void addFromVarList(wchar_t *name, LinkValue *name_, vnum times, LinkValue *value, INTER_FUNCTIONSIG_CORE) {
  187. vnum base = findDefault(var_list->default_var, name) + times;
  188. for (vnum i = 0; i < base && var_list->next != NULL; i++)
  189. var_list = var_list->next;
  190. addVar(name, value, name_, inter, var_list->hashtable);
  191. }
  192. VarList *pushVarList(VarList *base, Inter *inter){
  193. VarList *new = makeVarList(inter, true);
  194. new->next = base;
  195. return new;
  196. }
  197. VarList *popVarList(VarList *base) {
  198. if (base->next == NULL)
  199. return base;
  200. return freeVarList(base);
  201. }
  202. VarList *copyVarListCore(VarList *base, Inter *inter){
  203. VarList *tmp = makeVarList(inter, false);
  204. tmp->hashtable = base->hashtable;
  205. return tmp;
  206. }
  207. VarList *copyVarList(VarList *base, bool n_new, Inter *inter){
  208. VarList *new = NULL;
  209. VarList **tmp = &new;
  210. for (int i=0; base != NULL; tmp = &(*tmp)->next, base = base->next,i++)
  211. *tmp = copyVarListCore(base, inter);
  212. if (n_new)
  213. return pushVarList(new, inter);
  214. return new;
  215. }
  216. VarList *connectVarListBack(VarList *base, VarList *back){
  217. VarList **tmp = NULL;
  218. for (tmp = &base; *tmp != NULL; tmp = &(*tmp)->next)
  219. PASS;
  220. *tmp = back;
  221. return base;
  222. }
  223. bool comparVarList(VarList *dest, VarList *src) {
  224. for (PASS; src != NULL; src = src->next)
  225. if (src->hashtable == dest->hashtable)
  226. return true;
  227. return false;
  228. }
  229. VarList *makeObjectVarList(Inherit *value, Inter *inter, VarList *base) {
  230. VarList *tmp = base == NULL ? makeVarList(inter, true) : base;
  231. for (PASS; value != NULL; value = value->next) {
  232. VarList *new = copyVarList(value->value->value->object.var, false, inter);
  233. tmp = connectVarListBack(tmp, new);
  234. }
  235. return tmp;
  236. }