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 {