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))