... | ... |
@@ -48,13 +48,6 @@ reset(void) |
48 | 48 |
state = IDLE; |
49 | 49 |
} |
50 | 50 |
|
51 |
-void |
|
52 |
-file_prepare(void *filename) |
|
53 |
-{ |
|
54 |
- reset(); |
|
55 |
- current_filename = (char *)filename; |
|
56 |
-} |
|
57 |
- |
|
58 | 51 |
static Uint16 |
59 | 52 |
get_entry(char *p, Uint16 len, const char *pathname, const char *basename, int fail_nonzero) |
60 | 53 |
{ |
... | ... |
@@ -76,6 +69,35 @@ get_entry(char *p, Uint16 len, const char *pathname, const char *basename, int f |
76 | 69 |
return strlen(p); |
77 | 70 |
} |
78 | 71 |
|
72 |
+static Uint16 |
|
73 |
+file_read_dir(void *dest, Uint16 len) |
|
74 |
+{ |
|
75 |
+ static char pathname[PATH_MAX]; |
|
76 |
+ char *p = dest; |
|
77 |
+ if(de == NULL) de = readdir(d); |
|
78 |
+ for(; de != NULL; de = readdir(d)) { |
|
79 |
+ Uint16 n; |
|
80 |
+ if(de->d_name[0] == '.' && de->d_name[1] == '\0') |
|
81 |
+ continue; |
|
82 |
+ strncpy(pathname, current_filename, sizeof(pathname) - 1); |
|
83 |
+ strncat(pathname, "/", sizeof(pathname) - 1); |
|
84 |
+ strncat(pathname, de->d_name, sizeof(pathname) - 1); |
|
85 |
+ n = get_entry(p, len, pathname, de->d_name, 1); |
|
86 |
+ if(!n) break; |
|
87 |
+ p += n; |
|
88 |
+ len -= n; |
|
89 |
+ } |
|
90 |
+ return p - (char *)dest; |
|
91 |
+} |
|
92 |
+ |
|
93 |
+Uint16 |
|
94 |
+file_init(void *filename) |
|
95 |
+{ |
|
96 |
+ reset(); |
|
97 |
+ current_filename = (char *)filename; |
|
98 |
+ return 0; |
|
99 |
+} |
|
100 |
+ |
|
79 | 101 |
Uint16 |
80 | 102 |
file_read(void *dest, Uint16 len) |
81 | 103 |
{ |
... | ... |
@@ -88,24 +110,8 @@ file_read(void *dest, Uint16 len) |
88 | 110 |
} |
89 | 111 |
if(state == FILE_READ) |
90 | 112 |
return fread(dest, 1, len, f); |
91 |
- if(state == DIR_READ) { |
|
92 |
- static char pathname[PATH_MAX]; |
|
93 |
- char *p = dest; |
|
94 |
- if(de == NULL) de = readdir(d); |
|
95 |
- for(; de != NULL; de = readdir(d)) { |
|
96 |
- Uint16 n; |
|
97 |
- if(de->d_name[0] == '.' && de->d_name[1] == '\0') |
|
98 |
- continue; |
|
99 |
- strncpy(pathname, current_filename, sizeof(pathname) - 1); |
|
100 |
- strncat(pathname, "/", sizeof(pathname) - 1); |
|
101 |
- strncat(pathname, de->d_name, sizeof(pathname) - 1); |
|
102 |
- n = get_entry(p, len, pathname, de->d_name, 1); |
|
103 |
- if(!n) break; |
|
104 |
- p += n; |
|
105 |
- len -= n; |
|
106 |
- } |
|
107 |
- return p - (char *)dest; |
|
108 |
- } |
|
113 |
+ if(state == DIR_READ) |
|
114 |
+ return file_read_dir(dest, len); |
|
109 | 115 |
return 0; |
110 | 116 |
} |
111 | 117 |
|
... | ... |
@@ -10,7 +10,7 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
10 | 10 |
WITH REGARD TO THIS SOFTWARE. |
11 | 11 |
*/ |
12 | 12 |
|
13 |
-void file_prepare(void *filename); |
|
13 |
+Uint16 file_init(void *filename); |
|
14 | 14 |
Uint16 file_read(void *dest, Uint16 len); |
15 | 15 |
Uint16 file_write(void *src, Uint16 len, Uint8 flags); |
16 | 16 |
Uint16 file_stat(void *dest, Uint16 len); |
... | ... |
@@ -80,24 +80,12 @@ static void |
80 | 80 |
file_deo(Device *d, Uint8 port) |
81 | 81 |
{ |
82 | 82 |
switch(port) { |
83 |
- case 0x1: |
|
84 |
- d->vector = peek16(d->dat, 0x0); |
|
85 |
- break; |
|
86 |
- case 0x9: |
|
87 |
- file_prepare(&d->mem[peek16(d->dat, 0x8)]); |
|
88 |
- break; |
|
89 |
- case 0xd: |
|
90 |
- poke16(d->dat, 0x2, file_read(&d->mem[peek16(d->dat, 0xc)], peek16(d->dat, 0xa))); |
|
91 |
- break; |
|
92 |
- case 0xf: |
|
93 |
- poke16(d->dat, 0x2, file_write(&d->mem[peek16(d->dat, 0xe)], peek16(d->dat, 0xa), d->dat[0x7])); |
|
94 |
- break; |
|
95 |
- case 0x5: |
|
96 |
- poke16(d->dat, 0x2, file_stat(&d->mem[peek16(d->dat, 0x4)], peek16(d->dat, 0xa))); |
|
97 |
- break; |
|
98 |
- case 0x6: |
|
99 |
- poke16(d->dat, 0x2, file_delete()); |
|
100 |
- break; |
|
83 |
+ case 0x1: d->vector = peek16(d->dat, 0x0); break; |
|
84 |
+ case 0x9: poke16(d->dat, 0x2, file_init(&d->mem[peek16(d->dat, 0x8)])); break; |
|
85 |
+ case 0xd: poke16(d->dat, 0x2, file_read(&d->mem[peek16(d->dat, 0xc)], peek16(d->dat, 0xa))); break; |
|
86 |
+ case 0xf: poke16(d->dat, 0x2, file_write(&d->mem[peek16(d->dat, 0xe)], peek16(d->dat, 0xa), d->dat[0x7])); break; |
|
87 |
+ case 0x5: poke16(d->dat, 0x2, file_stat(&d->mem[peek16(d->dat, 0x4)], peek16(d->dat, 0xa))); break; |
|
88 |
+ case 0x6: poke16(d->dat, 0x2, file_delete()); break; |
|
101 | 89 |
} |
102 | 90 |
} |
103 | 91 |
|
... | ... |
@@ -372,24 +372,12 @@ static void |
372 | 372 |
file_deo(Device *d, Uint8 port) |
373 | 373 |
{ |
374 | 374 |
switch(port) { |
375 |
- case 0x1: |
|
376 |
- d->vector = peek16(d->dat, 0x0); |
|
377 |
- break; |
|
378 |
- case 0x9: |
|
379 |
- file_prepare(&d->mem[peek16(d->dat, 0x8)]); |
|
380 |
- break; |
|
381 |
- case 0xd: |
|
382 |
- poke16(d->dat, 0x2, file_read(&d->mem[peek16(d->dat, 0xc)], peek16(d->dat, 0xa))); |
|
383 |
- break; |
|
384 |
- case 0xf: |
|
385 |
- poke16(d->dat, 0x2, file_write(&d->mem[peek16(d->dat, 0xe)], peek16(d->dat, 0xa), d->dat[0x7])); |
|
386 |
- break; |
|
387 |
- case 0x5: |
|
388 |
- poke16(d->dat, 0x2, file_stat(&d->mem[peek16(d->dat, 0x4)], peek16(d->dat, 0xa))); |
|
389 |
- break; |
|
390 |
- case 0x6: |
|
391 |
- poke16(d->dat, 0x2, file_delete()); |
|
392 |
- break; |
|
375 |
+ case 0x1: d->vector = peek16(d->dat, 0x0); break; |
|
376 |
+ case 0x9: poke16(d->dat, 0x2, file_init(&d->mem[peek16(d->dat, 0x8)])); break; |
|
377 |
+ case 0xd: poke16(d->dat, 0x2, file_read(&d->mem[peek16(d->dat, 0xc)], peek16(d->dat, 0xa))); break; |
|
378 |
+ case 0xf: poke16(d->dat, 0x2, file_write(&d->mem[peek16(d->dat, 0xe)], peek16(d->dat, 0xa), d->dat[0x7])); break; |
|
379 |
+ case 0x5: poke16(d->dat, 0x2, file_stat(&d->mem[peek16(d->dat, 0x4)], peek16(d->dat, 0xa))); break; |
|
380 |
+ case 0x6: poke16(d->dat, 0x2, file_delete()); break; |
|
393 | 381 |
} |
394 | 382 |
} |
395 | 383 |
|