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];