Browse Source

feat: 调整code IO的API

readAllCode和writeAllCode都只需要传入文件路径即可
SongZihuan 3 năm trước cách đây
mục cha
commit
016071a7ac
4 tập tin đã thay đổi với 34 bổ sung29 xóa
  1. 2 2
      include/core/code.h
  2. 27 5
      src/core/code.c
  3. 3 6
      src/runtime/aFunlang.c
  4. 2 16
      test/src/byte_code.c

+ 2 - 2
include/core/code.h

@@ -29,8 +29,8 @@ AFUN_CORE_EXPORT void freeAllCode(af_Code *bt);
 /* 代码块 相关操作 */
 AFUN_CORE_EXPORT af_Code *pushCode(af_Code **base, af_Code *next);
 AFUN_CORE_EXPORT af_Code *copyCode(af_Code *base, FilePath *path);
-AFUN_CORE_EXPORT bool writeAllCode(af_Code *bt, FILE *file);
-AFUN_CORE_EXPORT bool readAllCode(af_Code **bt, FilePath path, FILE *file);
+AFUN_CORE_EXPORT bool writeAllCode(af_Code *bt, FilePath path);
+AFUN_CORE_EXPORT bool readAllCode(af_Code **bt, FilePath path);
 
 /* 代码块 属性访问 */
 AFUN_CORE_EXPORT af_Code *getCodeNext(af_Code *bt);

+ 27 - 5
src/core/code.c

@@ -204,17 +204,29 @@ static bool writeCode(af_Code *bt, FILE *file) {
  * 目标: 将Code写入字节码文件中
  * 备注: 写入字节码时不做语义检查, 在读取时最语义检查即可
  */
-bool writeAllCode(af_Code *bt, FILE *file) {
+bool writeAllCode(af_Code *bt, FilePath path) {
     if (bt == NULL || bt->path == NULL)
         return false;
 
+    FILE *file = fopen(path, "wb");
+    if (file == NULL)
+        return false;
+
     for (NULL; bt != NULL; bt = bt->next) {
         if (!writeCode(bt, file))
-            return false;
+            goto RETURN_FALSE;
+        if (ferror(stdin))
+            goto RETURN_FALSE;
+
         Done(byteWriteUint_8(file, (bt->next == NULL)));  // 记录是否为最后一位
     }
 
+    fclose(file);
     return true;
+
+RETURN_FALSE:
+    fclose(file);
+    return false;
 }
 
 static bool readCode(af_Code **bt, FILE *file) {
@@ -251,14 +263,19 @@ static bool readCode(af_Code **bt, FILE *file) {
     return true;
 }
 
-bool readAllCode(af_Code **bt, FilePath path, FILE *file) {
+bool readAllCode(af_Code **bt, FilePath path) {
     af_Code **base = bt;
     *bt = NULL;
+
+    FILE *file = fopen(path, "rb");
+    if (file == NULL)
+        return false;
+
     for (NULL; true;bt = &((*bt)->next)) {
         if(!readCode(bt, file))
-            return false;
+            goto RETURN_FALSE;
         if (ferror(stdin))
-            return false;
+            goto RETURN_FALSE;
 
         uint8_t last;
         Done(byteReadUint_8(file, &last));
@@ -268,7 +285,12 @@ bool readAllCode(af_Code **bt, FilePath path, FILE *file) {
 
     if (*base != NULL)
         (*base)->path = strCopy(path);
+    fclose(file);
     return true;
+
+RETURN_FALSE:
+    fclose(file);
+    return false;
 }
 
 /*

+ 3 - 6
src/runtime/aFunlang.c

@@ -41,11 +41,8 @@ static int runCode_(FilePath name, af_Parser *parser, int mode, FilePath save_pa
         return -2;
 
     /* 写入文件 */
-    if (save_path != NULL) {
-        FILE *file_ = fopen(save_path, "wb");
-        if (file_ != NULL)
-            writeAllCode(bt_code, file_);
-    }
+    if (save_path != NULL)
+        writeAllCode(bt_code, save_path);
 
     bool res = iterCode(bt_code, mode, env);
     freeAllCode(bt_code);
@@ -161,7 +158,7 @@ int runCodeFromFileByte(FilePath file, FILE *error_file, af_Environment *env) {
         return -3;
     }
 
-    if(!readAllCode(&code, file, file_)) {
+    if(!readAllCode(&code, file)) {
         freeAllCode(code);
         return -2;
     }

+ 2 - 16
test/src/byte_code.c

@@ -16,30 +16,16 @@ int main() {
     af_Code *bt5 = makeBlockCode(parentheses, bt3, 0, 1, NULL, NULL);
     pushCode(&bt2, bt5);
 
-    FILE *file = fopen("test.afb", "wb");
-    if (file == NULL) {
-        fprintf(stderr, "Can't not creat file: test.afb\n");
-        return EXIT_FAILURE;
-    }
-
-    if(!writeAllCode(bt1, file)) {
+    if(!writeAllCode(bt1, "test.afb")) {
         fprintf(stderr, "Write test.afb error.\n");
         return EXIT_FAILURE;
     }
-    fclose(file);
 
     af_Code *get;
-    file = fopen("test.afb", "rb");
-    if (file == NULL) {
-        fprintf(stderr, "Can't not read file: test.afb\n");
-        return EXIT_FAILURE;
-    }
-
-    if(!readAllCode(&get, "test.afb", file)) {
+    if(!readAllCode(&get, "test.afb")) {
         fprintf(stderr, "Read test.afb error.\n");
         return EXIT_FAILURE;
     }
-    fclose(file);
 
     printf("out:\n");
     printCode(bt1);