Selaa lähdekoodia

fix: 修复reader读取问题

reader并非每次读取都扩充buf
SongZihuan 3 vuotta sitten
vanhempi
sitoutus
439b95c68e
1 muutettua tiedostoa jossa 28 lisäystä ja 19 poistoa
  1. 28 19
      src/core/reader.c

+ 28 - 19
src/core/reader.c

@@ -90,27 +90,36 @@ char getChar(af_Reader *reader) {
     } else if (reader->read_end)  // 读取到末尾, 且无新内容
         return NUL;
 
-    char *new_buf = NEW_STR(reader->buf_size + NEW_BUF_SIZE);
-    memcpy(new_buf, reader->buf, reader->buf_size);
-
-    int mode = READER_MODE_NORMAL;
-    size_t len = GET_SYMBOL(reader->read_func)(reader->data, new_buf + reader->buf_size, NEW_BUF_SIZE, &mode);
-    if (len > NEW_BUF_SIZE)
-        len = NEW_BUF_SIZE;
-    *(new_buf + reader->buf_size + len) = NUL;
-
-    if (mode == READER_MODE_FINISHED)
-        reader->read_end = true;
-    else if (mode == READER_MODE_ERROR) {
-        reader->read_end = true;
-        reader->read_error = true;
+    if (reader->read == reader->buf + reader->buf_size) {
+        char *new_buf = NEW_STR(reader->buf_size + NEW_BUF_SIZE);
+        memcpy(new_buf, reader->buf, reader->buf_size);
+
+        int mode = READER_MODE_NORMAL;
+        size_t len = GET_SYMBOL(reader->read_func)(reader->data, new_buf + reader->buf_size, NEW_BUF_SIZE, &mode);
+        if (len > NEW_BUF_SIZE)
+            len = NEW_BUF_SIZE;
+        *(new_buf + reader->buf_size + len) = NUL;
+
+        if (mode == READER_MODE_FINISHED)
+            reader->read_end = true;
+        else if (mode == READER_MODE_ERROR) {
+            reader->read_end = true;
+            reader->read_error = true;
+        }
+
+        free(reader->buf);
+        reader->buf = new_buf;
+        reader->buf_size = reader->buf_size + NEW_BUF_SIZE;
+        reader->read = reader->buf + reader->buf_size - NEW_BUF_SIZE;  // 当前读取的位置
+    } else {
+        int mode = READER_MODE_NORMAL;
+        size_t len_ = reader->buf_size - (reader->read - reader->buf);  // 总长度  - (已读取长度) = 剩余空白
+        size_t len = GET_SYMBOL(reader->read_func)(reader->data, reader->read, len_, &mode);
+        if (len > len_)
+            len = len_;
+        *(reader->read + len) = NUL;
     }
 
-    free(reader->buf);
-    reader->buf = new_buf;
-    reader->buf_size = reader->buf_size + NEW_BUF_SIZE;
-    reader->read = reader->buf + reader->buf_size - NEW_BUF_SIZE;
-
     ch = *(reader->read);
     if (ch != NUL)
         reader->read++;