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