commit 05b90c9

Devine Lu Linvega  ·  2025-01-22 18:35:44 +0000 UTC
parent c1320e9
Progress on file cleanup
2 files changed,  +46, -31
+19, -4
 1@@ -6,19 +6,34 @@
 2 |100
 3 
 4 @on-reset ( -> )
 5+	( | stat )
 6 	;file .File/name DEO2
 7 	#0004 .File/length DEO2
 8-	;mem .File/stat DEO2
 9-	;mem <pstr>
10-	#0a18 DEO
11+	;stat-mem DUP2 .File/stat DEO2
12+	<pstr>
13+	( | stat missing )
14+	;file-missing .File/name DEO2
15+	#0004 .File/length DEO2
16+	;stat-mem DUP2 .File/stat DEO2
17+	<pstr>
18+	( | dir )
19+	;dir .File/name DEO2
20+	#0200 .File/length DEO2
21+	;mem DUP2 .File/read DEO2
22+	<pstr>
23 	BRK
24 
25 @<pstr> ( str* -- )
26 	LDAk #18 DEO
27 	INC2 LDAk ?<pstr>
28-	POP2 JMP2r
29+	POP2 #0a18 DEO
30+	JMP2r
31 
32 @file "README.md $1
33+@file-missing "WHAT.md $1
34+@dir ". $1
35+
36+@stat-mem $5
37 
38 @mem "........
39 
+27, -27
 1@@ -77,6 +77,31 @@ put_size(Uint8 *dest, Uint16 len, off_t size)
 2 	return len;
 3 }
 4 
 5+static Uint16
 6+put_stat(char *dest, Uint16 len, const char *filepath, int capsize)
 7+{
 8+	struct stat st;
 9+	if(stat(filepath, &st))
10+		return put_fill(dest, len, '!');
11+	else if(S_ISDIR(st.st_mode))
12+		return put_fill(dest, len, '-');
13+	else if(capsize && st.st_size >= 0x10000)
14+		return put_fill(dest, len, '?');
15+	else
16+		return put_size(dest, len, st.st_size);
17+}
18+
19+static Uint16
20+put_statfile(char *dest, Uint16 len, const char *pathname, const char *basename)
21+{
22+	struct stat st;
23+	if(len < strlen(basename) + 8)
24+		return 0;
25+	stat(pathname, &st);
26+	dest += put_stat(dest, 4, pathname, 1);
27+	return snprintf(dest + , len, S_ISDIR(st.st_mode) ? " %s/\n" : " %s\n", basename) + 4;
28+}
29+
30 static void
31 file_reset(UxnFile *c)
32 {
33@@ -89,22 +114,6 @@ file_reset(UxnFile *c)
34 	c->outside_sandbox = 0;
35 }
36 
37-static Uint16
38-get_entry(char *p, Uint16 len, const char *pathname, const char *basename)
39-{
40-	struct stat st;
41-	if(len < strlen(basename) + 8)
42-		return 0;
43-	if(stat(pathname, &st))
44-		return snprintf(p, len, "!!!! %s\n", basename);
45-	else if(S_ISDIR(st.st_mode))
46-		return snprintf(p, len, "---- %s/\n", basename);
47-	else if(st.st_size < 0x10000)
48-		return snprintf(p, len, "%04x %s\n", (unsigned int)st.st_size, basename);
49-	else
50-		return snprintf(p, len, "???? %s\n", basename);
51-}
52-
53 static Uint16
54 file_read_dir(UxnFile *c, char *dest, Uint16 len)
55 {
56@@ -133,7 +142,7 @@ file_read_dir(UxnFile *c, char *dest, Uint16 len)
57 			snprintf(pathname, sizeof(pathname), "%s/%s", c->current_filename, c->de->d_name);
58 		else
59 			pathname[0] = '\0';
60-		n = get_entry(p, len, pathname, c->de->d_name);
61+		n = put_statfile(p, len, pathname, c->de->d_name);
62 		if(!n) break;
63 		p += n;
64 		len -= n;
65@@ -291,18 +300,9 @@ file_write(UxnFile *c, Uint16 addr, Uint16 len, Uint8 flags)
66 static Uint16
67 file_stat(UxnFile *c, Uint16 addr, Uint16 len)
68 {
69-	struct stat st;
70-	void *dest = &uxn.ram[addr];
71-	if(len > 0x10000 - addr)
72-		len = 0x10000 - addr;
73 	if(c->outside_sandbox)
74 		return 0;
75-	else if(stat(c->current_filename, &st))
76-		return put_fill(dest, len, '!');
77-	else if(S_ISDIR(st.st_mode))
78-		return put_fill(dest, len, '-');
79-	else
80-		return put_size(dest, len, st.st_size);
81+	return put_stat(&uxn.ram[addr], len, c->current_filename, 0);
82 }
83 
84 static Uint16