sequential_file.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include "sequential_file.h"
  2. SequentialFile* sequential_file_create(Storage* storage, const char* dir, const char* prefix, const char* extension) {
  3. if (storage == NULL || dir == NULL || prefix == NULL || extension == NULL) {
  4. return NULL;
  5. }
  6. char file_path[256];
  7. File* file = storage_file_alloc(storage);
  8. int file_index = 0;
  9. do {
  10. snprintf(file_path, sizeof(file_path),
  11. "%s/%s_%d.%s",
  12. dir, prefix, file_index, extension);
  13. file_index++;
  14. } while(storage_file_exists(storage, file_path));
  15. if(!storage_file_open(file, file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) {
  16. storage_file_free(file);
  17. return NULL;
  18. }
  19. SequentialFile* sequential_file = (SequentialFile*) malloc(sizeof(SequentialFile));
  20. sequential_file->file = file;
  21. sequential_file->path = (char*) malloc(strlen(file_path) + 1);
  22. strcpy(sequential_file->path, file_path);
  23. sequential_file->file_index = file_index - 1;
  24. return sequential_file;
  25. }
  26. uint16_t sequential_file_write(SequentialFile* sequential_file, const void *buffer, uint16_t bytes_to_write) {
  27. if (sequential_file == NULL || sequential_file->file == NULL) {
  28. return 0;
  29. }
  30. return storage_file_write(sequential_file->file, buffer, bytes_to_write);
  31. }
  32. void sequential_file_free_destroy_file(SequentialFile* sequential_file) {
  33. if (sequential_file != NULL) {
  34. if (sequential_file->file != NULL) {
  35. storage_file_close(sequential_file->file);
  36. storage_file_free(sequential_file->file);
  37. }
  38. free(sequential_file->path);
  39. free(sequential_file);
  40. }
  41. }
  42. void sequential_file_free_close_file(SequentialFile* sequential_file) {
  43. if (sequential_file != NULL) {
  44. if (sequential_file->file != NULL) {
  45. storage_file_close(sequential_file->file);
  46. }
  47. free(sequential_file->path);
  48. free(sequential_file);
  49. }
  50. }