commit 538ada9

Devine Lu Linvega  ·  2025-01-23 23:43:21 +0000 UTC
parent 330fec4
(file.c) Returned put_text()
1 files changed,  +33, -23
+33, -23
  1@@ -44,16 +44,6 @@ typedef struct {
  2 
  3 static UxnFile ufs[2];
  4 
  5-static void
  6-join_pathfile(char *res, char *path, char *file)
  7-{
  8-	char c = '/';
  9-	while(*path) c = *path++, *res = c, res++;
 10-	if(c != DIRCHAR) *res = DIRCHAR, res++;
 11-	while(*file) *res = *file++, res++;
 12-	*res = 0;
 13-}
 14-
 15 static int
 16 put_fill(Uint8 *dest, int len, char c)
 17 {
 18@@ -72,6 +62,16 @@ put_size(Uint8 *dest, int len, int size)
 19 	return len;
 20 }
 21 
 22+static int
 23+put_text(Uint8 *dest, const char *text)
 24+{
 25+	Uint8 *anchor = dest;
 26+	while(*text)
 27+		*dest = *text++, dest++;
 28+	*dest = 0;
 29+	return dest - anchor;
 30+}
 31+
 32 static int
 33 put_stat(Uint8 *dest, int len, int size, int err, int dir, int capsize)
 34 {
 35@@ -82,30 +82,41 @@ put_stat(Uint8 *dest, int len, int size, int err, int dir, int capsize)
 36 }
 37 
 38 static int
 39-put_statfile(Uint8 *dest, const char *filepath, const char *basename)
 40+put_statfile(Uint8 *dest, unsigned int len, const char *filepath, const char *basename)
 41 {
 42-	char c;
 43+	int err, dir;
 44 	struct stat st;
 45 	Uint8 *anchor = dest;
 46-	int err = stat(filepath, &st), dir = S_ISDIR(st.st_mode);
 47+	if(len < strlen(basename) + 8) return 0;
 48+	err = stat(filepath, &st);
 49+	dir = S_ISDIR(st.st_mode);
 50 	dest += put_stat(dest, 4, st.st_size, err, dir, 1);
 51-	*dest = ' ', dest++;
 52-	while((c = *basename++)) *dest = c, dest++;
 53-	if(dir) *dest = '/', dest++;
 54-	*dest = '\n', dest++;
 55+	dest += put_text(dest, " ");
 56+	dest += put_text(dest, basename);
 57+	dest += put_text(dest, dir ? "/\n" : "\n");
 58 	return dest - anchor;
 59 }
 60 
 61+static void
 62+make_pathfile(char *res, char *path, char *file)
 63+{
 64+	char c = '/';
 65+	while(*path) c = *path++, *res = c, res++;
 66+	if(c != DIRCHAR) *res = DIRCHAR, res++;
 67+	while(*file) *res = *file++, res++;
 68+	*res = 0;
 69+}
 70+
 71 static int
 72-put_fdir(Uint8 *dest, const char *filepath, DIR *dir)
 73+put_fdir(Uint8 *dest, int len, const char *filepath, DIR *dir)
 74 {
 75 	Uint8 *_dest = dest;
 76 	struct dirent *de = readdir(dir);
 77 	for(; de != NULL; de = readdir(dir))
 78 		if(de->d_name[0] != '.') {
 79 			static char res[0x2000];
 80-			join_pathfile(res, (char *)filepath, de->d_name);
 81-			dest += put_statfile(dest, res, de->d_name);
 82+			make_pathfile(res, (char *)filepath, de->d_name);
 83+			dest += put_statfile(dest, len, res, de->d_name);
 84 		}
 85 	return dest - _dest;
 86 }
 87@@ -115,8 +126,7 @@ is_dir_path(char *p)
 88 {
 89 	char c;
 90 	int saw_slash = 0;
 91-	while((c = *p++))
 92-		saw_slash = c == DIRCHAR;
 93+	while((c = *p++)) saw_slash = c == DIRCHAR;
 94 	return saw_slash;
 95 }
 96 
 97@@ -172,7 +182,7 @@ file_read(int id, Uint16 addr, int len)
 98 	if(ufs[id].state == FILE_READ)
 99 		return fread(dest, 1, len, ufs[id].f);
100 	if(ufs[id].state == DIR_READ)
101-		return put_fdir(dest, ufs[id].filepath, ufs[id].dir);
102+		return put_fdir(dest, len, ufs[id].filepath, ufs[id].dir);
103 	return 0;
104 }
105