commit 7e1ac70
Devine Lu Linvega
·
2023-04-10 17:50:16 +0000 UTC
parent 1bda3b7
(file) Ported to PEEK2
4 files changed,
+32,
-43
+32,
-38
1@@ -11,6 +11,15 @@
2 #ifdef _WIN32
3 #include <libiberty/libiberty.h>
4 #define realpath(s, dummy) lrealpath(s)
5+#define DIR_SEP_CHAR '\\'
6+#define DIR_SEP_STR "\\"
7+#define pathcmp(path1, path2, length) strncasecmp(path1, path2, length) /* strncasecmp provided by libiberty */
8+#define notdriveroot(file_name) (file_name[0] != DIR_SEP_CHAR && ((strlen(file_name) > 2 && file_name[1] != ':') || strlen(file_name) <= 2))
9+#else
10+#define DIR_SEP_CHAR '/'
11+#define DIR_SEP_STR "/"
12+#define pathcmp(path1, path2, length) strncmp(path1, path2, length)
13+#define notdriveroot(file_name) (file_name[0] != DIR_SEP_CHAR)
14 #endif
15
16 #ifndef PATH_MAX
17@@ -65,16 +74,16 @@ static Uint16
18 get_entry(char *p, Uint16 len, const char *pathname, const char *basename, int fail_nonzero)
19 {
20 struct stat st;
21- if(len < strlen(basename) + 7)
22+ if(len < strlen(basename) + 8)
23 return 0;
24 if(stat(pathname, &st))
25- return fail_nonzero ? sprintf(p, "!!!! %s\n", basename) : 0;
26+ return fail_nonzero ? snprintf(p, len, "!!!! %s\n", basename) : 0;
27 else if(S_ISDIR(st.st_mode))
28- return sprintf(p, "---- %s/\n", basename);
29+ return snprintf(p, len, "---- %s/\n", basename);
30 else if(st.st_size < 0x10000)
31- return sprintf(p, "%04x %s\n", (unsigned int)st.st_size, basename);
32+ return snprintf(p, len, "%04x %s\n", (unsigned int)st.st_size, basename);
33 else
34- return sprintf(p, "???? %s\n", basename);
35+ return snprintf(p, len, "???? %s\n", basename);
36 }
37
38 static Uint16
39@@ -102,7 +111,7 @@ file_read_dir(UxnFile *c, char *dest, Uint16 len)
40 free(t);
41 }
42 if(strlen(c->current_filename) + 1 + strlen(c->de->d_name) < sizeof(pathname))
43- sprintf(pathname, "%s/%s", c->current_filename, c->de->d_name);
44+ snprintf(pathname, sizeof(pathname), "%s/%s", c->current_filename, c->de->d_name);
45 else
46 pathname[0] = '\0';
47 n = get_entry(p, len, pathname, c->de->d_name, 1);
48@@ -124,17 +133,17 @@ retry_realpath(const char *file_name)
49 errno = ENAMETOOLONG;
50 return NULL;
51 }
52- if(file_name[0] != '/') {
53+ if(notdriveroot(file_name)) {
54 /* TODO: use a macro instead of '/' for absolute path first character so that other systems can work */
55 /* if a relative path, prepend cwd */
56 getcwd(p, sizeof(p));
57- strcat(p, "/"); /* TODO: use a macro instead of '/' for the path delimiter */
58+ strcat(p, DIR_SEP_STR); /* TODO: use a macro instead of '/' for the path delimiter */
59 }
60 strcat(p, file_name);
61 while((r = realpath(p, NULL)) == NULL) {
62 if(errno != ENOENT)
63 return NULL;
64- x = strrchr(p, '/'); /* TODO: path delimiter macro */
65+ x = strrchr(p, DIR_SEP_CHAR); /* TODO: path delimiter macro */
66 if(x)
67 *x = '\0';
68 else
69@@ -149,7 +158,7 @@ file_check_sandbox(UxnFile *c)
70 char *x, *rp, cwd[PATH_MAX] = {'\0'};
71 x = getcwd(cwd, sizeof(cwd));
72 rp = retry_realpath(c->current_filename);
73- if(rp == NULL || (x && strncmp(cwd, rp, strlen(cwd)) != 0)) {
74+ if(rp == NULL || (x && pathcmp(cwd, rp, strlen(cwd)) != 0)) {
75 c->outside_sandbox = 1;
76 fprintf(stderr, "file warning: blocked attempt to access %s outside of sandbox\n", c->current_filename);
77 }
78@@ -213,7 +222,7 @@ file_write(UxnFile *c, void *src, Uint16 len, Uint8 flags)
79 static Uint16
80 file_stat(UxnFile *c, void *dest, Uint16 len)
81 {
82- char *basename = strrchr(c->current_filename, '/');
83+ char *basename = strrchr(c->current_filename, DIR_SEP_CHAR);
84 if(c->outside_sandbox) return 0;
85 if(basename != NULL)
86 basename++;
87@@ -237,52 +246,37 @@ file_deo(Uint8 id, Uint8 *ram, Uint8 *d, Uint8 port)
88 Uint16 addr, len, res;
89 switch(port) {
90 case 0x5:
91- PEKDEV(addr, 0x4);
92- PEKDEV(len, 0xa);
93+ addr = PEEK2(d + 0x4);
94+ len = PEEK2(d + 0xa);
95 if(len > 0x10000 - addr)
96 len = 0x10000 - addr;
97 res = file_stat(c, &ram[addr], len);
98- POKDEV(0x2, res);
99+ POKE2(d + 0x2, res);
100 break;
101 case 0x6:
102 res = file_delete(c);
103- POKDEV(0x2, res);
104+ POKE2(d + 0x2, res);
105 break;
106 case 0x9:
107- PEKDEV(addr, 0x8);
108+ addr = PEEK2(d + 0x8);
109 res = file_init(c, (char *)&ram[addr], 0x10000 - addr, 0);
110- POKDEV(0x2, res);
111+ POKE2(d + 0x2, res);
112 break;
113 case 0xd:
114- PEKDEV(addr, 0xc);
115- PEKDEV(len, 0xa);
116+ addr = PEEK2(d + 0xc);
117+ len = PEEK2(d + 0xa);
118 if(len > 0x10000 - addr)
119 len = 0x10000 - addr;
120 res = file_read(c, &ram[addr], len);
121- POKDEV(0x2, res);
122+ POKE2(d + 0x2, res);
123 break;
124 case 0xf:
125- PEKDEV(addr, 0xe);
126- PEKDEV(len, 0xa);
127+ addr = PEEK2(d + 0xe);
128+ len = PEEK2(d + 0xa);
129 if(len > 0x10000 - addr)
130 len = 0x10000 - addr;
131 res = file_write(c, &ram[addr], len, d[0x7]);
132- POKDEV(0x2, res);
133+ POKE2(d + 0x2, res);
134 break;
135 }
136 }
137-
138-Uint8
139-file_dei(Uint8 id, Uint8 *d, Uint8 port)
140-{
141- UxnFile *c = &uxn_file[id];
142- Uint16 res;
143- switch(port) {
144- case 0xc:
145- case 0xd:
146- res = file_read(c, &d[port], 1);
147- POKDEV(0x2, res);
148- break;
149- }
150- return d[port];
151-}
+0,
-1
1@@ -13,4 +13,3 @@ WITH REGARD TO THIS SOFTWARE.
2 #define DEV_FILE0 0xa
3
4 void file_deo(Uint8 id, Uint8 *ram, Uint8 *d, Uint8 port);
5-Uint8 file_dei(Uint8 id, Uint8 *d, Uint8 port);
+0,
-2
1@@ -53,8 +53,6 @@ emu_dei(Uxn *u, Uint8 addr)
2 Uint8 p = addr & 0x0f, d = addr & 0xf0;
3 switch(d) {
4 case 0x20: return screen_dei(u, addr);
5- case 0xa0: return file_dei(0, &u->dev[d], p);
6- case 0xb0: return file_dei(1, &u->dev[d], p);
7 case 0xc0: return datetime_dei(&u->dev[d], p);
8 }
9 return u->dev[addr];
+0,
-2
1@@ -50,8 +50,6 @@ emu_dei(Uxn *u, Uint8 addr)
2 {
3 Uint8 p = addr & 0x0f, d = addr & 0xf0;
4 switch(d) {
5- case 0xa0: return file_dei(0, &u->dev[d], p);
6- case 0xb0: return file_dei(1, &u->dev[d], p);
7 case 0xc0: return datetime_dei(&u->dev[d], p);
8 }
9 return u->dev[addr];