inter.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "__virtualmath.h"
  2. Inter *runBaseInter(char *code_file, char *debug_dir, int *status) {
  3. Result global_result;
  4. return newInter(code_file, debug_dir, &global_result, status);
  5. }
  6. Inter *newInter(char *code_file, char *debug_dir, Result *global_result, int *status) {
  7. Inter *global_inter = NULL;
  8. ParserMessage *pm = NULL;
  9. *status = 0;
  10. if (checkFile(code_file) != 1){
  11. *status = 1;
  12. return NULL;
  13. }
  14. if (checkFile(debug_dir) != 1)
  15. debug_dir = NULL;
  16. global_inter = makeInter(code_file, debug_dir);
  17. pm = makeParserMessage(code_file, debug_dir);
  18. parserCommandList(pm, global_inter, true, global_inter->statement);
  19. if (pm->status != success){
  20. writeLog(stderr, ERROR, "Syntax Error: %s\n", pm->status_message);
  21. goto return_;
  22. }
  23. struct Statement *tmp = copyStatement(global_inter->statement);
  24. freeStatement(global_inter->statement);
  25. global_inter->statement = tmp;
  26. *global_result = globalIterStatement(global_inter);
  27. if (global_result->type == error_return)
  28. printError(global_result->error, global_inter, true);
  29. return_:
  30. freeParserMessage(pm, true);
  31. return global_inter;
  32. }
  33. Inter *makeInter(char *code_file, char *debug) {
  34. Inter *tmp = memCalloc(1, sizeof(Inter));
  35. setBaseInterData(tmp);
  36. tmp->base = NULL;
  37. tmp->link_base = NULL;
  38. tmp->statement = makeStatement(0, code_file);
  39. tmp->var_list = makeVarList(tmp);
  40. tmp->data.log_dir = memStrcpy(debug, 0, false, false);
  41. if (debug != NULL && !args.stdout_inter){
  42. char *debug_dir = memStrcat(debug, INTER_LOG, false), *error_dir = memStrcat(debug, INTER_ERROR, false);
  43. tmp->data.debug = fopen(debug_dir, "w");
  44. tmp->data.error = fopen(error_dir, "w");
  45. memFree(debug_dir);
  46. memFree(error_dir);
  47. }
  48. else {
  49. tmp->data.debug = stdout;
  50. tmp->data.error = stderr;
  51. }
  52. makeValue(tmp); // 注册None值
  53. return tmp;
  54. }
  55. void setBaseInterData(struct Inter *inter){
  56. inter->data.var_str_prefix = memStrcpy("str_", 0, false, false);
  57. inter->data.var_num_prefix = memStrcpy("num_", 0, false, false);
  58. inter->data.var_defualt = memStrcpy("default_var", 0, false, false);
  59. inter->data.debug = NULL;
  60. inter->data.log_dir = NULL;
  61. }
  62. void freeInter(Inter *inter, bool self){
  63. freeBase(inter, return_);
  64. while (inter->base != NULL)
  65. freeValue(inter->base, inter);
  66. while (inter->link_base != NULL)
  67. freeLinkValue(inter->link_base, inter);
  68. while (inter->hash_base != NULL)
  69. freeHashTable(inter->hash_base, inter, true);
  70. freeStatement(inter->statement);
  71. freeVarList(inter->var_list, true);
  72. memFree(inter->data.var_defualt);
  73. memFree(inter->data.var_num_prefix);
  74. memFree(inter->data.var_str_prefix);
  75. memFree(inter->data.log_dir);
  76. if (inter->data.log_dir != NULL) {
  77. fclose(inter->data.debug);
  78. fclose(inter->data.error);
  79. }
  80. if (self)
  81. memFree(inter);
  82. return_:
  83. return;
  84. }