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