| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- #include "file_helper.h"
- const char flipper_file_eoln = '\n';
- const char flipper_file_eolr = '\r';
- bool file_helper_seek(File* file, int32_t offset) {
- uint64_t position = storage_file_tell(file);
- return storage_file_seek(file, position + offset, true);
- }
- bool file_helper_write_hex(File* file, const uint8_t* data, const uint16_t data_size) {
- const uint8_t byte_text_size = 3;
- char byte_text[byte_text_size];
- bool result = true;
- uint16_t bytes_written;
- for(uint8_t i = 0; i < data_size; i++) {
- snprintf(byte_text, byte_text_size, "%02X", data[i]);
- if(i != 0) {
- // space
- const char space = ' ';
- bytes_written = storage_file_write(file, &space, sizeof(char));
- if(bytes_written != sizeof(char)) {
- result = false;
- break;
- }
- }
- bytes_written = storage_file_write(file, &byte_text, strlen(byte_text));
- if(bytes_written != strlen(byte_text)) {
- result = false;
- break;
- }
- }
- return result;
- }
- bool file_helper_read_line(File* file, string_t str_result) {
- string_reset(str_result);
- const uint8_t buffer_size = 32;
- uint8_t buffer[buffer_size];
- do {
- uint16_t bytes_were_read = storage_file_read(file, buffer, buffer_size);
- // TODO process EOF
- if(bytes_were_read == 0) break;
- bool result = false;
- bool error = false;
- for(uint16_t i = 0; i < bytes_were_read; i++) {
- if(buffer[i] == flipper_file_eoln) {
- if(!file_helper_seek(file, i - bytes_were_read)) {
- error = true;
- break;
- }
- result = true;
- break;
- } else if(buffer[i] == flipper_file_eolr) {
- // Ignore
- } else {
- string_push_back(str_result, buffer[i]);
- }
- }
- if(result || error) {
- break;
- }
- } while(true);
- return string_size(str_result) != 0;
- }
- bool file_helper_seek_to_next_line(File* file) {
- const uint8_t buffer_size = 32;
- uint8_t buffer[buffer_size];
- bool result = false;
- bool error = false;
- do {
- uint16_t bytes_were_read = storage_file_read(file, buffer, buffer_size);
- if(bytes_were_read == 0) {
- if(storage_file_eof(file)) {
- result = true;
- break;
- }
- }
- for(uint16_t i = 0; i < bytes_were_read; i++) {
- if(buffer[i] == flipper_file_eoln) {
- if(!file_helper_seek(file, i - bytes_were_read)) {
- error = true;
- break;
- }
- result = true;
- break;
- }
- }
- if(result || error) {
- break;
- }
- } while(true);
- return result;
- }
- bool file_helper_read_value(File* file, string_t value, bool* last) {
- string_reset(value);
- const uint8_t buffer_size = 32;
- uint8_t buffer[buffer_size];
- bool result = false;
- bool error = false;
- while(true) {
- uint16_t bytes_were_read = storage_file_read(file, buffer, buffer_size);
- if(bytes_were_read == 0) {
- // check EOF
- if(storage_file_eof(file) && string_size(value) > 0) {
- result = true;
- *last = true;
- break;
- }
- }
- for(uint16_t i = 0; i < bytes_were_read; i++) {
- if(buffer[i] == flipper_file_eoln) {
- if(string_size(value) > 0) {
- if(!file_helper_seek(file, i - bytes_were_read)) {
- error = true;
- break;
- }
- result = true;
- *last = true;
- break;
- } else {
- error = true;
- }
- } else if(buffer[i] == ' ') {
- if(string_size(value) > 0) {
- if(!file_helper_seek(file, i - bytes_were_read)) {
- error = true;
- break;
- }
- result = true;
- *last = false;
- break;
- }
- } else if(buffer[i] == flipper_file_eolr) {
- // Ignore
- } else {
- string_push_back(value, buffer[i]);
- }
- }
- if(error || result) break;
- }
- return result;
- }
- bool file_helper_write(File* file, const void* data, uint16_t data_size) {
- uint16_t bytes_written = storage_file_write(file, data, data_size);
- return bytes_written == data_size;
- }
- bool file_helper_write_eol(File* file) {
- return file_helper_write(file, &flipper_file_eoln, sizeof(char));
- }
- bool file_helper_copy(File* file_from, File* file_to, uint64_t start_offset, uint64_t stop_offset) {
- bool result = false;
- const uint8_t buffer_size = 32;
- uint8_t buffer[buffer_size];
- uint64_t current_offset = start_offset;
- if(storage_file_seek(file_from, start_offset, true)) {
- do {
- int32_t bytes_count = MIN(buffer_size, stop_offset - current_offset);
- if(bytes_count <= 0) {
- result = true;
- break;
- }
- uint16_t bytes_were_read = storage_file_read(file_from, buffer, bytes_count);
- if(bytes_were_read != bytes_count) break;
- uint16_t bytes_were_written = storage_file_write(file_to, buffer, bytes_count);
- if(bytes_were_written != bytes_count) break;
- current_offset += bytes_count;
- } while(true);
- }
- return result;
- }
|