mirror of
https://github.com/dschmenk/apple2pi.git
synced 2024-11-27 17:51:42 +00:00
clean up cached_get_file_info a little
This commit is contained in:
parent
2eaf496d05
commit
b17af70266
@ -641,9 +641,9 @@ static int prodos_map_errno(int perr)
|
|||||||
static int cache_get_file_info(const char *path, int *access, int *type, int *aux, int *storage, int *numblks, int *size, int *mod, int *create)
|
static int cache_get_file_info(const char *path, int *access, int *type, int *aux, int *storage, int *numblks, int *size, int *mod, int *create)
|
||||||
{
|
{
|
||||||
char dirpath[128], filename[32];
|
char dirpath[128], filename[32];
|
||||||
unsigned char *entry, prodos_name[65];
|
unsigned char *entry, prodos_name[65], data_buff[512];
|
||||||
int refnum, iblk, entrylen, entriesblk, filecnt, io_buff = 0;
|
int refnum, iblk, entrylen, entriesblk, filecnt, io_buff = 0;
|
||||||
int i, dl, l = strlen(path);
|
int iscached, i, dl, l = strlen(path);
|
||||||
|
|
||||||
for (dl = l - 1; dl; dl--)
|
for (dl = l - 1; dl; dl--)
|
||||||
if (path[dl] == '/')
|
if (path[dl] == '/')
|
||||||
@ -667,7 +667,8 @@ static int cache_get_file_info(const char *path, int *access, int *type, int *au
|
|||||||
strncpy(dirpath, path, dl);
|
strncpy(dirpath, path, dl);
|
||||||
dirpath[dl] = '\0';
|
dirpath[dl] = '\0';
|
||||||
//printf("Match path %s to cached dir %s\n", dirpath, cachepath);
|
//printf("Match path %s to cached dir %s\n", dirpath, cachepath);
|
||||||
if (strcmp(dirpath, cachepath) == 0)
|
iscached = (strcmp(dirpath, cachepath) == 0);
|
||||||
|
if (iscached || (refnum = prodos_open(prodos_path(dirpath, NULL, NULL, NULL), &io_buff)) > 0)
|
||||||
{
|
{
|
||||||
strcpy(filename, path + dl + 1);
|
strcpy(filename, path + dl + 1);
|
||||||
l = l - dl - 1;
|
l = l - dl - 1;
|
||||||
@ -678,46 +679,73 @@ static int cache_get_file_info(const char *path, int *access, int *type, int *au
|
|||||||
}
|
}
|
||||||
//printf("Match filename %s len %d\n", filename, l);
|
//printf("Match filename %s len %d\n", filename, l);
|
||||||
iblk = 0;
|
iblk = 0;
|
||||||
entrylen = cachedata[0][0x23];
|
|
||||||
entriesblk = cachedata[0][0x24];
|
|
||||||
filecnt = cachedata[0][0x25] + cachedata[0][0x26] * 256;
|
|
||||||
entry = &cachedata[0][4] + entrylen;
|
|
||||||
//printf("Cached entrylen = %d, filecnt = %d\n", entrylen, filecnt);
|
//printf("Cached entrylen = %d, filecnt = %d\n", entrylen, filecnt);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
for (i = (iblk == 0) ? 1 : 0; i < entriesblk && filecnt; i++)
|
if (iscached || prodos_read(refnum, data_buff, 512) == 512)
|
||||||
{
|
{
|
||||||
if (entry[0])
|
if (iscached)
|
||||||
{
|
{
|
||||||
entry[(entry[0] & 0x0F) + 1] = 0;
|
if (iblk == 0)
|
||||||
//printf("Searching directory entry: %s len %d\n", entry + 1, entry[0] & 0x0F);
|
|
||||||
if ((entry[0] & 0x0F) == l)
|
|
||||||
{
|
{
|
||||||
//printf("Compare %s with %s\n", entry + 1, filename);
|
entrylen = cachedata[0][0x23];
|
||||||
if (strncmp(entry + 1, filename, l) == 0)
|
entriesblk = cachedata[0][0x24];
|
||||||
{
|
filecnt = cachedata[0][0x25] + cachedata[0][0x26] * 256;
|
||||||
*storage = entry[0x00] >> 4;
|
entry = &cachedata[0][4] + entrylen;
|
||||||
*type = entry[0x10];
|
}
|
||||||
*access = entry[0x1E];
|
else
|
||||||
*aux = entry[0x1F] + entry[0x20] * 256;
|
entry = &cachedata[0][4];
|
||||||
*numblks = entry[0x13] + entry[0x14] * 256;
|
}
|
||||||
*size = entry[0x15] + entry[0x16] * 256 + entry[0x17] * 65536;
|
else
|
||||||
*mod = entry[0x21] | (entry[0x22] << 8)
|
{
|
||||||
| (entry[0x23] << 16) | (entry[0x24] << 24);
|
if (iblk == 0)
|
||||||
*create = entry[0x18] | (entry[0x19] << 8)
|
{
|
||||||
| (entry[0x1A] << 16) | (entry[0x1B] << 24);
|
entrylen = data_buff[0x23];
|
||||||
//printf("Cache hit: %s access = $%02X, type = $%02X, aux = $%04X, storage = $%02X, size = %d\n", filename, *access, *type, *aux, *storage, *size);
|
entriesblk = data_buff[0x24];
|
||||||
return 0;
|
filecnt = data_buff[0x25] + data_buff[0x26] * 256;
|
||||||
}
|
entry = &data_buff[4] + entrylen;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
entry = &data_buff[4];
|
||||||
|
}
|
||||||
|
for (i = (iblk == 0) ? 1 : 0; i < entriesblk && filecnt; i++)
|
||||||
|
{
|
||||||
|
if (entry[0])
|
||||||
|
{
|
||||||
|
//entry[(entry[0] & 0x0F) + 1] = 0;
|
||||||
|
//printf("Searching directory entry: %s len %d\n", entry + 1, entry[0] & 0x0F);
|
||||||
|
if ((entry[0] & 0x0F) == l)
|
||||||
|
{
|
||||||
|
//printf("Compare %s with %s\n", entry + 1, filename);
|
||||||
|
if (strncmp(entry + 1, filename, l) == 0)
|
||||||
|
{
|
||||||
|
*storage = entry[0x00] >> 4;
|
||||||
|
*type = entry[0x10];
|
||||||
|
*access = entry[0x1E];
|
||||||
|
*aux = entry[0x1F] + entry[0x20] * 256;
|
||||||
|
*numblks = entry[0x13] + entry[0x14] * 256;
|
||||||
|
*size = entry[0x15] + entry[0x16] * 256 + entry[0x17] * 65536;
|
||||||
|
*mod = entry[0x21] | (entry[0x22] << 8)
|
||||||
|
| (entry[0x23] << 16) | (entry[0x24] << 24);
|
||||||
|
*create = entry[0x18] | (entry[0x19] << 8)
|
||||||
|
| (entry[0x1A] << 16) | (entry[0x1B] << 24);
|
||||||
|
//printf("Cache hit: %s access = $%02X, type = $%02X, aux = $%04X, storage = $%02X, size = %d\n", filename, *access, *type, *aux, *storage, *size);
|
||||||
|
if (!iscached)
|
||||||
|
prodos_close(refnum, &io_buff);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
entry += entrylen;
|
||||||
|
filecnt--;
|
||||||
}
|
}
|
||||||
entry += entrylen;
|
|
||||||
filecnt--;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (++iblk > CACHE_BLOCKS_MAX)
|
else
|
||||||
break;
|
filecnt = 0;
|
||||||
entry = &cachedata[iblk][4];
|
iblk++;
|
||||||
} while (filecnt != 0);
|
} while (filecnt != 0);
|
||||||
|
if (!iscached)
|
||||||
|
prodos_close(refnum, &io_buff);
|
||||||
}
|
}
|
||||||
if (prodos_get_file_info(prodos_path(path, NULL, NULL, prodos_name), access, type, aux, storage, numblks, mod, create) == 0)
|
if (prodos_get_file_info(prodos_path(path, NULL, NULL, prodos_name), access, type, aux, storage, numblks, mod, create) == 0)
|
||||||
{
|
{
|
||||||
@ -857,7 +885,10 @@ static int a2pi_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (++iblk > CACHE_BLOCKS_MAX)
|
if (++iblk > CACHE_BLOCKS_MAX)
|
||||||
|
{
|
||||||
cachepath[0] == '\0';
|
cachepath[0] == '\0';
|
||||||
|
iblk = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
filecnt = 0;
|
filecnt = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user