reader.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "core_init.hpp"
  2. #include "__reader.hpp"
  3. static void readFirstWord(af_Reader *reader);
  4. af_Reader *makeReader(FileLine line, ConstFilePath file, DLC_SYMBOL(readerFunc) read_func,
  5. DLC_SYMBOL(destructReaderFunc) destruct_func, size_t data_size){
  6. auto reader = calloc(1, af_Reader);
  7. reader->read_func = COPY_SYMBOL(read_func, readerFunc);
  8. reader->destruct = COPY_SYMBOL(destruct_func, destructReaderFunc);
  9. reader->data = calloc_size(1, data_size);
  10. reader->data_size = data_size;
  11. reader->buf = NEW_STR(DEFAULT_BUF_SIZE);
  12. reader->buf_size = DEFAULT_BUF_SIZE; // buf_size 不包括NUL
  13. reader->read = reader->buf;
  14. reader->line = line;
  15. reader->file = strCopy(file);
  16. return reader;
  17. }
  18. af_Reader *initReader(af_Reader *reader) {
  19. if (reader->init)
  20. return reader;
  21. readFirstWord(reader);
  22. reader->init = true;
  23. return reader;
  24. }
  25. void freeReader(af_Reader *reader) {
  26. if (reader->destruct != nullptr)
  27. GET_SYMBOL(reader->destruct)(reader->data);
  28. free(reader->data);
  29. free(reader->buf);
  30. free(reader->file);
  31. FREE_SYMBOL(reader->read_func);
  32. FREE_SYMBOL(reader->destruct);
  33. free(reader);
  34. }
  35. void *getReaderData(af_Reader *reader) {
  36. return reader->data;
  37. }
  38. char *readWord(size_t del_index, af_Reader *reader) {
  39. char *re;
  40. int mode = READER_MODE_NORMAL;
  41. reader->read = reader->buf; // 重置指针
  42. if (del_index == 0)
  43. return strCopy(nullptr); // 返回空字符串
  44. re = NEW_STR(del_index);
  45. memcpy(re, reader->buf, del_index); // 复制旧字符串
  46. memmove(reader->buf, reader->buf + del_index, reader->buf_size - del_index + 1); // +1是为了涵盖NUL
  47. if (!reader->read_end) { // 没到尾部, 则写入数据
  48. char *write = reader->buf + STR_LEN(reader->buf); // 数据写入的位置
  49. size_t len_ = reader->buf_size - STR_LEN(reader->buf);
  50. size_t len = GET_SYMBOL(reader->read_func)(reader->data, write, len_, &mode);
  51. if (len > len_)
  52. len = len_;
  53. *(write + len) = NUL;
  54. }
  55. if (mode == READER_MODE_FINISHED)
  56. reader->read_end = true;
  57. else if (mode == READER_MODE_ERROR) {
  58. reader->read_end = true;
  59. reader->read_error = true;
  60. }
  61. /* 计算行号 */
  62. for (char *tmp = re; *tmp != NUL; tmp ++) {
  63. if (*tmp == '\n')
  64. reader->line++;
  65. }
  66. if (!isCharUTF8(re)) {
  67. free(re);
  68. writeErrorLog(aFunCoreLogger, "Is not utf-8");
  69. return nullptr;
  70. }
  71. return re;
  72. }
  73. static void readFirstWord(af_Reader *reader) {
  74. int mode = READER_MODE_NORMAL;
  75. reader->read = reader->buf; // 重置指针
  76. char *write = reader->buf + STR_LEN(reader->buf); // 数据写入的位置
  77. size_t len_ = reader->buf_size - STR_LEN(reader->buf);
  78. size_t len = GET_SYMBOL(reader->read_func)(reader->data, write, len_, &mode);
  79. if (len > len_)
  80. len = len_;
  81. *(write + len) = NUL;
  82. if (mode == READER_MODE_FINISHED)
  83. reader->read_end = true;
  84. else if (mode == READER_MODE_ERROR) {
  85. reader->read_end = true;
  86. reader->read_error = true;
  87. }
  88. }
  89. char getChar(af_Reader *reader) {
  90. char ch = *(reader->read);
  91. if (ch != NUL) { // 未读取到末尾
  92. reader->read++;
  93. return ch;
  94. } else if (reader->read_end) // 读取到末尾, 且无新内容
  95. return NUL;
  96. if (reader->read == reader->buf + reader->buf_size) {
  97. char *new_buf = NEW_STR(reader->buf_size + NEW_BUF_SIZE);
  98. memcpy(new_buf, reader->buf, reader->buf_size);
  99. int mode = READER_MODE_NORMAL;
  100. size_t len = GET_SYMBOL(reader->read_func)(reader->data, new_buf + reader->buf_size, NEW_BUF_SIZE, &mode);
  101. if (len > NEW_BUF_SIZE)
  102. len = NEW_BUF_SIZE;
  103. *(new_buf + reader->buf_size + len) = NUL;
  104. if (mode == READER_MODE_FINISHED)
  105. reader->read_end = true;
  106. else if (mode == READER_MODE_ERROR) {
  107. reader->read_end = true;
  108. reader->read_error = true;
  109. }
  110. free(reader->buf);
  111. reader->buf = new_buf;
  112. reader->buf_size = reader->buf_size + NEW_BUF_SIZE;
  113. reader->read = reader->buf + reader->buf_size - NEW_BUF_SIZE; // 当前读取的位置
  114. } else {
  115. int mode = READER_MODE_NORMAL;
  116. size_t len_ = reader->buf_size - (reader->read - reader->buf); // 总长度 - (已读取长度) = 剩余空白
  117. size_t len = GET_SYMBOL(reader->read_func)(reader->data, reader->read, len_, &mode);
  118. if (len > len_)
  119. len = len_;
  120. *(reader->read + len) = NUL;
  121. }
  122. ch = *(reader->read);
  123. if (ch != NUL)
  124. reader->read++;
  125. return ch;
  126. }