commit 60cf3aa
Devine Lu Linvega
·
2026-06-13 16:51:01 +0000 UTC
parent 4f919a2
Merged improvements to file device from uxncli
1 files changed,
+49,
-52
+49,
-52
1@@ -656,21 +656,6 @@ typedef struct {
2
3 static UxnFile ufs[2];
4
5-static unsigned int
6-make_pathfile(char *pathbuf, unsigned int len, const char *filepath, const char *basename)
7-{
8- char c = '/';
9- char *end = pathbuf + len - 1;
10- while(*filepath && pathbuf < end)
11- c = *filepath++, *pathbuf = c, pathbuf++;
12- if(c != '/' && pathbuf < end)
13- *pathbuf = '/', pathbuf++;
14- while(*basename && pathbuf < end)
15- *pathbuf = *basename++, pathbuf++;
16- *pathbuf = 0;
17- return *filepath || *basename;
18-}
19-
20 static inline unsigned int
21 put_text(Uint8 *dest, const char *text)
22 {
23@@ -681,15 +666,6 @@ put_text(Uint8 *dest, const char *text)
24 return dest - anchor;
25 }
26
27-static inline unsigned int
28-put_size(Uint8 *dest, unsigned int len, unsigned int size)
29-{
30- unsigned int i;
31- for(i = 0, dest += len; i < len; i++, size >>= 4)
32- *(--dest) = "0123456789abcdef"[(Uint8)(size & 0xf)];
33- return len;
34-}
35-
36 static unsigned int
37 put_stat(Uint8 *dest, unsigned int len, unsigned int size, unsigned int err, unsigned int dir, unsigned int capsize)
38 {
39@@ -706,14 +682,16 @@ put_stat(Uint8 *dest, unsigned int len, unsigned int size, unsigned int err, uns
40 }
41
42 static unsigned int
43-put_statfile(Uint8 *dest, const char *filepath, const char *basename)
44+put_statfile(Uint8 *dest, char *pathbuf, unsigned int prefix_len, unsigned int cap, const char *basename)
45 {
46 unsigned int err, dir;
47 struct stat st;
48 Uint8 *anchor = dest;
49- char pathbuf[0x200];
50- if(make_pathfile(pathbuf, sizeof pathbuf, filepath, basename))
51- return 0;
52+ char *p = pathbuf + prefix_len, *end = pathbuf + cap - 1;
53+ const char *b = basename;
54+ while(*b && p < end)
55+ *p++ = *b++;
56+ *p = 0;
57 err = stat(pathbuf, &st);
58 dir = !err && S_ISDIR(st.st_mode);
59 dest += put_stat(dest, 4, st.st_size, err, dir, 1);
60@@ -728,11 +706,19 @@ put_fdir(Uint8 *dest, unsigned int len, const char *filepath, DIR *dir)
61 {
62 Uint8 *p = dest, *end = dest + len - 1;
63 struct dirent *de;
64+ char pathbuf[0x200];
65+ unsigned int prefix_len = 0;
66+ char c = '/';
67+ const char *fp = filepath;
68+ while(*fp && prefix_len < sizeof pathbuf - 1)
69+ c = *fp++, pathbuf[prefix_len++] = c;
70+ if(c != '/' && prefix_len < sizeof pathbuf - 1)
71+ pathbuf[prefix_len++] = '/';
72 while((de = readdir(dir)) && p < end) {
73 const char *name = de->d_name;
74 if(name[0] == '.' && (!name[1] || (name[1] == '.' && !name[2])))
75 continue;
76- p += put_statfile(p, filepath, name);
77+ p += put_statfile(p, pathbuf, prefix_len, sizeof pathbuf, name);
78 }
79 *p = 0;
80 return p - dest;
81@@ -819,25 +805,6 @@ file_init(unsigned int id, Uint16 addr)
82 return 0;
83 }
84
85-static unsigned int
86-file_read(unsigned int id, Uint16 addr, unsigned int len)
87-{
88- void *dest = &ram[addr];
89- unsigned int n;
90- if(ufs[id].filepath == 0)
91- return 0;
92- if(addr + len > 0x10000)
93- len = 0x10000 - addr;
94- if(!file_open(id, 0, 0))
95- return 0;
96- if(ufs[id].state == FILE_READ)
97- n = fread(dest, 1, len, ufs[id].h.f);
98- else
99- n = put_fdir(dest, len, ufs[id].filepath, ufs[id].h.dir);
100- if(n == 0) file_reset(id);
101- return n;
102-}
103-
104 static unsigned int
105 file_write(unsigned int id, Uint16 addr, unsigned int len, Uint8 flags)
106 {
107@@ -847,10 +814,8 @@ file_write(unsigned int id, Uint16 addr, unsigned int len, Uint8 flags)
108 len = 0x10000 - addr;
109 if(!file_open(id, 1, flags))
110 return 0;
111- if(ufs[id].state == FILE_WRITE) {
112- unsigned int ret = fwrite(&ram[addr], 1, len, ufs[id].h.f);
113- return (ret > 0 && fflush(ufs[id].h.f) != 0) ? 0 : ret;
114- }
115+ if(ufs[id].state == FILE_WRITE)
116+ return fwrite(&ram[addr], 1, len, ufs[id].h.f);
117 return is_dir_real(ufs[id].filepath);
118 }
119
120@@ -863,11 +828,34 @@ file_stat(unsigned int id, Uint16 addr, unsigned int len)
121 return 0;
122 if(addr + len > 0x10000)
123 len = 0x10000 - addr;
124+ if(ufs[id].state == FILE_WRITE)
125+ fflush(ufs[id].h.f);
126 err = stat(ufs[id].filepath, &st);
127 dir = !err && S_ISDIR(st.st_mode);
128 return put_stat(&ram[addr], len, st.st_size, err, dir, 0);
129 }
130
131+static unsigned int
132+file_read(unsigned int id, Uint16 addr, unsigned int len)
133+{
134+ void *dest = &ram[addr];
135+ unsigned int n;
136+ if(ufs[id].filepath == 0)
137+ return 0;
138+ if(addr + len > 0x10000)
139+ len = 0x10000 - addr;
140+ if(ufs[id].state == FILE_WRITE)
141+ fflush(ufs[id].h.f);
142+ if(!file_open(id, 0, 0))
143+ return 0;
144+ if(ufs[id].state == FILE_READ)
145+ n = fread(dest, 1, len, ufs[id].h.f);
146+ else
147+ n = put_fdir(dest, len, ufs[id].filepath, ufs[id].h.dir);
148+ if(n == 0) file_reset(id);
149+ return n;
150+}
151+
152 static unsigned int
153 file_delete(unsigned int id)
154 {
155@@ -1132,6 +1120,15 @@ emu_restart(unsigned int soft)
156 uxn_eval(0x100);
157 }
158
159+static inline unsigned int
160+put_size(Uint8 *dest, unsigned int len, unsigned int size)
161+{
162+ unsigned int i;
163+ for(i = 0, dest += len; i < len; i++, size >>= 4)
164+ *(--dest) = "0123456789abcdef"[(Uint8)(size & 0xf)];
165+ return len;
166+}
167+
168 static void
169 emu_screenshot(void)
170 {