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