| ... | ... |
@@ -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 |
|