file_reader.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include <file_reader.h>
  2. std::string FileReader::getline(File* file) {
  3. std::string str;
  4. size_t newline_index = 0;
  5. bool found_eol = false;
  6. bool max_length_exceeded = false;
  7. while(1) {
  8. if(file_buf_cnt > 0) {
  9. size_t end_index = 0;
  10. char* endline_ptr = (char*)memchr(file_buf, '\n', file_buf_cnt);
  11. newline_index = endline_ptr - file_buf;
  12. if(endline_ptr == 0) {
  13. end_index = file_buf_cnt;
  14. } else if(newline_index < file_buf_cnt) {
  15. end_index = newline_index + 1;
  16. found_eol = true;
  17. } else {
  18. furi_assert(0);
  19. }
  20. if (max_line_length && (str.size() + end_index > max_line_length))
  21. max_length_exceeded = true;
  22. if (!max_length_exceeded)
  23. str.append(file_buf, end_index);
  24. memmove(file_buf, &file_buf[end_index], file_buf_cnt - end_index);
  25. file_buf_cnt = file_buf_cnt - end_index;
  26. if(found_eol) break;
  27. }
  28. file_buf_cnt +=
  29. fs_api->file.read(file, &file_buf[file_buf_cnt], sizeof(file_buf) - file_buf_cnt);
  30. if(file_buf_cnt == 0) {
  31. break; // end of reading
  32. }
  33. }
  34. if (max_length_exceeded)
  35. str.clear();
  36. return str;
  37. }