Ver Fonte

feat: 新增两种print函数

print_link 打印LinkValue
print_all 完整输出信息
SongZihuan há 4 anos atrás
pai
commit
595f0b10df
9 ficheiros alterados com 94 adições e 61 exclusões
  1. 11 10
      argument/argument.c
  2. 4 0
      include/__virtualmath.h
  3. 2 2
      include/arguement.h
  4. 6 4
      include/inter.h
  5. 1 1
      main.c
  6. 29 9
      ofunc/src/io.c
  7. 16 20
      src/inter.c
  8. 1 1
      src/runfile.c
  9. 24 14
      src/value.c

+ 11 - 10
argument/argument.c

@@ -1,12 +1,12 @@
 #include "__virtualmath.h"
 
 static const struct option long_option[]={
-        {"stdout",no_argument,NULL,'s'},
-        {"log",required_argument,NULL,'l'},
+        {"log-err",required_argument,NULL,'o'},
+        {"log-out",required_argument,NULL,'e'},
         {NULL,0,NULL,0}
 };
 
-static const char *short_option = "sl:";
+static const char *short_option = "o:e:";
 
 /**
  * 参数设置, args是全局结构体, 保存全局的参数设置
@@ -16,8 +16,8 @@ static const char *short_option = "sl:";
  */
 int getArgs(const int argc, char **argv)
 {
-    args.log_file = NULL;
-    args.stdout_inter = false;
+    args.out_file = NULL;
+    args.error_file = false;
     opterr = false;
     int opt;
     while((opt=getopt_long(argc, argv, short_option ,long_option,NULL))!=-1)
@@ -26,11 +26,11 @@ int getArgs(const int argc, char **argv)
         {
             case 0:
                 break;
-            case 'l':
-                args.log_file = memStrcpy(optarg);
+            case 'o':
+                args.out_file = memStrcpy(optarg);
                 break;
-            case 's':
-                args.stdout_inter = true;
+            case 'e':
+                args.error_file = memStrcpy(optarg);
                 break;
             case '?':
                 fprintf(stderr, "[Error]: get not success args : -%c\n", (char)optopt);
@@ -46,5 +46,6 @@ int getArgs(const int argc, char **argv)
  * 释放args的成员而不包括其本身
  */
 void freeArgs(void){
-    memFree(args.log_file);
+    memFree(args.out_file);
+    memFree(args.error_file);
 }

+ 4 - 0
include/__virtualmath.h

@@ -18,6 +18,9 @@
 #include "arguement.h"
 #include "file.h"
 
+#define DEBUG 0
+
+#if DEBUG
 /* DEBUG */
 void printGC(Inter *inter);
 void printLinkValueGC(char *tag, Inter *inter, long *tmp_link, long *st_link);
@@ -25,4 +28,5 @@ void printValueGC(char *tag, Inter *inter, long *tmp_link, long *st_link);
 void printVarGC(char *tag, Inter *inter);
 void printHashTableGC(char *tag, Inter *inter, long *tmp_link);
 void printTokenStream(TokenStream *ts);
+#endif
 #endif //VIRTUALMATH___VIRTUALMATH_H

+ 2 - 2
include/arguement.h

@@ -2,8 +2,8 @@
 #define VIRTUALMATH_ARGUEMENT_H
 
 struct Args{
-    char *log_file;
-    bool stdout_inter;
+    char *error_file;
+    char *out_file;
 } args;
 
 typedef struct Args Args;

+ 6 - 4
include/inter.h

@@ -12,6 +12,10 @@ struct Inter{
 
     struct VarList *var_list;
     struct InterData{
+        FILE *inter_stdout;
+        FILE *inter_stderr;
+        bool log_dir;
+
         struct Value *object;
         struct Value *vobject;
         struct Value *num;
@@ -24,9 +28,7 @@ struct Inter{
         struct Value *none;
         struct Value *list_iter;
         struct Value *dict_iter;
-        FILE *debug;
-        FILE *error;
-        char *log_dir;  // 记录log文件夹的位置
+
         char *var_str_prefix;
         char *var_num_prefix;
         char *var_bool_prefix;
@@ -55,7 +57,7 @@ struct Inter{
 typedef struct Inter Inter;
 typedef struct Statement Statement;
 
-Inter *makeInter(char *debug, struct LinkValue *belong);
+Inter *makeInter(char *out, char *error_, struct LinkValue *belong);
 void freeInter(Inter *inter, bool show_gc);
 void setBaseInterData(struct Inter *inter);
 int runCodeBlock(char *code_file, Inter *inter);

+ 1 - 1
main.c

@@ -10,7 +10,7 @@ int main(int argc, char *argv[]) {
     if (getArgs(argc, argv))
         goto args_error;
 
-    inter = makeInter(args.log_file, NULL);
+    inter = makeInter(args.out_file, args.error_file, NULL);
     for (int status=0; status == 0 && argv[optind] != NULL; optind++)
         status = runCodeBlock(argv[optind], inter);
     freeInter(inter, true);

+ 29 - 9
ofunc/src/io.c

@@ -1,6 +1,19 @@
 #include "__ofunc.h"
+ResultType vm_printCore(OfficialFunctionSig, int type);
 
 ResultType vm_print(OfficialFunctionSig){
+    return vm_printCore(CALL_OfficialFunction(arg, var_list, result, belong), 2);
+}
+
+ResultType vm_printAll(OfficialFunctionSig){
+    return vm_printCore(CALL_OfficialFunction(arg, var_list, result, belong), 1);
+}
+
+ResultType vm_printLink(OfficialFunctionSig){
+    return vm_printCore(CALL_OfficialFunction(arg, var_list, result, belong), 0);
+}
+
+ResultType vm_printCore(OfficialFunctionSig, int type){
     setResultCore(result);
     ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=true},
                            {.type=name_value, .name="end", .must=0, .value=NULL},
@@ -11,23 +24,30 @@ ResultType vm_print(OfficialFunctionSig){
     freeResult(result);
 
     arg = ap[0].arg;
-    for (int i=0; i < ap[0].c_count; arg = arg->next,i++)
-#if 0
-        printLinkValue(arg->data.value, "", "", stdout);
-#else
-        printValue(arg->data.value->value, stdout, true);
-#endif
+    for (int i=0; i < ap[0].c_count; arg = arg->next,i++){
+        if (i != 0)
+            fprintf(inter->data.inter_stdout, " ");
+        if (type == 0)
+            printLinkValue(arg->data.value, "", "", inter->data.inter_stdout);
+        else if (type == 1)
+            printValue(arg->data.value->value, inter->data.inter_stdout, true);
+        else
+            printValue(arg->data.value->value, inter->data.inter_stdout, false);
+    }
 
     if (ap[1].value != NULL && ap[1].value->value->type == string)
-        printf("%s", ap[1].value->value->data.str.str);
+        fprintf(inter->data.inter_stdout, "%s", ap[1].value->value->data.str.str);
     else
-        printf("\n");
+        fprintf(inter->data.inter_stdout, "\n");
 
     setResultBase(result, inter, belong);
     return result->type;
 }
 
 void registeredIOFunction(RegisteredFunctionSig){
-    NameFunc tmp[] = {{"print", vm_print, free_}, {NULL, NULL}};
+    NameFunc tmp[] = {{"print", vm_print, free_},
+                      {"print_link", vm_printLink, free_},
+                      {"print_all", vm_printAll, free_},
+                      {NULL, NULL}};
     iterNameFunc(tmp, belong, CALL_INTER_FUNCTIONSIG_CORE(var_list));
 }

+ 16 - 20
src/inter.c

@@ -1,6 +1,6 @@
 #include "__virtualmath.h"
 
-Inter *makeInter(char *debug, LinkValue *belong) {
+Inter *makeInter(char *out, char *error_, LinkValue *belong) {
     Inter *tmp = memCalloc(1, sizeof(Inter));
     LinkValue *base_father = NULL;
     setBaseInterData(tmp);
@@ -10,22 +10,16 @@ Inter *makeInter(char *debug, LinkValue *belong) {
     tmp->base_var = NULL;
 
     tmp->var_list = makeVarList(tmp, true);
-    tmp->data.log_dir = memStrcpy(debug);
 
-    if (debug != NULL && !args.stdout_inter){
-#ifdef __unix__
-        char *debug_dir = memStrcat(debug, "/inter.log", false, false), *error_dir = memStrcat(debug, "/inter_error.log", false, false);
-#else // __unix__
-        char *debug_dir = memStrcat(debug, "\inter.log", false, false), *error_dir = memStrcat(debug, "\inter_error.log", false, false);
-#endif // __unix__
-        tmp->data.debug = fopen(debug_dir, "w");
-        tmp->data.error = fopen(error_dir, "w");
-        memFree(debug_dir);
-        memFree(error_dir);
+    if (out != NULL && error_ != NULL){
+        tmp->data.inter_stdout = fopen(out, "w");
+        tmp->data.inter_stderr = fopen(error_, "w");
+        tmp->data.log_dir = true;
     }
     else {
-        tmp->data.debug = stdout;
-        tmp->data.error = stderr;
+        tmp->data.inter_stdout = stdout;
+        tmp->data.inter_stderr = stderr;
+        tmp->data.log_dir = false;
     }
 
     registeredFunctionName(tmp);
@@ -111,10 +105,9 @@ void freeBaseInterData(struct Inter *inter){
     memFree(inter->data.object_iter);
     memFree(inter->data.object_next);
 
-    memFree(inter->data.log_dir);
-    if (inter->data.log_dir != NULL) {
-        fclose(inter->data.debug);
-        fclose(inter->data.error);
+    if (inter->data.log_dir) {
+        fclose(inter->data.inter_stdout);
+        fclose(inter->data.inter_stderr);
     }
 }
 
@@ -122,12 +115,13 @@ void freeInter(Inter *inter, bool show_gc) {
     freeBase(inter, return_);
     gc_runDelAll(inter);
     freeBaseInterData(inter);
-
+#if DEBUG
     if (show_gc && (printf("Enter '1' to show gc: "), getc(stdin) == '1')) {
         printGC(inter);
         while (getc(stdin) != '\n')
             PASS;
     }
+#endif
     freeVarList(inter->var_list);
     while (inter->base != NULL)
         freeValue(&inter->base);
@@ -170,6 +164,7 @@ void mergeInter(Inter *new, Inter *base){
     memFree(new);
 }
 
+#if DEBUG == 1
 /* ***********************DEBUG 专用函数*********************************** */
 
 void printGC(Inter *inter){
@@ -317,4 +312,5 @@ void printTokenStream(TokenStream *ts) {
         i++;
     }
     printf("\n");
-}
+}
+#endif

+ 1 - 1
src/runfile.c

@@ -61,7 +61,7 @@ ResultType importFileCore(VarList **new_object, char **file_dir, INTER_FUNCTIONS
     }
 
 
-    import_inter = makeInter(NULL, belong);
+    import_inter = makeInter(NULL, NULL, belong);
     pm = makeParserMessage(*file_dir);
     run_st = makeStatement(0, *file_dir);
     parserCommandList(pm, import_inter, true, run_st);

+ 24 - 14
src/value.c

@@ -313,13 +313,16 @@ void printValue(Value *value, FILE *debug, bool print_father) {
             fprintf(debug, "%"NUMBER_FORMAT"", value->data.num.num);
             break;
         case string:
-            fprintf(debug, "'%s'", value->data.str.str);
+            fprintf(debug, "%s", value->data.str.str);
             break;
         case function:
-            fprintf(debug, "function");
+            if (print_father)
+                fprintf(debug, "function");
+            else
+                fprintf(debug, "(function on %p)", value);
             break;
         case list:
-            fprintf(debug, "list on size : %d  [ ", (int)value->data.list.size);
+            fprintf(debug, "[");
             for (int i=0;i < value->data.list.size;i++){
                 if (i > 0)
                     fprintf(debug, ", ", NULL);
@@ -330,7 +333,7 @@ void printValue(Value *value, FILE *debug, bool print_father) {
         case dict: {
             Var *tmp = NULL;
             bool print_comma = false;
-            fprintf(debug, "dict size : %d  { ", (int) value->data.dict.size);
+            fprintf(debug, "{");
             for (int i = 0; i < MAX_SIZE; i++) {
                 for (tmp = value->data.dict.dict->hashtable[i]; tmp != NULL; tmp = tmp->next) {
                     if (print_comma)
@@ -346,13 +349,19 @@ void printValue(Value *value, FILE *debug, bool print_father) {
             break;
         }
         case none:
-            fprintf(debug, "<None>", NULL);
+            fprintf(debug, "(null)", NULL);
             break;
         case class:
-            fprintf(debug, "class");
+            if (print_father)
+                fprintf(debug, "class");
+            else
+                fprintf(debug, "(class on %p)", value);
             break;
         case object_:
-            fprintf(debug, "object");
+            if (print_father)
+                fprintf(debug, "object");
+            else
+                fprintf(debug, "(object on %p)", value);
             break;
         case bool_:
             if (value->data.bool_.bool_)
@@ -364,17 +373,18 @@ void printValue(Value *value, FILE *debug, bool print_father) {
             fprintf(debug, "...");
             break;
         default:
-            fprintf(debug, "unknow");
+            fprintf(debug, "unknown");
             break;
     }
-    fprintf(debug, "(");
-    printf("<%p>", value);
-    if (print_father)
+    if (print_father){
+        fprintf(debug, "(");
+        printf("<%p>", value);
         for (Inherit *fv = value->object.inherit; fv != NULL; fv = fv->next) {
             printf(" -> ");
             printValue(fv->value->value, debug, false);
         }
-    fprintf(debug, ")");
+        fprintf(debug, ")");
+    }
 
 }
 
@@ -421,9 +431,9 @@ void freeError(Result *base){
 void printError(Result *result, Inter *inter, bool free) {
     for (Error *base = result->error; base != NULL; base = base->next){
         if (base->next != NULL)
-            fprintf(inter->data.error, "Error Backtracking:  On Line: %ld In file: %s Error ID: %p\n", base->line, base->file, base);
+            fprintf(inter->data.inter_stderr, "Error Backtracking:  On Line: %ld In file: %s Error ID: %p\n", base->line, base->file, base);
         else
-            fprintf(inter->data.error, "%s\n%s\nOn Line: %ld\nIn File: %s\nError ID: %p\n", base->type, base->messgae, base->line, base->file, base);
+            fprintf(inter->data.inter_stderr, "%s\n%s\nOn Line: %ld\nIn File: %s\nError ID: %p\n", base->type, base->messgae, base->line, base->file, base);
     }
     if (free)
         freeError(result);