1
0

value.c 9.1 KB

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