Преглед на файлове

feat: 处理stdout和stderr设定

SongZihuan преди 4 години
родител
ревизия
c8ef4af6af
променени са 3 файла, в които са добавени 23 реда и са изтрити 8 реда
  1. 2 1
      include/inter.h
  2. 19 6
      src/inter.c
  3. 2 1
      src/runfile.c

+ 2 - 1
include/inter.h

@@ -14,7 +14,8 @@ struct Inter{
     struct InterData{
         FILE *inter_stdout;
         FILE *inter_stderr;
-        bool is_std;
+        bool is_stdout;
+        bool is_stderr;
 
         struct Value *object;
         struct Value *vobject;

+ 19 - 6
src/inter.c

@@ -11,15 +11,28 @@ Inter *makeInter(char *out, char *error_, LinkValue *belong) {
 
     tmp->var_list = makeVarList(tmp, true);
 
-    if (out != NULL && error_ != NULL){
+    if (out) {
         tmp->data.inter_stdout = fopen(out, "w");
-        tmp->data.inter_stderr = fopen(error_, "w");
-        tmp->data.is_std = true;
+        tmp->data.is_stdout = false;
+        if (tmp->data.inter_stdout == NULL)
+            goto set_stdout;
     }
     else {
+        set_stdout:
         tmp->data.inter_stdout = stdout;
+        tmp->data.is_stdout = true;
+    }
+
+    if (error_) {
+        tmp->data.inter_stdout = fopen(error_, "w");
+        tmp->data.is_stderr = false;
+        if (tmp->data.inter_stdout == NULL)
+            goto set_error_;
+    }
+    else {
+        set_error_:
         tmp->data.inter_stderr = stderr;
-        tmp->data.is_std = false;
+        tmp->data.is_stderr = true;
     }
 
     registeredFunctionName(tmp);
@@ -105,10 +118,10 @@ void freeBaseInterData(struct Inter *inter){
     memFree(inter->data.object_iter);
     memFree(inter->data.object_next);
 
-    if (inter->data.is_std) {
+    if (!inter->data.is_stdout)
         fclose(inter->data.inter_stdout);
+    if (!inter->data.inter_stderr)
         fclose(inter->data.inter_stderr);
-    }
 }
 
 void freeInter(Inter *inter, bool show_gc) {

+ 2 - 1
src/runfile.c

@@ -64,7 +64,8 @@ ResultType importFileCore(VarList **new_object, char **file_dir, INTER_FUNCTIONS
     import_inter = makeInter(NULL, NULL, belong);
     import_inter->data.inter_stdout = inter->data.inter_stdout;
     import_inter->data.inter_stderr = inter->data.inter_stderr;
-    import_inter->data.is_std = true;
+    import_inter->data.is_stdout = true;
+    import_inter->data.is_stderr = true;
 
     pm = makeParserMessage(*file_dir);
     run_st = makeStatement(0, *file_dir);