value.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  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. tmp->next = NULL;
  7. if (list_tmp == NULL){
  8. inter->base = tmp;
  9. tmp->last = NULL;
  10. goto return_;
  11. }
  12. while (list_tmp->next != NULL){
  13. list_tmp = list_tmp->next;
  14. }
  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, 0, false, false);
  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. while (at != NULL && at->type == value_arg){
  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. at = at->next;
  56. }
  57. *arg_ad = at;
  58. return tmp;
  59. }
  60. Value *makeDictValue(Argument **arg_ad, bool new_hash, Inter *inter) {
  61. Value *tmp;
  62. tmp = makeValue(inter);
  63. tmp->data.dict.size = 0;
  64. tmp->type = dict;
  65. if (new_hash) {
  66. VarList *hash = makeVarList(inter);
  67. tmp->data.dict.dict = hash->hashtable;
  68. argumentToVar(arg_ad, inter, hash, &tmp->data.dict.size);
  69. freeVarList(hash, true);
  70. }
  71. else
  72. tmp->data.dict.dict = NULL;
  73. return tmp;
  74. }
  75. void freeValue(Value *value, Inter *inter){
  76. freeBase(value, return_);
  77. if (value->last == NULL)
  78. inter->base = value->next;
  79. else
  80. value->last->next = value->next;
  81. if (value->next != NULL)
  82. value->next->last = value->last;
  83. switch (value->type) {
  84. case string:
  85. memFree(value->data.str.str);
  86. break;
  87. case function: {
  88. VarList *tmp = value->data.function.var;
  89. freeParameter(value->data.function.pt, true);
  90. freeStatement(value->data.function.function);
  91. while (tmp != NULL)
  92. tmp = freeVarList(tmp, true);
  93. break;
  94. }
  95. case list:
  96. memFree(value->data.list.list);
  97. break;
  98. default:
  99. break;
  100. }
  101. memFree(value);
  102. return_:
  103. return;
  104. }
  105. LinkValue *makeLinkValue(Value *value, LinkValue *linkValue, Inter *inter){
  106. LinkValue *tmp;
  107. LinkValue *list_tmp = inter->link_base;
  108. tmp = memCalloc(1, sizeof(Value));
  109. tmp->father = linkValue;
  110. tmp->value = value;
  111. if (list_tmp == NULL){
  112. inter->link_base = tmp;
  113. tmp->last = NULL;
  114. goto return_;
  115. }
  116. while (list_tmp->next != NULL)
  117. list_tmp = list_tmp->next;
  118. list_tmp->next = tmp;
  119. tmp->last = list_tmp;
  120. return_:
  121. return tmp;
  122. }
  123. void freeLinkValue(LinkValue *value, Inter *inter){
  124. freeBase(value, return_);
  125. if (value->last == NULL)
  126. inter->link_base = value->next;
  127. else
  128. value->last->next = value->next;
  129. if (value->next != NULL)
  130. value->next->last = value->last;
  131. memFree(value);
  132. return_:
  133. return;
  134. }
  135. void setResultCore(Result *ru) {
  136. ru->type = not_return;
  137. ru->times = 0;
  138. ru->error = NULL;
  139. ru->value = NULL;
  140. }
  141. void setResult(Result *ru, Inter *inter) {
  142. setResultCore(ru);
  143. ru->value = makeLinkValue(inter->base, NULL, inter);
  144. }
  145. void setResultError(Result *ru, Inter *inter, char *error_type, char *error_message, Statement *st, bool new) {
  146. if (!new && ru->type != error_return)
  147. return;
  148. if (new) {
  149. setResultCore(ru);
  150. ru->type = error_return;
  151. ru->value = makeLinkValue(inter->base, NULL, inter);
  152. }
  153. else{
  154. error_type = NULL;
  155. error_message = NULL;
  156. }
  157. ru->error = connectError(makeError(error_type, error_message, st->line, st->code_file), ru->error);
  158. }
  159. void setResultOperation(Result *ru, Inter *inter) {
  160. setResultCore(ru);
  161. ru->type = operation_return;
  162. ru->value = makeLinkValue(inter->base, NULL, inter);
  163. }
  164. void printValue(Value *value, FILE *debug){
  165. switch (value->type){
  166. case number:
  167. writeLog(debug, INFO, "%"NUMBER_FORMAT"", value->data.num.num);
  168. break;
  169. case string:
  170. writeLog(debug, INFO, "'%s'", value->data.str.str);
  171. break;
  172. case function:
  173. writeLog(debug, INFO, "function on <%p>", value);
  174. break;
  175. case list:
  176. writeLog(debug, INFO, "list on <%p> size : %d [ ", value, (int)value->data.list.size);
  177. for (int i=0;i < value->data.list.size;i++){
  178. if (i > 0)
  179. writeLog(debug, INFO, ", ", NULL);
  180. printLinkValue(value->data.list.list[i], "", "", debug);
  181. }
  182. writeLog(debug, INFO, " ]", NULL);
  183. break;
  184. case dict: {
  185. bool print_comma = false;
  186. writeLog(debug, INFO, "dict on <%p> size : %d { ", value, (int) value->data.dict.size);
  187. for (int i = 0; i < MAX_SIZE; i++) {
  188. Var *tmp = value->data.dict.dict->hashtable[i];
  189. while (tmp != NULL) {
  190. if (print_comma)
  191. writeLog(debug, INFO, ", ", NULL);
  192. else
  193. print_comma = true;
  194. printLinkValue(tmp->name_, "", "", debug);
  195. writeLog(debug, INFO, " ['%s'] : ", tmp->name);
  196. printLinkValue(tmp->value, "", "", debug);
  197. tmp = tmp->next;
  198. }
  199. }
  200. writeLog(debug, INFO, " }", NULL);
  201. break;
  202. }
  203. case none:
  204. writeLog(debug, INFO, "<None>", NULL);
  205. break;
  206. default:
  207. writeLog(debug, INFO, "default on <%p>", value);
  208. break;
  209. }
  210. }
  211. void printLinkValue(LinkValue *value, char *first, char *last, FILE *debug){
  212. writeLog(debug, INFO, "%s", first);
  213. if (value->father != NULL) {
  214. printLinkValue(value->father, "", "", debug);
  215. writeLog(debug, INFO, " . ", NULL);
  216. }
  217. printValue(value->value, debug);
  218. writeLog(debug, INFO, "%s", last);
  219. }
  220. Error *makeError(char *type, char *message, long int line, char *file) {
  221. Error *tmp = memCalloc(1, sizeof(Error));
  222. tmp->line = line;
  223. tmp->type = memStrcpy(type, 0, false, false);
  224. tmp->messgae = memStrcpy(message, 0, false, false);
  225. tmp->file = memStrcpy(file, 0, false, false);
  226. tmp->next = NULL;
  227. return tmp;
  228. }
  229. Error *connectError(Error *new, Error *base){
  230. new->next = base;
  231. return new;
  232. }
  233. void freeError(Error *base){
  234. while (base != NULL){
  235. memFree(base->messgae);
  236. memFree(base->type);
  237. memFree(base->file);
  238. Error *tmp = base->next;
  239. memFree(base);
  240. base = tmp;
  241. }
  242. }
  243. void printError(Error *error, Inter *inter, bool free) {
  244. Error *base = error;
  245. while (error != NULL){
  246. if (error->next != NULL){
  247. writeLog(inter->data.error, ERROR, "Error Backtracking: On Line: %ld In file: %s Error ID: %p\n", error->line, error->file, error);
  248. }
  249. else{
  250. writeLog(inter->data.error, ERROR, "%s\n%s\nOn Line: %ld\nIn File: %s\nError ID: %p\n", error->type, error->messgae, error->line, error->file, error);
  251. }
  252. error = error->next;
  253. }
  254. if (free)
  255. freeError(base);
  256. }
  257. inline bool isType(Value *value, enum ValueType type){
  258. return value->type == type;
  259. }