blob: b33cc5439c71fcc7e2f9c6a8f868651247a2538e [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001/*
2 * dirent.h
3 *
4 * Include functions implementing directory entry.
5 * head file.
6 *
7 * Copyright (C) knightray@gmail.com
8 *
9 * SPDX-License-Identifier: GPL-2.0+
10 */
11#ifndef _DIR_ENT_H
12#define _DIR_ENT_H
13
14#include "comdef.h"
15#include "pubstruct.h"
16
17/* Private structure definitions. */
18typedef struct _long_dir_entry{
19 ubyte ldir_ord;
20 uint16 ldir_name1[5];
21 ubyte ldir_attr;
22 ubyte ldir_type;
23 ubyte ldir_chksum;
24 uint16 ldir_name2[6];
25 uint16 ldir_fst_clus_lo;
26 uint16 ldir_name3[2];
27}__attribute__((packed)) long_dir_entry_t;
28
29/* Return value definitions. */
30#define DIRENTRY_OK (1)
31#define ERR_DIRENTRY_NOMORE_ENTRY (-1)
32#define ERR_DIRENTRY_NOT_FOUND (-2)
33#define ERR_DIRENTRY_DEVICE_FAIL (-3)
34
35/* Interface declaration. */
36
37int32
38dirent_find(
39 IN tdir_t * pdir,
40 IN byte * dirname,
41 OUT tdir_entry_t * pdir_entry
42);
43
44int32
45dirent_find_free_entry(
46 IN tdir_t * pdir,
47 IN tdir_entry_t * pdir_entry
48);
49
50int32
51dirent_get_next(
52 IN tdir_t * pdir,
53 OUT tdir_entry_t * pdir_entry
54);
55
56BOOL
57dirent_init(
58 IN byte * fname,
59 IN ubyte dir_attr,
60 IN byte use_long_name,
61 OUT tdir_entry_t * pdir_entry
62);
63
64tdir_entry_t *
65dirent_malloc(void
66);
67
68void
69dirent_release(
70 IN tdir_entry_t * pdir_entry
71);
72
73uint16
74dirent_get_cur_time(void
75);
76
77uint16
78dirent_get_cur_date(void
79);
80
81ubyte
82dirent_get_cur_time_tenth(void
83);
84
85BOOL
86dirent_is_empty(
87 IN tdir_t * pdir
88);
89
90#define _last_entry(pdir_entry) (pdir_entry->pdirent[pdir_entry->dirent_num - 1])
91
92#define dirent_get_clus(pdir_entry) \
93 _last_entry(pdir_entry).dir_fst_clus_hi << 16 | \
94 _last_entry(pdir_entry).dir_fst_clus_lo
95#define dirent_set_clus(pdir_entry, clus) {\
96 _last_entry(pdir_entry).dir_fst_clus_hi = (clus >> 16) & 0xFFFF; \
97 _last_entry(pdir_entry).dir_fst_clus_lo = clus & 0xFFFF; }
98
99#define dirent_get_file_size(pdir_entry) \
100 _last_entry(pdir_entry).dir_file_size
101#define dirent_set_file_size(pdir_entry, file_size) \
102 _last_entry(pdir_entry).dir_file_size = file_size
103
104#define dirent_update_lst_acc_date(pdir_entry) \
105 _last_entry(pdir_entry).dir_lst_acc_date = dirent_get_cur_date()
106
107#define dirent_update_wrt_time(pdir_entry) \
108 _last_entry(pdir_entry).dir_wrt_time = dirent_get_cur_time()
109
110#define dirent_update_wrt_date(pdir_entry) \
111 _last_entry(pdir_entry).dir_wrt_date = dirent_get_cur_date()
112
113#define dirent_get_dir_attr(pdir_entry) \
114 _last_entry(pdir_entry).dir_attr
115#define dirent_set_dir_attr(pdir_entry, dir_attr) \
116 _last_entry(pdir_entry).dir_attr = dir_attr & 0xFF
117
118#define dirent_get_crt_time_tenth(pdir_entry) \
119 _last_entry(pdir_entry).dir_crt_time_tenth
120#define dirent_get_crt_time(pdir_entry) \
121 _last_entry(pdir_entry).dir_crt_time
122#define dirent_get_crt_date(pdir_entry) \
123 _last_entry(pdir_entry).dir_crt_date
124
125#endif