runfile.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "__run.h"
  2. ResultType includeFile(INTER_FUNCTIONSIG) {
  3. Statement *new_st = NULL;
  4. ParserMessage *pm = NULL;
  5. char *file_dir = NULL;
  6. setResultCore(result);
  7. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.include_file.file, var_list, result, father)))
  8. return result->type;
  9. if (!isType(result->value->value, string)){
  10. setResultErrorSt(result, inter, "TypeException", "Don't get a string value", st, father, true);
  11. goto return_;
  12. }
  13. file_dir = result->value->value->data.str.str;
  14. freeResult(result);
  15. if (checkFile(file_dir) != 1){
  16. setResultErrorSt(result, inter, "IncludeFileException", "File is not readable", st, father, true);
  17. goto return_;
  18. }
  19. new_st = makeStatement(0, file_dir);
  20. pm = makeParserMessage(file_dir);
  21. parserCommandList(pm, inter, true, new_st);
  22. if (pm->status != success){
  23. setResultErrorSt(result, inter, "IncludeSyntaxException", pm->status_message, st, father, true);
  24. goto return_;
  25. }
  26. functionSafeInterStatement(CALL_INTER_FUNCTIONSIG(new_st, var_list, result, father));
  27. if (!run_continue(result))
  28. setResultErrorSt(result, inter, NULL, NULL, st, father, false);
  29. return_:
  30. freeStatement(new_st);
  31. freeParserMessage(pm, true);
  32. return result->type;
  33. }
  34. ResultType importFileCore(VarList **new_object, char **file_dir, INTER_FUNCTIONSIG) {
  35. Inter *import_inter = NULL;
  36. ParserMessage *pm = NULL;
  37. Statement *run_st = NULL;
  38. setResultCore(result);
  39. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, father)))
  40. goto return_;
  41. if (!isType(result->value->value, string)) {
  42. setResultErrorSt(result, inter, "TypeException", "Don't get a string value", st, father, true);
  43. goto return_;
  44. }
  45. *file_dir = result->value->value->data.str.str;
  46. freeResult(result);
  47. if (checkFile(*file_dir) != 1) {
  48. setResultErrorSt(result, inter, "ImportFileException", "File is not readable", st, father, true);
  49. goto return_;
  50. }
  51. import_inter = makeInter(NULL, father);
  52. pm = makeParserMessage(*file_dir);
  53. run_st = makeStatement(0, *file_dir);
  54. parserCommandList(pm, import_inter, true, run_st);
  55. if (pm->status != success) {
  56. freeInter(import_inter, false);
  57. setResultErrorSt(result, inter, "ImportSyntaxException", pm->status_message, st, father, true);
  58. goto return_;
  59. }
  60. globalIterStatement(result, import_inter, run_st);
  61. if (!run_continue(result)) {
  62. freeInter(import_inter, false);
  63. result->value = makeLinkValue(inter->base, father, inter); // 重新设定none值
  64. setResultErrorSt(result, inter, NULL, NULL, st, father, false);
  65. goto return_;
  66. }
  67. *new_object = import_inter->var_list;
  68. import_inter->var_list = NULL;
  69. mergeInter(import_inter, inter);
  70. setResult(result, inter, father);
  71. return_:
  72. freeStatement(run_st);
  73. freeParserMessage(pm, true);
  74. return result->type;
  75. }
  76. ResultType importFile(INTER_FUNCTIONSIG) {
  77. char *file_dir = NULL;
  78. VarList *new_object = NULL;
  79. LinkValue *import_value = NULL;
  80. setResultCore(result);
  81. importFileCore(&new_object, &file_dir, CALL_INTER_FUNCTIONSIG(st->u.import_file.file, var_list, result, father));
  82. if (!run_continue(result))
  83. goto return_;
  84. freeResult(result);
  85. {
  86. VarList *import_var = copyVarList(var_list, false, inter);
  87. Value *import_obj = makeObject(inter, new_object, import_var, NULL);
  88. import_value = makeLinkValue(import_obj, father, inter);
  89. }
  90. if (st->u.import_file.as != NULL)
  91. assCore(st->u.import_file.as, import_value, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
  92. else
  93. addStrVar(splitDir(file_dir), true, import_value, father, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  94. setResult(result, inter, father);
  95. return_:
  96. return result->type;
  97. }
  98. ResultType fromImportFile(INTER_FUNCTIONSIG) {
  99. char *file_dir = NULL;
  100. VarList *new_object = NULL;
  101. Parameter *pt = st->u.from_import_file.pt;
  102. Parameter *as = st->u.from_import_file.as != NULL ? st->u.from_import_file.as : st->u.from_import_file.pt;
  103. setResultCore(result);
  104. importFileCore(&new_object, &file_dir, CALL_INTER_FUNCTIONSIG(st->u.from_import_file.file, var_list, result, father));
  105. if (!run_continue(result))
  106. goto return_;
  107. freeResult(result);
  108. if (pt != NULL) {
  109. setParameter(st->line, st->code_file, pt, as, var_list, father, CALL_INTER_FUNCTIONSIG_NOT_ST(new_object, result, father));
  110. if (!run_continue(result))
  111. goto return_;
  112. }
  113. else
  114. updateHashTable(var_list->hashtable, new_object->hashtable, inter);
  115. setResult(result, inter, father);
  116. return_:
  117. freeVarList(new_object);
  118. return result->type;
  119. }