var.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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, vint 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, vint 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. vint 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 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. enum ValueAuthority aut = (*base)->value->aut;
  136. (*base)->value = copyLinkValue(value, inter);
  137. switch (aut) {
  138. default:
  139. case public_aut:
  140. case auto_aut:
  141. break;
  142. case protect_aut:
  143. if (value->aut != private_aut)
  144. (*base)->value->aut = protect_aut;
  145. break;
  146. case private_aut:
  147. (*base)->value->aut = private_aut;
  148. break;
  149. }
  150. break;
  151. }
  152. }
  153. }
  154. void addVar(wchar_t *name, LinkValue *value, LinkValue *name_, Inter *inter, HashTable *ht) {
  155. vhashn index = time33(name);
  156. addVarCore(&ht->hashtable[index], name, value, name_, inter);
  157. }
  158. void updateHashTable(HashTable *update, HashTable *new, Inter *inter) {
  159. for (int i = 0; i < MAX_SIZE; i++)
  160. for (Var *tmp = new->hashtable[i]; tmp != NULL; tmp = tmp->next)
  161. addVarCore(&update->hashtable[i], tmp->name, tmp->value, tmp->name_, inter);
  162. }
  163. LinkValue *findVar(wchar_t *name, VarOperation operating, Inter *inter, HashTable *ht) {
  164. LinkValue *tmp = NULL;
  165. vhashn index = time33(name);
  166. for (Var **base = &ht->hashtable[index]; *base != NULL; base = &(*base)->next){
  167. if (eqWide((*base)->name, name)){
  168. tmp = (*base)->value;
  169. if (operating == del_var) {
  170. Var *next = (*base)->next;
  171. (*base)->next = NULL;
  172. *base = next;
  173. }
  174. goto return_;
  175. }
  176. }
  177. return_: return operating == get_var ? copyLinkValue(tmp, inter) : tmp;
  178. }
  179. /**
  180. * @param name
  181. * @param times
  182. * @param operating read_var-不复制读取 get_var-复制读取 del_var-删除且返回(不复制)
  183. * @param inter
  184. * @param var_list
  185. * @return
  186. */
  187. LinkValue *findFromVarList(wchar_t *name, vint times, VarOperation operating, FUNC_CORE) {
  188. LinkValue *tmp = NULL;
  189. vint base = findDefault(var_list->default_var, name) + times;
  190. for (vint i = 0; i < base && var_list->next != NULL; i++)
  191. var_list = var_list->next;
  192. if (operating == del_var && var_list != NULL)
  193. tmp = findVar(name, del_var, inter, var_list->hashtable);
  194. else {
  195. for (PASS; var_list != NULL && tmp == NULL; var_list = var_list->next)
  196. tmp = findVar(name, operating, inter, var_list->hashtable);
  197. }
  198. return tmp;
  199. }
  200. void addFromVarList(wchar_t *name, LinkValue *name_, vint times, LinkValue *value, FUNC_CORE) {
  201. vint base = findDefault(var_list->default_var, name) + times;
  202. for (vint i = 0; i < base && var_list->next != NULL; i++)
  203. var_list = var_list->next;
  204. addVar(name, value, name_, inter, var_list->hashtable);
  205. }
  206. VarList *pushVarList(VarList *base, Inter *inter){
  207. VarList *new = makeVarList(inter, true);
  208. new->next = base;
  209. return new;
  210. }
  211. VarList *popVarList(VarList *base) {
  212. if (base->next == NULL)
  213. return base;
  214. return freeVarList(base);
  215. }
  216. VarList *copyVarListCore(VarList *base, Inter *inter){
  217. VarList *tmp = makeVarList(inter, false);
  218. tmp->hashtable = base->hashtable;
  219. return tmp;
  220. }
  221. VarList *copyVarList(VarList *base, bool n_new, Inter *inter){
  222. VarList *new = NULL;
  223. VarList **tmp = &new;
  224. for (int i=0; base != NULL; tmp = &(*tmp)->next, base = base->next,i++)
  225. *tmp = copyVarListCore(base, inter);
  226. if (n_new)
  227. return pushVarList(new, inter);
  228. return new;
  229. }
  230. VarList *connectVarListBack(VarList *base, VarList *back){
  231. VarList **tmp = NULL;
  232. for (tmp = &base; *tmp != NULL; tmp = &(*tmp)->next)
  233. PASS;
  234. *tmp = back;
  235. return base;
  236. }
  237. bool comparVarList(VarList *dest, VarList *src) {
  238. for (PASS; src != NULL; src = src->next)
  239. if (src->hashtable == dest->hashtable)
  240. return true;
  241. return false;
  242. }
  243. VarList *makeObjectVarList(Inherit *value, Inter *inter, VarList *base) {
  244. VarList *tmp = base == NULL ? makeVarList(inter, true) : base;
  245. for (PASS; value != NULL; value = value->next) {
  246. VarList *new = copyVarList(value->value->value->object.var, false, inter);
  247. tmp = connectVarListBack(tmp, new);
  248. }
  249. return tmp;
  250. }