summaryrefslogtreecommitdiff
path: root/components/dfs/dfs_v2/include/dfs_seq_file.h
blob: 2fa4f93e8e8a387930793bb9b89695fa03e194ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
 * Copyright (c) 2006-2025 RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 */

#ifndef __DFS_SEQ_FILE_H__
#define __DFS_SEQ_FILE_H__

#include <dfs.h>
#include <dfs_fs.h>

struct dfs_seq_ops;

/**
 * Sequence file control structure
 */
struct dfs_seq_file
{
    char *buf;          /* Data buffer pointer */
    size_t size;        /* Total buffer size in bytes */
    size_t from;        /* Start offset of valid data in buffer */
    size_t count;       /* Length of valid data in buffer */
    size_t pad_until;   /* Padding target position for alignment */

    off_t index;        /* Current item index in sequence */
    off_t read_pos;     /* Current read position in file */

    struct rt_mutex lock; /* Mutex for thread safety */

    const struct dfs_seq_ops *ops; /* Operation function table */
    const struct dfs_file *file;  /* Associated file object */
    void *data;         /* Private data pointer */
};

/**
 * Sequence file operations structure
 */
struct dfs_seq_ops
{
    void *(*start)(struct dfs_seq_file *seq, off_t *index);  /* Start sequence traversal */
    void (*stop)(struct dfs_seq_file *seq, void *data);      /* Stop sequence traversal */
    void *(*next)(struct dfs_seq_file *seq, void *data, off_t *index); /* Get next item in sequence */
    int (*show)(struct dfs_seq_file *seq, void *data);  /* Show current item */
};

/**
 * check if the buffer is full
 */
static inline rt_bool_t dfs_seq_is_full(struct dfs_seq_file *seq)
{
    return seq->count == seq->size;
}

/**
 * set padding width size
 */
static inline void dfs_seq_setwidth(struct dfs_seq_file *seq, size_t size)
{
    seq->pad_until = seq->count + size;
}

int dfs_seq_open(struct dfs_file *file, const struct dfs_seq_ops *ops);
ssize_t dfs_seq_read(struct dfs_file *file, void *buf, size_t size, off_t *pos);
off_t dfs_seq_lseek(struct dfs_file *file, off_t offset, int whence);
int dfs_seq_release(struct dfs_file *file);
int dfs_seq_write(struct dfs_seq_file *seq, const void *data, size_t len);

void dfs_seq_vprintf(struct dfs_seq_file *seq, const char *fmt, va_list args);
void dfs_seq_printf(struct dfs_seq_file *seq, const char *fmt, ...);
void dfs_seq_putc(struct dfs_seq_file *seq, char c);
void dfs_seq_puts(struct dfs_seq_file *seq, const char *s);
void dfs_seq_pad(struct dfs_seq_file *seq, char c);

#endif