stream_cache.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "stream_cache.h"
  2. #define STREAM_CACHE_MAX_SIZE 1024U
  3. struct StreamCache {
  4. uint8_t data[STREAM_CACHE_MAX_SIZE];
  5. size_t data_size;
  6. size_t position;
  7. };
  8. StreamCache* stream_cache_alloc() {
  9. StreamCache* cache = malloc(sizeof(StreamCache));
  10. cache->data_size = 0;
  11. cache->position = 0;
  12. return cache;
  13. }
  14. void stream_cache_free(StreamCache* cache) {
  15. furi_assert(cache);
  16. cache->data_size = 0;
  17. cache->position = 0;
  18. free(cache);
  19. }
  20. void stream_cache_drop(StreamCache* cache) {
  21. cache->data_size = 0;
  22. cache->position = 0;
  23. }
  24. bool stream_cache_at_end(StreamCache* cache) {
  25. furi_assert(cache->data_size >= cache->position);
  26. return cache->data_size == cache->position;
  27. }
  28. size_t stream_cache_size(StreamCache* cache) {
  29. return cache->data_size;
  30. }
  31. size_t stream_cache_pos(StreamCache* cache) {
  32. return cache->position;
  33. }
  34. size_t stream_cache_fill(StreamCache* cache, Stream* stream) {
  35. const size_t size_read = stream_read(stream, cache->data, STREAM_CACHE_MAX_SIZE);
  36. cache->data_size = size_read;
  37. cache->position = 0;
  38. return size_read;
  39. }
  40. size_t stream_cache_read(StreamCache* cache, uint8_t* data, size_t size) {
  41. furi_assert(cache->data_size >= cache->position);
  42. const size_t size_read = MIN(size, cache->data_size - cache->position);
  43. if(size_read > 0) {
  44. memcpy(data, cache->data + cache->position, size_read);
  45. cache->position += size_read;
  46. }
  47. return size_read;
  48. }
  49. int32_t stream_cache_seek(StreamCache* cache, int32_t offset) {
  50. furi_assert(cache->data_size >= cache->position);
  51. int32_t actual_offset = 0;
  52. if(offset > 0) {
  53. actual_offset = MIN(cache->data_size - cache->position, (size_t)offset);
  54. } else if(offset < 0) {
  55. actual_offset = -MIN(cache->position, (size_t)abs(offset));
  56. }
  57. cache->position += actual_offset;
  58. return actual_offset;
  59. }