file_helper.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #include "file_helper.h"
  2. const char flipper_file_eoln = '\n';
  3. const char flipper_file_eolr = '\r';
  4. bool file_helper_seek(File* file, int32_t offset) {
  5. uint64_t position = storage_file_tell(file);
  6. return storage_file_seek(file, position + offset, true);
  7. }
  8. bool file_helper_write_hex(File* file, const uint8_t* data, const uint16_t data_size) {
  9. const uint8_t byte_text_size = 3;
  10. char byte_text[byte_text_size];
  11. bool result = true;
  12. uint16_t bytes_written;
  13. for(uint8_t i = 0; i < data_size; i++) {
  14. snprintf(byte_text, byte_text_size, "%02X", data[i]);
  15. if(i != 0) {
  16. // space
  17. const char space = ' ';
  18. bytes_written = storage_file_write(file, &space, sizeof(char));
  19. if(bytes_written != sizeof(char)) {
  20. result = false;
  21. break;
  22. }
  23. }
  24. bytes_written = storage_file_write(file, &byte_text, strlen(byte_text));
  25. if(bytes_written != strlen(byte_text)) {
  26. result = false;
  27. break;
  28. }
  29. }
  30. return result;
  31. }
  32. bool file_helper_read_line(File* file, string_t str_result) {
  33. string_reset(str_result);
  34. const uint8_t buffer_size = 32;
  35. uint8_t buffer[buffer_size];
  36. do {
  37. uint16_t bytes_were_read = storage_file_read(file, buffer, buffer_size);
  38. // TODO process EOF
  39. if(bytes_were_read == 0) break;
  40. bool result = false;
  41. bool error = false;
  42. for(uint16_t i = 0; i < bytes_were_read; i++) {
  43. if(buffer[i] == flipper_file_eoln) {
  44. if(!file_helper_seek(file, i - bytes_were_read)) {
  45. error = true;
  46. break;
  47. }
  48. result = true;
  49. break;
  50. } else if(buffer[i] == flipper_file_eolr) {
  51. // Ignore
  52. } else {
  53. string_push_back(str_result, buffer[i]);
  54. }
  55. }
  56. if(result || error) {
  57. break;
  58. }
  59. } while(true);
  60. return string_size(str_result) != 0;
  61. }
  62. bool file_helper_seek_to_next_line(File* file) {
  63. const uint8_t buffer_size = 32;
  64. uint8_t buffer[buffer_size];
  65. bool result = false;
  66. bool error = false;
  67. do {
  68. uint16_t bytes_were_read = storage_file_read(file, buffer, buffer_size);
  69. if(bytes_were_read == 0) {
  70. if(storage_file_eof(file)) {
  71. result = true;
  72. break;
  73. }
  74. }
  75. for(uint16_t i = 0; i < bytes_were_read; i++) {
  76. if(buffer[i] == flipper_file_eoln) {
  77. if(!file_helper_seek(file, i - bytes_were_read)) {
  78. error = true;
  79. break;
  80. }
  81. result = true;
  82. break;
  83. }
  84. }
  85. if(result || error) {
  86. break;
  87. }
  88. } while(true);
  89. return result;
  90. }
  91. bool file_helper_read_value(File* file, string_t value, bool* last) {
  92. string_reset(value);
  93. const uint8_t buffer_size = 32;
  94. uint8_t buffer[buffer_size];
  95. bool result = false;
  96. bool error = false;
  97. while(true) {
  98. uint16_t bytes_were_read = storage_file_read(file, buffer, buffer_size);
  99. if(bytes_were_read == 0) {
  100. // check EOF
  101. if(storage_file_eof(file) && string_size(value) > 0) {
  102. result = true;
  103. *last = true;
  104. break;
  105. }
  106. }
  107. for(uint16_t i = 0; i < bytes_were_read; i++) {
  108. if(buffer[i] == flipper_file_eoln) {
  109. if(string_size(value) > 0) {
  110. if(!file_helper_seek(file, i - bytes_were_read)) {
  111. error = true;
  112. break;
  113. }
  114. result = true;
  115. *last = true;
  116. break;
  117. } else {
  118. error = true;
  119. }
  120. } else if(buffer[i] == ' ') {
  121. if(string_size(value) > 0) {
  122. if(!file_helper_seek(file, i - bytes_were_read)) {
  123. error = true;
  124. break;
  125. }
  126. result = true;
  127. *last = false;
  128. break;
  129. }
  130. } else if(buffer[i] == flipper_file_eolr) {
  131. // Ignore
  132. } else {
  133. string_push_back(value, buffer[i]);
  134. }
  135. }
  136. if(error || result) break;
  137. }
  138. return result;
  139. }
  140. bool file_helper_write(File* file, const void* data, uint16_t data_size) {
  141. uint16_t bytes_written = storage_file_write(file, data, data_size);
  142. return bytes_written == data_size;
  143. }
  144. bool file_helper_write_eol(File* file) {
  145. return file_helper_write(file, &flipper_file_eoln, sizeof(char));
  146. }
  147. bool file_helper_copy(File* file_from, File* file_to, uint64_t start_offset, uint64_t stop_offset) {
  148. bool result = false;
  149. const uint8_t buffer_size = 32;
  150. uint8_t buffer[buffer_size];
  151. uint64_t current_offset = start_offset;
  152. if(storage_file_seek(file_from, start_offset, true)) {
  153. do {
  154. int32_t bytes_count = MIN(buffer_size, stop_offset - current_offset);
  155. if(bytes_count <= 0) {
  156. result = true;
  157. break;
  158. }
  159. uint16_t bytes_were_read = storage_file_read(file_from, buffer, bytes_count);
  160. if(bytes_were_read != bytes_count) break;
  161. uint16_t bytes_were_written = storage_file_write(file_to, buffer, bytes_count);
  162. if(bytes_were_written != bytes_count) break;
  163. current_offset += bytes_count;
  164. } while(true);
  165. }
  166. return result;
  167. }