var.c 6.9 KB

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