Browse Source

fix: 修复reader的错误

reader错误计算buf需要填充的长度
SongZihuan 3 years ago
parent
commit
5d52840f4b
8 changed files with 15 additions and 15 deletions
  1. 1 0
      include/core/code.h
  2. 2 2
      include/tool/stdio_.h
  3. 0 1
      src/core/__code.h
  4. 0 1
      src/core/__reader.h
  5. 2 2
      src/core/parser.c
  6. 8 8
      src/core/reader.c
  7. 1 0
      src/main.c
  8. 1 1
      src/tool/stdio_.c

+ 1 - 0
include/core/code.h

@@ -46,4 +46,5 @@ AFUN_CORE_EXPORT char *getCodeElementData(af_Code *code);
 AFUN_CORE_EXPORT CodeUInt getCodeElementCount(af_Code *code);
 AFUN_CORE_EXPORT char *getCodeMD5(af_Code *code);
 AFUN_CORE_EXPORT bool codeSemanticCheck(af_Code *code);
+AFUN_CORE_EXPORT void printCode(af_Code *bt);
 #endif //AFUN_BYTECODE

+ 2 - 2
include/tool/stdio_.h

@@ -9,7 +9,7 @@ AFUN_TOOL_EXPORT bool checkStdin(void);
 
 #ifdef aFunWIN32_NO_CYGWIN
 AFUN_TOOL_EXPORT int fgetchar_stdin(void);
-AFUN_TOOL_EXPORT int fungec_stdin(int ch);
+AFUN_TOOL_EXPORT int fungetc_stdin(int ch);
 
 AFUN_TOOL_EXPORT int fputs_stdout(char *str);
 AFUN_TOOL_EXPORT int fputs_stderr(char *str);
@@ -21,7 +21,7 @@ AFUN_TOOL_EXPORT size_t printf_stderr(size_t buf_len, char *format, ...);
 
 #else
 #define fgetchar_stdin() fgetc(stdin)
-#define fungec_stdin(ch) ungetc((ch), stdin)
+#define fungetc_stdin(ch) ungetc((ch), stdin)
 
 #define fputs_stdout(str) fputs((str), stdout)
 #define fputs_stderr(str) fputs((str), stderr)

+ 0 - 1
src/core/__code.h

@@ -29,5 +29,4 @@ struct af_Code {  // 一个 Code 的结构体
     struct af_Code *next;
 };
 
-AFUN_CORE_NO_EXPORT void printCode(af_Code *bt);
 #endif //AFUN_BYTECODE_H_

+ 0 - 1
src/core/__reader.h

@@ -23,7 +23,6 @@ struct af_Reader {
     size_t data_size;
 
     char *buf;
-    char *buf_end;  // buf的尾部位置[NUL的位置]
     size_t buf_size;  // buf的长度-1
     char *read;
     bool read_end;

+ 2 - 2
src/core/parser.c

@@ -181,7 +181,7 @@ static size_t readFuncStdin(struct readerDataStdin *data, char *dest, size_t len
             return 0;
         }
 
-        fungec_stdin(ch);
+        fungetc_stdin(ch);
 
         if (fgets_stdin(&data->data, STDIN_MAX_SIZE) == 0) {
             writeErrorLog(aFunCoreLogger, "The stdin buf too large (> %d)", STDIN_MAX_SIZE);
@@ -190,7 +190,7 @@ static size_t readFuncStdin(struct readerDataStdin *data, char *dest, size_t len
         }
 
         data->index = 0;
-        data->len = strlen(data->data);
+        data->len = STR_LEN(data->data);
     }
 
     if (data->index + len > data->len)  // 超出长度范围

+ 8 - 8
src/core/reader.c

@@ -10,8 +10,7 @@ af_Reader *makeReader(DLC_SYMBOL(readerFunc) read_func, DLC_SYMBOL(destructReade
     reader->data_size = data_size;
 
     reader->buf = NEW_STR(DEFAULT_BUF_SIZE);
-    reader->buf_size = DEFAULT_BUF_SIZE;
-    reader->buf_end = reader->buf + DEFAULT_BUF_SIZE;  // 执行buf[DEFAULT_BUF_SIZE], 即NUL
+    reader->buf_size = DEFAULT_BUF_SIZE;  // buf_size 不包括NUL
     reader->read = reader->buf;
     return reader;
 }
@@ -42,7 +41,6 @@ void *getReaderData(af_Reader *reader) {
 
 char *readWord(size_t del_index, af_Reader *reader) {
     char *re;
-    char *write = reader->buf_end - del_index;  // 数据写入的位置
     reader->read = reader->buf;  // 重置指针
 
     if (del_index == 0)
@@ -51,10 +49,13 @@ char *readWord(size_t del_index, af_Reader *reader) {
     re = NEW_STR(del_index);
     memcpy(re, reader->buf, del_index);  // 复制旧字符串
     memmove(reader->buf, reader->buf + del_index, reader->buf_size - del_index + 1);  // +1是为了涵盖NUL
+
     if (!reader->read_end) { // 没到尾部, 则写入数据
-        size_t len = GET_SYMBOL(reader->read_func)(reader->data, write, del_index, &reader->read_end);
-        if (len > del_index)
-            len = del_index;
+        char *write = reader->buf + STR_LEN(reader->buf);  // 数据写入的位置
+        size_t len_ = reader->buf_size - STR_LEN(reader->buf);
+        size_t len = GET_SYMBOL(reader->read_func)(reader->data, write, len_, &reader->read_end);
+        if (len > len_)
+            len = len_;
         *(write + len) = NUL;
     }
 
@@ -87,12 +88,11 @@ char getChar(af_Reader *reader) {
     size_t len = GET_SYMBOL(reader->read_func)(reader->data, new_buf + reader->buf_size, NEW_BUF_SIZE, &reader->read_end);
     if (len > NEW_BUF_SIZE)
         len = NEW_BUF_SIZE;
-    *(new_buf + reader->buf_size + len + 1) = NUL;
+    *(new_buf + reader->buf_size + len) = NUL;
 
     free(reader->buf);
     reader->buf = new_buf;
     reader->buf_size = reader->buf_size + NEW_BUF_SIZE;
-    reader->buf_end = reader->buf + reader->buf_size;
     reader->read = reader->buf + reader->buf_size - NEW_BUF_SIZE;
 
     ch = *(reader->read);

+ 1 - 0
src/main.c

@@ -188,6 +188,7 @@ static int mainRun(ff_FFlags *ff) {
             }
             exit_code = runCodeFromStdin("stdin", stdin_interrupt, env);
         } while (isCoreExit(env) != 1);  // exit_code == -1 表示stdin出现错误
+        destructAFunEnvironment(env);
     } else {
         env = creatAFunEnvironment(argc - 1, argv + 1);
         exit_code = runCodeFromFile(argv[0], true, 0, env);

+ 1 - 1
src/tool/stdio_.c

@@ -66,7 +66,7 @@ int fgetchar_stdin(void) {
     return ch;
 }
 
-int fungec_stdin(int ch) {
+int fungetc_stdin(int ch) {
     int re = ungetc(ch, stdin);
     stdin_empty = false;
     return re;