value.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. #include "__virtualmath.h"
  2. Value *makeValue(Inter *inter) {
  3. Value *tmp, *list_tmp = inter->base;
  4. tmp = memCalloc(1, sizeof(Value));
  5. tmp->type = none;
  6. setGC(&tmp->gc_status);
  7. tmp->next = NULL;
  8. if (list_tmp == NULL){
  9. inter->base = tmp;
  10. tmp->last = NULL;
  11. goto return_;
  12. }
  13. for (PASS; list_tmp->next != NULL; list_tmp = list_tmp->next)
  14. PASS;
  15. list_tmp->next = tmp;
  16. tmp->last = list_tmp;
  17. return_:
  18. return tmp;
  19. }
  20. Value *makeNumberValue(NUMBER_TYPE num, Inter *inter) {
  21. Value *tmp;
  22. tmp = makeValue(inter);
  23. tmp->type = number;
  24. tmp->data.num.num = num;
  25. return tmp;
  26. }
  27. Value *makeStringValue(char *str, Inter *inter) {
  28. Value *tmp;
  29. tmp = makeValue(inter);
  30. tmp->type = string;
  31. tmp->data.str.str = memStrcpy(str);
  32. return tmp;
  33. }
  34. Value *makeFunctionValue(Statement *st, Parameter *pt, VarList *var_list, Inter *inter) {
  35. Value *tmp;
  36. tmp = makeValue(inter);
  37. tmp->type = function;
  38. tmp->data.function.function = copyStatement(st);
  39. tmp->data.function.pt = copyParameter(pt);
  40. tmp->data.function.var = copyVarList(var_list, false, inter);
  41. return tmp;
  42. }
  43. Value *makeListValue(Argument **arg_ad, Inter *inter, enum ListType type) {
  44. Value *tmp;
  45. Argument *at = *arg_ad;
  46. tmp = makeValue(inter);
  47. tmp->type = list;
  48. tmp->data.list.type = type;
  49. tmp->data.list.list = NULL;
  50. tmp->data.list.size = 0;
  51. for (PASS; at != NULL && at->type == value_arg; at = at->next) {
  52. tmp->data.list.size++;
  53. tmp->data.list.list = memRealloc(tmp->data.list.list, tmp->data.list.size * sizeof(LinkValue *));
  54. tmp->data.list.list[tmp->data.list.size - 1] = at->data.value;
  55. }
  56. *arg_ad = at;
  57. return tmp;
  58. }
  59. Value *makeDictValue(Argument **arg_ad, bool new_hash, Result *result, Inter *inter, VarList *var_list) {
  60. Value *tmp;
  61. tmp = makeValue(inter);
  62. tmp->data.dict.size = 0;
  63. tmp->type = dict;
  64. if (new_hash) {
  65. VarList *hash = pushVarList(var_list, inter);
  66. gcAddTmp(&tmp->gc_status);
  67. tmp->data.dict.dict = hash->hashtable;
  68. freeResult(result);
  69. argumentToVar(arg_ad, &tmp->data.dict.size, CALL_INTER_FUNCTIONSIG_NOT_ST(hash, result));
  70. popVarList(hash);
  71. gcFreeTmpLink(&tmp->gc_status);
  72. }
  73. else
  74. tmp->data.dict.dict = NULL;
  75. return tmp;
  76. }
  77. Value *freeValue(Value *value, Inter *inter){
  78. Value *return_value = NULL;
  79. freeBase(value, return_);
  80. return_value = value->next;
  81. if (value->last == NULL)
  82. inter->base = value->next;
  83. else
  84. value->last->next = value->next;
  85. if (value->next != NULL)
  86. value->next->last = value->last;
  87. switch (value->type) {
  88. case string:
  89. memFree(value->data.str.str);
  90. break;
  91. case function: {
  92. VarList *tmp = value->data.function.var;
  93. freeParameter(value->data.function.pt, true);
  94. freeStatement(value->data.function.function);
  95. while (tmp != NULL)
  96. tmp = freeVarList(tmp, true);
  97. break;
  98. }
  99. case list:
  100. memFree(value->data.list.list);
  101. break;
  102. default:
  103. break;
  104. }
  105. memFree(value);
  106. return_:
  107. return return_value;
  108. }
  109. LinkValue *makeLinkValue(Value *value, LinkValue *linkValue, Inter *inter){
  110. LinkValue *tmp;
  111. LinkValue *list_tmp = inter->link_base;
  112. tmp = memCalloc(1, sizeof(Value));
  113. setGC(&tmp->gc_status);
  114. tmp->father = linkValue;
  115. tmp->value = value;
  116. if (list_tmp == NULL){
  117. inter->link_base = tmp;
  118. tmp->last = NULL;
  119. goto return_;
  120. }
  121. for (PASS; list_tmp->next != NULL; list_tmp = list_tmp->next)
  122. PASS;
  123. list_tmp->next = tmp;
  124. tmp->last = list_tmp;
  125. return_:
  126. return tmp;
  127. }
  128. LinkValue * freeLinkValue(LinkValue *value, Inter *inter){
  129. LinkValue *return_value = NULL;
  130. freeBase(value, return_);
  131. return_value = value->next;
  132. if (value->last == NULL)
  133. inter->link_base = value->next;
  134. else
  135. value->last->next = value->next;
  136. if (value->next != NULL)
  137. value->next->last = value->last;
  138. memFree(value);
  139. return_:
  140. return return_value;
  141. }
  142. void setResultCore(Result *ru) {
  143. ru->type = not_return;
  144. ru->times = 0;
  145. ru->error = NULL;
  146. ru->value = NULL;
  147. }
  148. void setResult(Result *ru, Inter *inter) {
  149. freeResult(ru);
  150. setResultBase(ru, inter);
  151. }
  152. void setResultBase(Result *ru, Inter *inter) {
  153. setResultCore(ru);
  154. ru->value = makeLinkValue(inter->base, NULL, inter);
  155. gcAddTmp(&ru->value->gc_status);
  156. }
  157. void setResultError(Result *ru, Inter *inter, char *error_type, char *error_message, Statement *st, bool new) {
  158. if (!new && ru->type != error_return)
  159. return;
  160. if (new) {
  161. setResult(ru, inter);
  162. ru->type = error_return;
  163. }
  164. else{
  165. error_type = NULL;
  166. error_message = NULL;
  167. }
  168. ru->error = connectError(makeError(error_type, error_message, st->line, st->code_file), ru->error);
  169. }
  170. void setResultOperationNone(Result *ru, Inter *inter) {
  171. setResult(ru, inter);
  172. ru->type = operation_return;
  173. }
  174. void setResultOperation(Result *ru, LinkValue *value, Inter *inter) {
  175. freeResult(ru);
  176. setResultOperationBase(ru, value, inter);
  177. }
  178. void setResultOperationBase(Result *ru, LinkValue *value, Inter *inter) {
  179. setResultCore(ru);
  180. ru->value = value;
  181. if (value != NULL)
  182. gcAddTmp(&ru->value->gc_status);
  183. ru->type = operation_return;
  184. }
  185. void freeResult(Result *ru){
  186. freeResultSave(ru);
  187. if (ru->value != NULL) {
  188. gcFreeTmpLink(&ru->value->gc_status);
  189. ru->value = NULL;
  190. }
  191. }
  192. void freeResultSave(Result *ru){
  193. if (ru->error != NULL)
  194. freeError(ru);
  195. }
  196. void printValue(Value *value, FILE *debug){
  197. switch (value->type){
  198. case number:
  199. writeLog(debug, INFO, "%"NUMBER_FORMAT"", value->data.num.num);
  200. break;
  201. case string:
  202. writeLog(debug, INFO, "'%s'", value->data.str.str);
  203. break;
  204. case function:
  205. writeLog(debug, INFO, "function on <%p>", value);
  206. break;
  207. case list:
  208. writeLog(debug, INFO, "list on <%p> size : %d [ ", value, (int)value->data.list.size);
  209. for (int i=0;i < value->data.list.size;i++){
  210. if (i > 0)
  211. writeLog(debug, INFO, ", ", NULL);
  212. printLinkValue(value->data.list.list[i], "", "", debug);
  213. }
  214. writeLog(debug, INFO, " ]", NULL);
  215. break;
  216. case dict: {
  217. Var *tmp = NULL;
  218. bool print_comma = false;
  219. writeLog(debug, INFO, "dict on <%p> size : %d { ", value, (int) value->data.dict.size);
  220. for (int i = 0; i < MAX_SIZE; i++) {
  221. for (tmp = value->data.dict.dict->hashtable[i]; tmp != NULL; tmp = tmp->next) {
  222. if (print_comma)
  223. writeLog(debug, INFO, ", ", NULL);
  224. else
  225. print_comma = true;
  226. printLinkValue(tmp->name_, "", "", debug);
  227. writeLog(debug, INFO, " ['%s'] : ", tmp->name);
  228. printLinkValue(tmp->value, "", "", debug);
  229. }
  230. }
  231. writeLog(debug, INFO, " }", NULL);
  232. break;
  233. }
  234. case none:
  235. writeLog(debug, INFO, "<None>", NULL);
  236. break;
  237. default:
  238. writeLog(debug, INFO, "default on <%p>", value);
  239. break;
  240. }
  241. }
  242. void printLinkValue(LinkValue *value, char *first, char *last, FILE *debug){
  243. if (value == NULL)
  244. return;
  245. writeLog(debug, INFO, "%s", first);
  246. if (value->father != NULL) {
  247. printLinkValue(value->father, "", "", debug);
  248. writeLog(debug, INFO, " . ", NULL);
  249. }
  250. if (value->value != NULL)
  251. printValue(value->value, debug);
  252. writeLog(debug, INFO, "%s", last);
  253. }
  254. Error *makeError(char *type, char *message, long int line, char *file) {
  255. Error *tmp = memCalloc(1, sizeof(Error));
  256. tmp->line = line;
  257. tmp->type = memStrcpy(type);
  258. tmp->messgae = memStrcpy(message);
  259. tmp->file = memStrcpy(file);
  260. tmp->next = NULL;
  261. return tmp;
  262. }
  263. Error *connectError(Error *new, Error *base){
  264. new->next = base;
  265. return new;
  266. }
  267. void freeError(Result *base){
  268. Error *error = base->error;
  269. for (Error *next = NULL; error != NULL; error = next){
  270. next = error->next;
  271. memFree(error->messgae);
  272. memFree(error->type);
  273. memFree(error->file);
  274. memFree(error);
  275. }
  276. base->error = NULL;
  277. }
  278. void printError(Result *result, Inter *inter, bool free) {
  279. for (Error *base = result->error; base != NULL; base = base->next){
  280. if (base->next != NULL){
  281. writeLog(inter->data.error, ERROR, "Error Backtracking: On Line: %ld In file: %s Error ID: %p\n", base->line, base->file, base);
  282. }
  283. else{
  284. writeLog(inter->data.error, ERROR, "%s\n%s\nOn Line: %ld\nIn File: %s\nError ID: %p\n", base->type, base->messgae, base->line, base->file, base);
  285. }
  286. }
  287. if (free)
  288. freeError(result);
  289. }
  290. inline bool isType(Value *value, enum ValueType type){
  291. return value->type == type;
  292. }