it-reader.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include "it-reader.h"
  2. #include "init.h"
  3. namespace aFunit {
  4. size_t StringReader::readText(char *dest, size_t read_len, ReadMode &mode) {
  5. if (index == len) // 读取到末尾
  6. return 0;
  7. if (index + read_len > len) { // 超出长度范围
  8. read_len = len - index;
  9. mode = read_mode_finished;
  10. }
  11. memcpy(dest, str.c_str() + index, read_len);
  12. index += read_len;
  13. return read_len;
  14. }
  15. size_t FileReader::readText(char *dest, size_t read_len, aFuncore::Reader::ReadMode &mode) {
  16. if (!no_first) {
  17. no_first = true;
  18. char ch;
  19. if (fread(&ch, sizeof(char), 1, file) != 1) {
  20. mode = read_mode_finished;
  21. return 0;
  22. }
  23. if ((unsigned char)ch == (unsigned char)0xEF) {
  24. /* 处理BOM编码 */
  25. unsigned char ch_[2];
  26. if (fread(ch_, sizeof(unsigned char), 2, file) != 2
  27. || ch_[0] != (unsigned char)0xBB
  28. || ch_[1] != (unsigned char)0xBF) {
  29. mode = read_mode_error;
  30. return 0;
  31. }
  32. trackLog(aFunLogger, "Parser utf-8 with BOM");
  33. } else {
  34. ungetc(ch, file);
  35. trackLog(aFunLogger, "Parser utf-8 without BOM");
  36. }
  37. }
  38. size_t len_r = fread(dest, sizeof(char), read_len, file);
  39. if (aFuntool::clear_ferror(file)) {
  40. mode = read_mode_error;
  41. } else if (feof(file))
  42. mode = read_mode_finished;
  43. return len_r;
  44. }
  45. }