commit 330fec4

Devine Lu Linvega  ·  2025-01-23 23:29:34 +0000 UTC
parent 9410c14
(file.c) Removed indirections
1 files changed,  +46, -62
+46, -62
  1@@ -42,7 +42,17 @@ typedef struct {
  2 	} state;
  3 } UxnFile;
  4 
  5-static UxnFile uxn_file[2];
  6+static UxnFile ufs[2];
  7+
  8+static void
  9+join_pathfile(char *res, char *path, char *file)
 10+{
 11+	char c = '/';
 12+	while(*path) c = *path++, *res = c, res++;
 13+	if(c != DIRCHAR) *res = DIRCHAR, res++;
 14+	while(*file) *res = *file++, res++;
 15+	*res = 0;
 16+}
 17 
 18 static int
 19 put_fill(Uint8 *dest, int len, char c)
 20@@ -62,16 +72,6 @@ put_size(Uint8 *dest, int len, int size)
 21 	return len;
 22 }
 23 
 24-static int
 25-put_text(Uint8 *dest, const char *text)
 26-{
 27-	Uint8 *anchor = dest;
 28-	while(*text)
 29-		*dest = *text++, dest++;
 30-	*dest = 0;
 31-	return dest - anchor;
 32-}
 33-
 34 static int
 35 put_stat(Uint8 *dest, int len, int size, int err, int dir, int capsize)
 36 {
 37@@ -82,41 +82,30 @@ put_stat(Uint8 *dest, int len, int size, int err, int dir, int capsize)
 38 }
 39 
 40 static int
 41-put_statfile(Uint8 *dest, unsigned int len, const char *filepath, const char *basename)
 42+put_statfile(Uint8 *dest, const char *filepath, const char *basename)
 43 {
 44-	int err, dir;
 45+	char c;
 46 	struct stat st;
 47 	Uint8 *anchor = dest;
 48-	if(len < strlen(basename) + 8) return 0;
 49-	err = stat(filepath, &st);
 50-	dir = S_ISDIR(st.st_mode);
 51+	int err = stat(filepath, &st), dir = S_ISDIR(st.st_mode);
 52 	dest += put_stat(dest, 4, st.st_size, err, dir, 1);
 53-	dest += put_text(dest, " ");
 54-	dest += put_text(dest, basename);
 55-	dest += put_text(dest, dir ? "/\n" : "\n");
 56+	*dest = ' ', dest++;
 57+	while((c = *basename++)) *dest = c, dest++;
 58+	if(dir) *dest = '/', dest++;
 59+	*dest = '\n', dest++;
 60 	return dest - anchor;
 61 }
 62 
 63-static void
 64-make_pathfile(char *res, char *path, char *file)
 65-{
 66-	char c = '/';
 67-	while(*path) c = *path++, *res = c, res++;
 68-	if(c != DIRCHAR) *res = DIRCHAR, res++;
 69-	while(*file) *res = *file++, res++;
 70-	*res = 0;
 71-}
 72-
 73 static int
 74-put_fdir(Uint8 *dest, int len, const char *filepath, DIR *dir)
 75+put_fdir(Uint8 *dest, const char *filepath, DIR *dir)
 76 {
 77 	Uint8 *_dest = dest;
 78 	struct dirent *de = readdir(dir);
 79 	for(; de != NULL; de = readdir(dir))
 80 		if(de->d_name[0] != '.') {
 81 			static char res[0x2000];
 82-			make_pathfile(res, (char *)filepath, de->d_name);
 83-			dest += put_statfile(dest, len, res, de->d_name);
 84+			join_pathfile(res, (char *)filepath, de->d_name);
 85+			dest += put_statfile(dest, res, de->d_name);
 86 		}
 87 	return dest - _dest;
 88 }
 89@@ -156,36 +145,34 @@ file_write_dir(char *p)
 90 static void
 91 file_reset(int id)
 92 {
 93-	UxnFile *uf = &uxn_file[id];
 94-	if(uf->f != NULL) fclose(uf->f), uf->f = NULL;
 95-	if(uf->dir != NULL) closedir(uf->dir), uf->dir = NULL;
 96-	uf->state = IDLE;
 97+	if(ufs[id].f != NULL) fclose(ufs[id].f), ufs[id].f = NULL;
 98+	if(ufs[id].dir != NULL) closedir(ufs[id].dir), ufs[id].dir = NULL;
 99+	ufs[id].state = IDLE;
100 }
101 
102 static int
103 file_init(int id, Uint16 addr)
104 {
105 	file_reset(id);
106-	uxn_file[id].filepath = (char *)&uxn.ram[addr];
107+	ufs[id].filepath = (char *)&uxn.ram[addr];
108 	return 0;
109 }
110 
111 static int
112 file_read(int id, Uint16 addr, int len)
113 {
114-	UxnFile *uf = &uxn_file[id];
115 	void *dest = &uxn.ram[addr];
116-	if(uf->state != FILE_READ && uf->state != DIR_READ) {
117+	if(ufs[id].state != FILE_READ && ufs[id].state != DIR_READ) {
118 		file_reset(id);
119-		if((uf->dir = opendir(uf->filepath)) != NULL)
120-			uf->state = DIR_READ;
121-		else if((uf->f = fopen(uf->filepath, "rb")) != NULL)
122-			uf->state = FILE_READ;
123+		if((ufs[id].dir = opendir(ufs[id].filepath)) != NULL)
124+			ufs[id].state = DIR_READ;
125+		else if((ufs[id].f = fopen(ufs[id].filepath, "rb")) != NULL)
126+			ufs[id].state = FILE_READ;
127 	}
128-	if(uf->state == FILE_READ)
129-		return fread(dest, 1, len, uf->f);
130-	if(uf->state == DIR_READ)
131-		return put_fdir(dest, len, uf->filepath, uf->dir);
132+	if(ufs[id].state == FILE_READ)
133+		return fread(dest, 1, len, ufs[id].f);
134+	if(ufs[id].state == DIR_READ)
135+		return put_fdir(dest, ufs[id].filepath, ufs[id].dir);
136 	return 0;
137 }
138 
139@@ -193,37 +180,34 @@ static int
140 file_write(int id, Uint16 addr, int len, Uint8 flags)
141 {
142 	int ret = 0;
143-	UxnFile *uf = &uxn_file[id];
144-	file_write_dir(uf->filepath);
145-	if(uf->state != FILE_WRITE && uf->state != DIR_WRITE) {
146+	file_write_dir(ufs[id].filepath);
147+	if(ufs[id].state != FILE_WRITE && ufs[id].state != DIR_WRITE) {
148 		file_reset(id);
149-		if(is_dir_path(uf->filepath))
150-			uf->state = DIR_WRITE;
151-		else if((uf->f = fopen(uf->filepath, (flags & 0x01) ? "ab" : "wb")) != NULL)
152-			uf->state = FILE_WRITE;
153+		if(is_dir_path(ufs[id].filepath))
154+			ufs[id].state = DIR_WRITE;
155+		else if((ufs[id].f = fopen(ufs[id].filepath, (flags & 0x01) ? "ab" : "wb")) != NULL)
156+			ufs[id].state = FILE_WRITE;
157 	}
158-	if(uf->state == FILE_WRITE)
159-		if((ret = fwrite(&uxn.ram[addr], 1, len, uf->f)) > 0 && fflush(uf->f) != 0)
160+	if(ufs[id].state == FILE_WRITE)
161+		if((ret = fwrite(&uxn.ram[addr], 1, len, ufs[id].f)) > 0 && fflush(ufs[id].f) != 0)
162 			ret = 0;
163-	if(uf->state == DIR_WRITE)
164-		ret = is_dir_real(uf->filepath);
165+	if(ufs[id].state == DIR_WRITE)
166+		ret = is_dir_real(ufs[id].filepath);
167 	return ret;
168 }
169 
170 static int
171 file_stat(int id, Uint16 addr, int len)
172 {
173-	int err, dir;
174 	struct stat st;
175-	err = stat(uxn_file[id].filepath, &st);
176-	dir = S_ISDIR(st.st_mode);
177+	int err = stat(ufs[id].filepath, &st), dir = S_ISDIR(st.st_mode);
178 	return put_stat(&uxn.ram[addr], len, st.st_size, err, dir, 0);
179 }
180 
181 static int
182 file_delete(int id)
183 {
184-	return unlink(uxn_file[id].filepath);
185+	return unlink(ufs[id].filepath);
186 }
187 
188 static void