commit 330fec4
Devine Lu Linvega
·
2025-01-23 23:29:34 +0000 UTC
parent 9410c14
(file.c) Removed indirections
1 files changed,
+46,
-62
+46,
-62
1@@ -42,7 +42,17 @@ typedef struct {
2 } state;
3 } UxnFile;
4
5-static UxnFile uxn_file[2];
6+static UxnFile ufs[2];
7+
8+static void
9+join_pathfile(char *res, char *path, char *file)
10+{
11+ char c = '/';
12+ while(*path) c = *path++, *res = c, res++;
13+ if(c != DIRCHAR) *res = DIRCHAR, res++;
14+ while(*file) *res = *file++, res++;
15+ *res = 0;
16+}
17
18 static int
19 put_fill(Uint8 *dest, int len, char c)
20@@ -62,16 +72,6 @@ put_size(Uint8 *dest, int len, int size)
21 return len;
22 }
23
24-static int
25-put_text(Uint8 *dest, const char *text)
26-{
27- Uint8 *anchor = dest;
28- while(*text)
29- *dest = *text++, dest++;
30- *dest = 0;
31- return dest - anchor;
32-}
33-
34 static int
35 put_stat(Uint8 *dest, int len, int size, int err, int dir, int capsize)
36 {
37@@ -82,41 +82,30 @@ put_stat(Uint8 *dest, int len, int size, int err, int dir, int capsize)
38 }
39
40 static int
41-put_statfile(Uint8 *dest, unsigned int len, const char *filepath, const char *basename)
42+put_statfile(Uint8 *dest, const char *filepath, const char *basename)
43 {
44- int err, dir;
45+ char c;
46 struct stat st;
47 Uint8 *anchor = dest;
48- if(len < strlen(basename) + 8) return 0;
49- err = stat(filepath, &st);
50- dir = S_ISDIR(st.st_mode);
51+ int err = stat(filepath, &st), dir = S_ISDIR(st.st_mode);
52 dest += put_stat(dest, 4, st.st_size, err, dir, 1);
53- dest += put_text(dest, " ");
54- dest += put_text(dest, basename);
55- dest += put_text(dest, dir ? "/\n" : "\n");
56+ *dest = ' ', dest++;
57+ while((c = *basename++)) *dest = c, dest++;
58+ if(dir) *dest = '/', dest++;
59+ *dest = '\n', dest++;
60 return dest - anchor;
61 }
62
63-static void
64-make_pathfile(char *res, char *path, char *file)
65-{
66- char c = '/';
67- while(*path) c = *path++, *res = c, res++;
68- if(c != DIRCHAR) *res = DIRCHAR, res++;
69- while(*file) *res = *file++, res++;
70- *res = 0;
71-}
72-
73 static int
74-put_fdir(Uint8 *dest, int len, const char *filepath, DIR *dir)
75+put_fdir(Uint8 *dest, const char *filepath, DIR *dir)
76 {
77 Uint8 *_dest = dest;
78 struct dirent *de = readdir(dir);
79 for(; de != NULL; de = readdir(dir))
80 if(de->d_name[0] != '.') {
81 static char res[0x2000];
82- make_pathfile(res, (char *)filepath, de->d_name);
83- dest += put_statfile(dest, len, res, de->d_name);
84+ join_pathfile(res, (char *)filepath, de->d_name);
85+ dest += put_statfile(dest, res, de->d_name);
86 }
87 return dest - _dest;
88 }
89@@ -156,36 +145,34 @@ file_write_dir(char *p)
90 static void
91 file_reset(int id)
92 {
93- UxnFile *uf = &uxn_file[id];
94- if(uf->f != NULL) fclose(uf->f), uf->f = NULL;
95- if(uf->dir != NULL) closedir(uf->dir), uf->dir = NULL;
96- uf->state = IDLE;
97+ if(ufs[id].f != NULL) fclose(ufs[id].f), ufs[id].f = NULL;
98+ if(ufs[id].dir != NULL) closedir(ufs[id].dir), ufs[id].dir = NULL;
99+ ufs[id].state = IDLE;
100 }
101
102 static int
103 file_init(int id, Uint16 addr)
104 {
105 file_reset(id);
106- uxn_file[id].filepath = (char *)&uxn.ram[addr];
107+ ufs[id].filepath = (char *)&uxn.ram[addr];
108 return 0;
109 }
110
111 static int
112 file_read(int id, Uint16 addr, int len)
113 {
114- UxnFile *uf = &uxn_file[id];
115 void *dest = &uxn.ram[addr];
116- if(uf->state != FILE_READ && uf->state != DIR_READ) {
117+ if(ufs[id].state != FILE_READ && ufs[id].state != DIR_READ) {
118 file_reset(id);
119- if((uf->dir = opendir(uf->filepath)) != NULL)
120- uf->state = DIR_READ;
121- else if((uf->f = fopen(uf->filepath, "rb")) != NULL)
122- uf->state = FILE_READ;
123+ if((ufs[id].dir = opendir(ufs[id].filepath)) != NULL)
124+ ufs[id].state = DIR_READ;
125+ else if((ufs[id].f = fopen(ufs[id].filepath, "rb")) != NULL)
126+ ufs[id].state = FILE_READ;
127 }
128- if(uf->state == FILE_READ)
129- return fread(dest, 1, len, uf->f);
130- if(uf->state == DIR_READ)
131- return put_fdir(dest, len, uf->filepath, uf->dir);
132+ if(ufs[id].state == FILE_READ)
133+ return fread(dest, 1, len, ufs[id].f);
134+ if(ufs[id].state == DIR_READ)
135+ return put_fdir(dest, ufs[id].filepath, ufs[id].dir);
136 return 0;
137 }
138
139@@ -193,37 +180,34 @@ static int
140 file_write(int id, Uint16 addr, int len, Uint8 flags)
141 {
142 int ret = 0;
143- UxnFile *uf = &uxn_file[id];
144- file_write_dir(uf->filepath);
145- if(uf->state != FILE_WRITE && uf->state != DIR_WRITE) {
146+ file_write_dir(ufs[id].filepath);
147+ if(ufs[id].state != FILE_WRITE && ufs[id].state != DIR_WRITE) {
148 file_reset(id);
149- if(is_dir_path(uf->filepath))
150- uf->state = DIR_WRITE;
151- else if((uf->f = fopen(uf->filepath, (flags & 0x01) ? "ab" : "wb")) != NULL)
152- uf->state = FILE_WRITE;
153+ if(is_dir_path(ufs[id].filepath))
154+ ufs[id].state = DIR_WRITE;
155+ else if((ufs[id].f = fopen(ufs[id].filepath, (flags & 0x01) ? "ab" : "wb")) != NULL)
156+ ufs[id].state = FILE_WRITE;
157 }
158- if(uf->state == FILE_WRITE)
159- if((ret = fwrite(&uxn.ram[addr], 1, len, uf->f)) > 0 && fflush(uf->f) != 0)
160+ if(ufs[id].state == FILE_WRITE)
161+ if((ret = fwrite(&uxn.ram[addr], 1, len, ufs[id].f)) > 0 && fflush(ufs[id].f) != 0)
162 ret = 0;
163- if(uf->state == DIR_WRITE)
164- ret = is_dir_real(uf->filepath);
165+ if(ufs[id].state == DIR_WRITE)
166+ ret = is_dir_real(ufs[id].filepath);
167 return ret;
168 }
169
170 static int
171 file_stat(int id, Uint16 addr, int len)
172 {
173- int err, dir;
174 struct stat st;
175- err = stat(uxn_file[id].filepath, &st);
176- dir = S_ISDIR(st.st_mode);
177+ int err = stat(ufs[id].filepath, &st), dir = S_ISDIR(st.st_mode);
178 return put_stat(&uxn.ram[addr], len, st.st_size, err, dir, 0);
179 }
180
181 static int
182 file_delete(int id)
183 {
184- return unlink(uxn_file[id].filepath);
185+ return unlink(ufs[id].filepath);
186 }
187
188 static void