dfs_seq_file.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * Copyright (c) 2006-2025 RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. */
  9. #ifndef __DFS_SEQ_FILE_H__
  10. #define __DFS_SEQ_FILE_H__
  11. #include <dfs.h>
  12. #include <dfs_fs.h>
  13. struct dfs_seq_ops;
  14. /**
  15. * Sequence file control structure
  16. */
  17. struct dfs_seq_file
  18. {
  19. char *buf; /* Data buffer pointer */
  20. size_t size; /* Total buffer size in bytes */
  21. size_t from; /* Start offset of valid data in buffer */
  22. size_t count; /* Length of valid data in buffer */
  23. size_t pad_until; /* Padding target position for alignment */
  24. off_t index; /* Current item index in sequence */
  25. off_t read_pos; /* Current read position in file */
  26. struct rt_mutex lock; /* Mutex for thread safety */
  27. const struct dfs_seq_ops *ops; /* Operation function table */
  28. const struct dfs_file *file; /* Associated file object */
  29. void *data; /* Private data pointer */
  30. };
  31. /**
  32. * Sequence file operations structure
  33. */
  34. struct dfs_seq_ops
  35. {
  36. void *(*start)(struct dfs_seq_file *seq, off_t *index); /* Start sequence traversal */
  37. void (*stop)(struct dfs_seq_file *seq, void *data); /* Stop sequence traversal */
  38. void *(*next)(struct dfs_seq_file *seq, void *data, off_t *index); /* Get next item in sequence */
  39. int (*show)(struct dfs_seq_file *seq, void *data); /* Show current item */
  40. };
  41. /**
  42. * check if the buffer is full
  43. */
  44. static inline rt_bool_t dfs_seq_is_full(struct dfs_seq_file *seq)
  45. {
  46. return seq->count == seq->size;
  47. }
  48. /**
  49. * set padding width size
  50. */
  51. static inline void dfs_seq_setwidth(struct dfs_seq_file *seq, size_t size)
  52. {
  53. seq->pad_until = seq->count + size;
  54. }
  55. int dfs_seq_open(struct dfs_file *file, const struct dfs_seq_ops *ops);
  56. ssize_t dfs_seq_read(struct dfs_file *file, void *buf, size_t size, off_t *pos);
  57. off_t dfs_seq_lseek(struct dfs_file *file, off_t offset, int whence);
  58. int dfs_seq_release(struct dfs_file *file);
  59. int dfs_seq_write(struct dfs_seq_file *seq, const void *data, size_t len);
  60. void dfs_seq_vprintf(struct dfs_seq_file *seq, const char *fmt, va_list args);
  61. void dfs_seq_printf(struct dfs_seq_file *seq, const char *fmt, ...);
  62. void dfs_seq_putc(struct dfs_seq_file *seq, char c);
  63. void dfs_seq_puts(struct dfs_seq_file *seq, const char *s);
  64. void dfs_seq_pad(struct dfs_seq_file *seq, char c);
  65. #endif