commit d8aac59
Devine Lu Linvega
·
2026-06-21 17:36:42 +0000 UTC
parent 898b19d
Fixed bug with truncated directory
1 files changed,
+45,
-26
+45,
-26
1@@ -655,38 +655,55 @@ typedef struct {
2 static UxnFile ufs[2];
3
4 static inline unsigned int
5-put_text(Uint8 *dest, const char *text)
6+put_text(Uint8 *dest, unsigned int *length, const char *text)
7 {
8 Uint8 *anchor = dest;
9- while(*text)
10+ while(*text && *length) {
11 *dest = *text++, dest++;
12+ *length = *length - 1;
13+ }
14 *dest = 0;
15 return dest - anchor;
16 }
17
18 static inline unsigned int
19-put_size(Uint8 *dest, unsigned int len, unsigned int size)
20+put_size(Uint8 *dest, unsigned int *length, unsigned int len, unsigned int size)
21 {
22 unsigned int i;
23- for(i = 0, dest += len; i < len; i++, size >>= 4)
24+ for(i = 0, dest += len; i < len && *length; i++) {
25 *(--dest) = "0123456789abcdef"[(Uint8)(size & 0xf)];
26+ size >>= 4;
27+ *length = *length - 1;
28+ }
29 return len;
30 }
31
32 static unsigned int
33-put_stat(Uint8 *dest, unsigned int len, unsigned int size, unsigned int err, unsigned int dir, unsigned int capsize)
34+put_fill(Uint8 *dest, unsigned int *length, unsigned int len, char c)
35 {
36- if(err || dir || (capsize && size >= 0x10000)) {
37- memset(dest, err ? '!' : dir ? '-' :
38- '?',
39- len);
40- return len;
41+ unsigned int i;
42+ for(i = 0; i < len && *length; i++) {
43+ *dest++ = c;
44+ *length = *length - 1;
45 }
46- return put_size(dest, len, size);
47+ return len;
48+}
49+
50+static unsigned int
51+put_stat(Uint8 *dest, unsigned int *length, unsigned int len, unsigned int size, unsigned int err, unsigned int dir)
52+{
53+ if(dir)
54+ return put_fill(dest, length, len, '-');
55+ else if(err)
56+ return put_fill(dest, length, len, '!');
57+ // TODO: Always check if fits in len
58+ else if(size >= 0x10000)
59+ return put_fill(dest, length, len, '?');
60+ return put_size(dest, length, len, size);
61 }
62
63 static unsigned int
64-put_statfile(Uint8 *dest, char *pathbuf, unsigned int prefix_len, unsigned int cap, const char *basename)
65+put_statfile(Uint8 *dest, unsigned int *length, char *pathbuf, unsigned int prefix_len, unsigned int cap, const char *basename)
66 {
67 unsigned int err, dir;
68 struct stat st;
69@@ -698,17 +715,17 @@ put_statfile(Uint8 *dest, char *pathbuf, unsigned int prefix_len, unsigned int c
70 *p = 0;
71 err = stat(pathbuf, &st);
72 dir = !err && S_ISDIR(st.st_mode);
73- dest += put_stat(dest, 4, st.st_size, err, dir, 1);
74- dest += put_text(dest, "\t");
75- dest += put_text(dest, basename);
76- dest += put_text(dest, dir ? "/\n" : "\n");
77+ dest += put_stat(dest, length, 4, st.st_size, err, dir);
78+ dest += put_text(dest, length, "\t");
79+ dest += put_text(dest, length, basename);
80+ dest += put_text(dest, length, dir ? "/\n" : "\n");
81 return dest - anchor;
82 }
83
84 static unsigned int
85-put_fdir(Uint8 *dest, unsigned int len, const char *filepath, DIR *dir)
86+put_fdir(Uint8 *dest, unsigned int *length, const char *filepath, DIR *dir)
87 {
88- Uint8 *p = dest, *end = dest + len - 1;
89+ Uint8 *p = dest, *end = dest + *length - 1;
90 struct dirent *de;
91 char pathbuf[0x200];
92 unsigned int prefix_len = 0;
93@@ -722,7 +739,7 @@ put_fdir(Uint8 *dest, unsigned int len, const char *filepath, DIR *dir)
94 const char *name = de->d_name;
95 if(name[0] == '.' && (!name[1] || (name[1] == '.' && !name[2])))
96 continue;
97- p += put_statfile(p, pathbuf, prefix_len, sizeof pathbuf, name);
98+ p += put_statfile(p, length, pathbuf, prefix_len, sizeof pathbuf, name);
99 }
100 *p = 0;
101 return p - dest;
102@@ -813,7 +830,7 @@ static unsigned int
103 file_read(unsigned int id, Uint16 addr, unsigned int len)
104 {
105 void *dest = &ram[addr];
106- unsigned int n;
107+ unsigned int n, length = len;
108 if(ufs[id].filepath == 0)
109 return 0;
110 if(addr + len > 0x10000)
111@@ -821,9 +838,9 @@ file_read(unsigned int id, Uint16 addr, unsigned int len)
112 if(!file_open(id, 0, 0))
113 return 0;
114 if(ufs[id].state == FILE_READ)
115- n = fread(dest, 1, len, ufs[id].h.f);
116+ n = fread(dest, 1, length, ufs[id].h.f);
117 else
118- n = put_fdir(dest, len, ufs[id].filepath, ufs[id].h.dir);
119+ n = put_fdir(dest, &length, ufs[id].filepath, ufs[id].h.dir);
120 if(n == 0) file_reset(id);
121 return n;
122 }
123@@ -848,6 +865,7 @@ static unsigned int
124 file_stat(unsigned int id, Uint16 addr, unsigned int len)
125 {
126 unsigned int err, dir;
127+ unsigned int length = len;
128 struct stat st;
129 if(ufs[id].filepath == 0)
130 return 0;
131@@ -855,7 +873,7 @@ file_stat(unsigned int id, Uint16 addr, unsigned int len)
132 len = 0x10000 - addr;
133 err = stat(ufs[id].filepath, &st);
134 dir = !err && S_ISDIR(st.st_mode);
135- return put_stat(&ram[addr], len, st.st_size, err, dir, 0);
136+ return put_stat(&ram[addr], &length, len, st.st_size, err, dir);
137 }
138
139 static unsigned int
140@@ -1122,9 +1140,10 @@ emu_screenshot(void)
141 {
142 FILE *f;
143 char filename[] = "_00x00.chr";
144+ unsigned int length = 4;
145 int tx, ty, row, col, tw = screen_width / 8, th = screen_height / 8;
146- put_size((Uint8 *)filename + 1, 2, tw);
147- put_size((Uint8 *)filename + 4, 2, th);
148+ put_size((Uint8 *)filename + 1, &length, 2, tw);
149+ put_size((Uint8 *)filename + 4, &length, 2, th);
150 f = fopen(filename, "wb");
151 if(f) {
152 for(ty = 0; ty < th; ty++) {
153@@ -1324,7 +1343,7 @@ main(int argc, char **argv)
154 {
155 int i = 1;
156 if(argc == 2 && argv[1][0] == '-' && argv[1][1] == 'v')
157- return !fprintf(stdout, "%s - Varvara Emulator(79K), 16 Jun 2026.\n", argv[0]);
158+ return !fprintf(stdout, "%s - Varvara Emulator(79K), 21 Jun 2026.\n", argv[0]);
159 else if(argc == 1)
160 return !fprintf(stdout, "usage: %s [-v] file.rom [args..]\n", argv[0]);
161 else if(!system_boot(argv[i++], argc > 2))