- Fixed file reading resume, thanks to elhobbs.
- Fixed relative path file open for anything else than MS Windows (DIR_SEP). - Using constants for filename size and filename extension size. Files that are not 8+3 are still broken. Even if you rename TowerDefense maps to 8+3, it crashes, to be debugged. I'm commiting anyway as my tests show that it doesn't worsen current state. Please reverse if otherwise.
This commit is contained in:
parent
fe3325e42d
commit
5442bf1d78
|
@ -72,8 +72,8 @@ int lfn_checksum() {
|
||||||
u8 chk;
|
u8 chk;
|
||||||
|
|
||||||
chk = 0;
|
chk = 0;
|
||||||
for (i=0; i < 11; i++) {
|
for (i=0; i < (NAME_LEN + EXT_LEN); i++) {
|
||||||
chk = ((chk & 1) ? 0x80 : 0) + (chk >> 1) + (i < 8 ? files[numFiles].name[i] : files[numFiles].ext[i - 8]);
|
chk = ((chk & 1) ? 0x80 : 0) + (chk >> 1) + (i < NAME_LEN ? files[numFiles].name[i] : files[numFiles].ext[i - NAME_LEN]);
|
||||||
}
|
}
|
||||||
return chk;
|
return chk;
|
||||||
}
|
}
|
||||||
|
@ -96,9 +96,9 @@ void add_file(char *fname, FsEntry * entry, int fileLevel) {
|
||||||
if (i<0) i = strlen(fname);
|
if (i<0) i = strlen(fname);
|
||||||
for (j=0; j<i; j++)
|
for (j=0; j<i; j++)
|
||||||
files[numFiles].name[j] = fname[j];
|
files[numFiles].name[j] = fname[j];
|
||||||
for (; j<8; j++)
|
for (; j<NAME_LEN; j++)
|
||||||
files[numFiles].name[j] = 0x20;
|
files[numFiles].name[j] = 0x20;
|
||||||
for (j=0; j<3; j++) {
|
for (j=0; j<EXT_LEN; j++) {
|
||||||
if ((j+i+1)>=strlen(fname)) break;
|
if ((j+i+1)>=strlen(fname)) break;
|
||||||
files[numFiles].ext[j] = fname[j+i+1];
|
files[numFiles].ext[j] = fname[j+i+1];
|
||||||
}
|
}
|
||||||
|
@ -142,9 +142,9 @@ void add_file(char *fname, FsEntry * entry, int fileLevel) {
|
||||||
if (i<0) i = strlen(fname);
|
if (i<0) i = strlen(fname);
|
||||||
for (j=0; j<i; j++)
|
for (j=0; j<i; j++)
|
||||||
files[numFiles].name[j] = fname[j];
|
files[numFiles].name[j] = fname[j];
|
||||||
for (; j<8; j++)
|
for (; j<NAME_LEN; j++)
|
||||||
files[numFiles].name[j] = 0x20;
|
files[numFiles].name[j] = 0x20;
|
||||||
for (j=0; j<3; j++) {
|
for (j=0; j<EXT_LEN; j++) {
|
||||||
if ((j+i+1)>=strlen(fname)) break;
|
if ((j+i+1)>=strlen(fname)) break;
|
||||||
files[numFiles].ext[j] = fname[j+i+1];
|
files[numFiles].ext[j] = fname[j+i+1];
|
||||||
}
|
}
|
||||||
|
@ -169,8 +169,8 @@ void add_file(char *fname, FsEntry * entry, int fileLevel) {
|
||||||
numFiles++;
|
numFiles++;
|
||||||
} else if (fileLevel > 0) {
|
} else if (fileLevel > 0) {
|
||||||
fileLink[fileLevel].filesInDir += 1;
|
fileLink[fileLevel].filesInDir += 1;
|
||||||
strncpy((char*)&files[numFiles].name[0],".. ",8);
|
strncpy((char*)&files[numFiles].name[0],".. ",NAME_LEN);
|
||||||
strncpy((char*)&files[numFiles].ext[0]," ",3);
|
strncpy((char*)&files[numFiles].ext[0]," ",EXT_LEN);
|
||||||
fileLink[numFiles].parent = fileLevel;
|
fileLink[numFiles].parent = fileLevel;
|
||||||
files[numFiles].attrib = 0x10;
|
files[numFiles].attrib = 0x10;
|
||||||
numFiles++;
|
numFiles++;
|
||||||
|
@ -295,9 +295,9 @@ BOOL cflash_build_fat() {
|
||||||
dirEntries[k++] = files[j];
|
dirEntries[k++] = files[j];
|
||||||
if ((files[j].attrib & ATTRIB_LFN)==0) {
|
if ((files[j].attrib & ATTRIB_LFN)==0) {
|
||||||
if (files[j].attrib & ATTRIB_DIR) {
|
if (files[j].attrib & ATTRIB_DIR) {
|
||||||
if (strncmp((char*)&files[j].name[0],". ",8)==0) {
|
if (strncmp((char*)&files[j].name[0],". ",NAME_LEN)==0) {
|
||||||
dirEntries[k-1].startCluster = dirEntryLink[k-1].level;
|
dirEntries[k-1].startCluster = dirEntryLink[k-1].level;
|
||||||
} else if (strncmp((char*)&files[j].name[0],".. ",8)==0) {
|
} else if (strncmp((char*)&files[j].name[0],".. ",NAME_LEN)==0) {
|
||||||
dirEntries[k-1].startCluster = dirEntryLink[k-1].parent;
|
dirEntries[k-1].startCluster = dirEntryLink[k-1].parent;
|
||||||
} else {
|
} else {
|
||||||
clust++;
|
clust++;
|
||||||
|
@ -455,13 +455,13 @@ void fatstring_to_asciiz(int dirent,char *out,DIR_ENT *d) {
|
||||||
else
|
else
|
||||||
pd = d;
|
pd = d;
|
||||||
|
|
||||||
for (i=0; i<8; i++) {
|
for (i=0; i<NAME_LEN; i++) {
|
||||||
if (pd->name[i] == ' ') break;
|
if (pd->name[i] == ' ') break;
|
||||||
out[i] = pd->name[i];
|
out[i] = pd->name[i];
|
||||||
}
|
}
|
||||||
if ((pd->attrib & 0x10)==0) {
|
if ((pd->attrib & 0x10)==0) {
|
||||||
out[i++] = '.';
|
out[i++] = '.';
|
||||||
for (j=0; j<3; j++) {
|
for (j=0; j<EXT_LEN; j++) {
|
||||||
if (pd->ext[j] == ' ') break;
|
if (pd->ext[j] == ' ') break;
|
||||||
out[i++] = pd->ext[j];
|
out[i++] = pd->ext[j];
|
||||||
}
|
}
|
||||||
|
@ -482,7 +482,7 @@ void resolve_path(int dirent) {
|
||||||
((dirEntries[i].attrib&ATTRIB_DIR)!=0)) {
|
((dirEntries[i].attrib&ATTRIB_DIR)!=0)) {
|
||||||
fatstring_to_asciiz(i,dirname,NULL);
|
fatstring_to_asciiz(i,dirname,NULL);
|
||||||
strncat(fpath,dirname,256-strlen(fpath));
|
strncat(fpath,dirname,256-strlen(fpath));
|
||||||
strncat(fpath,"\\",256-strlen(fpath));
|
strncat(fpath,DIR_SEP,256-strlen(fpath));
|
||||||
dirent = i;
|
dirent = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -493,7 +493,7 @@ void resolve_path(int dirent) {
|
||||||
|
|
||||||
/* Read from a file using a 512 byte buffer */
|
/* Read from a file using a 512 byte buffer */
|
||||||
u16 fread_buffered(int dirent,u32 cluster,u32 offset) {
|
u16 fread_buffered(int dirent,u32 cluster,u32 offset) {
|
||||||
char fname[32];
|
char fname[2*NAME_LEN+EXT_LEN];
|
||||||
int i,j;
|
int i,j;
|
||||||
|
|
||||||
offset += cluster*512*SECPERCLUS;
|
offset += cluster*512*SECPERCLUS;
|
||||||
|
@ -515,7 +515,7 @@ u16 fread_buffered(int dirent,u32 cluster,u32 offset) {
|
||||||
|
|
||||||
/* replaced strcpy/cat with strncpy/strcat to fixed possible buffer overruns */
|
/* replaced strcpy/cat with strncpy/strcat to fixed possible buffer overruns */
|
||||||
strncpy(fpath,sRomPath,256);
|
strncpy(fpath,sRomPath,256);
|
||||||
strncat(fpath,"\\",256-strlen(fpath));
|
strncat(fpath,DIR_SEP,256-strlen(fpath));
|
||||||
|
|
||||||
resolve_path(dirent);
|
resolve_path(dirent);
|
||||||
|
|
||||||
|
@ -523,8 +523,9 @@ u16 fread_buffered(int dirent,u32 cluster,u32 offset) {
|
||||||
strncat(fpath,fname,256-strlen(fpath));
|
strncat(fpath,fname,256-strlen(fpath));
|
||||||
|
|
||||||
hFile = fopen(fpath, "rb");
|
hFile = fopen(fpath, "rb");
|
||||||
if (!hFile)
|
if (!hFile) return 0;
|
||||||
return 0;
|
bufferStart = offset;
|
||||||
|
fseek(hFile, offset, SEEK_SET);
|
||||||
fread(&freadBuffer, 1, 512, hFile);
|
fread(&freadBuffer, 1, 512, hFile);
|
||||||
|
|
||||||
bufferStart = offset;
|
bufferStart = offset;
|
||||||
|
|
|
@ -13,10 +13,14 @@
|
||||||
#define ATTRIB_LFN 0x0F
|
#define ATTRIB_LFN 0x0F
|
||||||
|
|
||||||
#define FILE_FREE 0xE5
|
#define FILE_FREE 0xE5
|
||||||
|
/* Name and extension maximum length */
|
||||||
|
#define NAME_LEN 8
|
||||||
|
#define EXT_LEN 3
|
||||||
|
|
||||||
// Boot Sector - must be packed
|
// Boot Sector - must be packed
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
|
#define DIR_SEP "\\"
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u8 jmpBoot[3];
|
u8 jmpBoot[3];
|
||||||
|
@ -54,8 +58,8 @@ typedef struct
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u8 name[8];
|
u8 name[NAME_LEN];
|
||||||
u8 ext[3];
|
u8 ext[EXT_LEN];
|
||||||
u8 attrib;
|
u8 attrib;
|
||||||
u8 reserved;
|
u8 reserved;
|
||||||
u8 cTime_ms;
|
u8 cTime_ms;
|
||||||
|
@ -70,6 +74,7 @@ typedef struct
|
||||||
} DIR_ENT;
|
} DIR_ENT;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
#else
|
#else
|
||||||
|
#define DIR_SEP "/"
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u8 jmpBoot[3] __PACKED;
|
u8 jmpBoot[3] __PACKED;
|
||||||
|
@ -105,8 +110,8 @@ typedef struct
|
||||||
// Directory entry - must be packed
|
// Directory entry - must be packed
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u8 name[8] __PACKED;
|
u8 name[NAME_LEN] __PACKED;
|
||||||
u8 ext[3] __PACKED;
|
u8 ext[EXT_LEN] __PACKED;
|
||||||
u8 attrib __PACKED;
|
u8 attrib __PACKED;
|
||||||
u8 reserved __PACKED;
|
u8 reserved __PACKED;
|
||||||
u8 cTime_ms __PACKED;
|
u8 cTime_ms __PACKED;
|
||||||
|
|
Loading…
Reference in New Issue