author | ecalot
<ecalot> 2005-06-04 10:56:36 UTC |
committer | ecalot
<ecalot> 2005-06-04 10:56:36 UTC |
parent | 29a0b8dd7e706d59f40f4644d6873a6665cf7aa5 |
PR/src/include/dat.h | +1 | -1 |
PR/src/include/disk.h | +1 | -1 |
PR/src/lib/actions/classify.c | +3 | -1 |
PR/src/lib/actions/export.c | +3 | -1 |
PR/src/lib/actions/import.c | +3 | -1 |
PR/src/lib/layers/dat.c | +54 | -57 |
diff --git a/PR/src/include/dat.h b/PR/src/include/dat.h index 7e395a5..6bee1ee 100644 --- a/PR/src/include/dat.h +++ b/PR/src/include/dat.h @@ -62,7 +62,7 @@ mWriteCloseDatFile(r,dontSave,optionflag,backupExtension) #ifdef PR_DAT_INCLUDE_DATREAD /* DAT reading primitives */ int mReadBeginDatFile(unsigned short int *numberOfItems,const char* vFile); -int mReadFileInDatFile(int indexNumber,unsigned char* *data,unsigned long int *size); +int mReadFileInDatFile(int indexNumber,unsigned char* *data,unsigned long int *size, unsigned long int *flags,char* *indexName); int mReadInitResource(tResource** res,const unsigned char* data,long size); void mReadCloseDatFile(); #endif diff --git a/PR/src/include/disk.h b/PR/src/include/disk.h index 780fb90..2ab4599 100644 --- a/PR/src/include/disk.h +++ b/PR/src/include/disk.h @@ -46,7 +46,7 @@ disk.h: Princed Resources : Disk Access & File handling functions headers /* #define DISK_ALLWAYS_FORCE */ /* 64 Kb */ -#define SIZE_OF_FILE 256*1024 +#define SIZE_OF_FILE (1200*1024) #define MAX_FILENAME_SIZE 260 /* Path defines */ diff --git a/PR/src/lib/actions/classify.c b/PR/src/lib/actions/classify.c index 5e9c814..9a8d795 100644 --- a/PR/src/lib/actions/classify.c +++ b/PR/src/lib/actions/classify.c @@ -53,6 +53,8 @@ int prClassifyDat(const char* vFiledat) { int type=RES_TYPE_BINARY; unsigned short int numberOfItems; tPopVersion popVersion; + unsigned long int flags; + char* indexName; /* Initialize abstract variables to read this new DAT file */ if ((id=mReadBeginDatFile(&numberOfItems,vFiledat))) return id+1; /* -1 if not found or empty, 0 if invalid */ @@ -61,7 +63,7 @@ int prClassifyDat(const char* vFiledat) { /* main loop */ for (id=0,indexNumber=0;(indexNumber<numberOfItems)&&(type==RES_TYPE_BINARY);indexNumber++) { - id=mReadFileInDatFile(indexNumber,&data,&size); + id=mReadFileInDatFile(indexNumber,&data,&size,&flags,&indexName); if (id<0) READ_ERROR; /* Read error */ if (id==0xFFFF) continue; /* Tammo Jan Bug fix */ if (id>=MAX_RES_COUNT) READ_ERROR; /* A file with an ID out of range will be treated as invalid */ diff --git a/PR/src/lib/actions/export.c b/PR/src/lib/actions/export.c index c989b16..837e840 100644 --- a/PR/src/lib/actions/export.c +++ b/PR/src/lib/actions/export.c @@ -81,6 +81,8 @@ int extract(const char* vFiledat,const char* vDirExt, tResource* r[], int option unsigned long int size; unsigned short int numberOfItems; signed long int bufferedPalette=0; + unsigned long int flags; + char* indexName; /* Initialize abstract variables to read this new DAT file */ if (mReadBeginDatFile(&numberOfItems,vFiledat)) return -1; @@ -90,7 +92,7 @@ int extract(const char* vFiledat,const char* vDirExt, tResource* r[], int option /* main loop */ for (indexNumber=0;ok&&(indexNumber<numberOfItems);indexNumber++) { - id=mReadFileInDatFile(indexNumber,&data,&size); + id=mReadFileInDatFile(indexNumber,&data,&size,&flags,&indexName); if (id<0) return -3; /* Read error */ if (id==0xFFFF) continue; /* Tammo Jan Bug fix */ diff --git a/PR/src/lib/actions/import.c b/PR/src/lib/actions/import.c index b5401a9..ebfb23f 100644 --- a/PR/src/lib/actions/import.c +++ b/PR/src/lib/actions/import.c @@ -156,14 +156,16 @@ int partialCompile(const char* vFiledat, const char* vDirExt, tResource* r[], in long int id; unsigned char* data; unsigned long int size; + unsigned long int flags; unsigned short int numberOfItems; + char* indexName; /* Initialize abstract variables to read this new DAT file */ if ((error=mRWBeginDatFile(vFiledat,&numberOfItems,optionflag))) return error; /* main loop */ for (indexNumber=0;(indexNumber<numberOfItems);indexNumber++) { - id=mReadFileInDatFile(indexNumber,&data,&size); + id=mReadFileInDatFile(indexNumber,&data,&size,&flags,&indexName); /* Validations */ if (id<0) { diff --git a/PR/src/lib/layers/dat.c b/PR/src/lib/layers/dat.c index 562c519..8f9ee5b 100644 --- a/PR/src/lib/layers/dat.c +++ b/PR/src/lib/layers/dat.c @@ -51,21 +51,16 @@ typedef struct { int highDataSize; int masterItems; int slaveItems; - char recordSize; - char slaveIndexName[5]; int currentMasterItem; int currentSlaveItem; unsigned char* currentRecord; + char slaveIndexName[5]; } tIndexCursor; -char recordSize; -tPopVersion popVersion; -unsigned char* indexPointer; -unsigned long int indexOffset; -unsigned long int offset; -unsigned short int indexSize; +/* TODO: use statics */ unsigned char* readDatFile; int readDatFileSize; +tIndexCursor readIndexCursor; /* private functions */ /* todo: move to datindex.c */ @@ -127,7 +122,7 @@ tIndexCursor dat_initPop2IndexCursor(unsigned char* highData,int highDataSize) { int dat_cursorMove(tIndexCursor* r,int pos) { if (r->popVersion==pop1) { /* POP1 */ - if (r->slaveItems>pos) return 0; + if (r->slaveItems<=pos) return 0; r->currentSlaveItem=pos; r->currentRecord=r->highData+8*pos+2; return 1; @@ -149,7 +144,7 @@ int dat_cursorMove(tIndexCursor* r,int pos) { /* jump to next index */ r->currentMasterItem=i; r->currentSlaveItem=pos; - r->currentRecord=r->highData+array2short(r->highData+6+6*r->currentMasterItem)+2; + r->currentRecord=r->highData+array2short(r->highData+6+6*r->currentMasterItem)+2+pos*11; return 1; } pos-=itemCount; @@ -162,7 +157,8 @@ int dat_cursorMove(tIndexCursor* r,int pos) { #define dat_readCursorGetId(r) (array2short(r.currentRecord)) #define dat_readCursorGetOffset(r) (array2long(r.currentRecord+2)) #define dat_readCursorGetSize(r) (array2short(r.currentRecord+6)) -#define dat_readCursorGetFlags(r) ((r.popVersion==pop1)?(1<<31):(r.currentRecord[7]<<24|r.currentRecord[8]<<16|r.currentRecord[9])) +#define dat_readCursorGetFlags(r) ((r.popVersion==pop1)?(1<<31):(r.currentRecord[8]<<16|r.currentRecord[9]<<8|r.currentRecord[10])) +#define dat_readCursorGetVersion(r) (r.popVersion) tIndexCursor dat_initPop1IndexCursor(unsigned char* highData,int highDataSize) { tIndexCursor r; @@ -181,28 +177,26 @@ tIndexCursor dat_initPop1IndexCursor(unsigned char* highData,int highDataSize) { return r; } -tPopVersion detectPopVersion(int highArea,int highAreaSize) { +tPopVersion detectPopVersion(unsigned char* highArea,int highAreaSize,unsigned short int *numberOfItems) { const unsigned char* cursor; unsigned short numberOfRecords; /* create cursor */ - cursor=readDatFile+highArea; + cursor=highArea; /* read number of records */ numberOfRecords=array2short(cursor);cursor+=2; - + /* check pop1: if there are numberOfRecords records sized 8 and 2 bytes for the short numberOfRecords */ if ((numberOfRecords*8+2)==highAreaSize) { - indexPointer=readDatFile+highArea; - indexSize=highAreaSize; - recordSize=8; + *numberOfItems=numberOfRecords; return pop1; } /* check pop2: if there are numberOfRecords records sized 6 and 2 bytes for the short numberOfRecords */ + *numberOfItems=0; if ((numberOfRecords*6+2)>=highAreaSize) return none; printf("pop2 detected with %d high sections\n",numberOfRecords); - recordSize=0; for (;numberOfRecords;numberOfRecords--,cursor+=6) { int startOfSection; int endOfSection; @@ -222,22 +216,35 @@ tPopVersion detectPopVersion(int highArea,int highAreaSize) { printf("Section %c%c%c%c starts at %d, ends at %d and length %d\n",cursor[0],cursor[1],cursor[2],cursor[3],startOfSection,endOfSection,sizeOfSection); - /* check for the PAHS section */ - if (!strncmp("PAHS",(char*)cursor,4)) { /* TODO: send to define */ - indexPointer=readDatFile+highArea+startOfSection; - indexSize=sizeOfSection; - recordSize=11; - } - /* TODO: check if short(startOfSection)*11+2==sizeOfSection*/ + if ((array2short(highArea+startOfSection)*11+2)!=sizeOfSection) return none; + *numberOfItems+=array2short(highArea+startOfSection); } return pop2; } +tIndexCursor dat_createCursor(unsigned char* indexOffset,int indexSize,unsigned short int* numberOfItems) { + tPopVersion popVersion; + tIndexCursor cursor; + cursor.popVersion=none; + + /* read the high data to detect pop version and set up the number of items */ + popVersion=detectPopVersion(indexOffset,indexSize,numberOfItems); + + switch (popVersion) { + case pop1: + return dat_initPop1IndexCursor(indexOffset,indexSize); + case pop2: + return dat_initPop2IndexCursor(indexOffset,indexSize); + default: + return cursor; + } +} + /* public functions */ tPopVersion mReadGetVersion() { - return popVersion; + return readIndexCursor.popVersion; } void mReadCloseDatFile() { @@ -251,8 +258,8 @@ int mReadBeginDatFile(unsigned short int *numberOfItems,const char* vFiledat){ -2 File not found or empty 0 Ok */ - - unsigned char* readDatFilePoint; + unsigned long int indexOffset; + unsigned short int indexSize; /* Open file */ readDatFileSize=mLoadFileArray(vFiledat,&readDatFile); @@ -262,12 +269,9 @@ int mReadBeginDatFile(unsigned short int *numberOfItems,const char* vFiledat){ return -1; } - readDatFilePoint=readDatFile; - /* read header */ - indexOffset=array2long(readDatFilePoint); - readDatFilePoint+=4; - indexSize=array2short(readDatFilePoint); + indexOffset=array2long(readDatFile); + indexSize=array2short(readDatFile+4); /* verify dat format: the index offset belongs to the file and the file size is the index size plus the index offset */ if ((indexOffset>readDatFileSize)&&((indexOffset+indexSize)!=readDatFileSize)) { @@ -275,42 +279,35 @@ int mReadBeginDatFile(unsigned short int *numberOfItems,const char* vFiledat){ return -1; /* this is not a valid prince dat file */ } - /* read the high data to detect pop version and set up the indexPointer, indexSize and recordSize */ - popVersion=detectPopVersion(indexOffset,indexSize); + /* create cursor */ + readIndexCursor=dat_createCursor(readDatFile+indexOffset,indexSize,numberOfItems); /* pop version check */ - if (popVersion==none) return -1; - if (!recordSize) {*numberOfItems=0; return 0;} /* valid dat file without an index */ + if (!dat_readCursorGetVersion(readIndexCursor)) return -1; - /* read numberOfItems */ - *numberOfItems=array2short(indexPointer); - indexPointer+=2; - return 0; } -int mReadFileInDatFile(int k,unsigned char* *data,unsigned long int *size) { - int ok=1; +int mReadFileInDatFile(int k,unsigned char* *data,unsigned long int *size, unsigned long int *flags,char* *index) { unsigned short int id; + unsigned long int offset; + if (!dat_cursorMove(&readIndexCursor,k)) return -2; /* -2 means: out of range */ + /* for each archived file the index is read */ - id= array2short(indexPointer+k*recordSize); - offset=array2long(indexPointer+k*recordSize+2); - *size= array2short(indexPointer+k*recordSize+6)+1; - -#ifdef CHECK_POP2_PAHS_INTEGRITY - if ( /* pop2 integrity check */ - (popVersion==pop2) && - (!(indexPointer[k*recordSize+8]==0x40) && - (!indexPointer[k*recordSize+9]) && - (!indexPointer[k*recordSize+10]) - )) return -1; -#endif + id= dat_readCursorGetId (readIndexCursor); + offset=dat_readCursorGetOffset (readIndexCursor); + *size= dat_readCursorGetSize (readIndexCursor); + *flags=dat_readCursorGetFlags (readIndexCursor); + *index=dat_readCursorGetIndexName (readIndexCursor); + + /* if (offset>indexOffset) return -1; * a resourse offset is allways before the index offset TODO: move this check to detect pop version*/ + (*size)++; /* add the checksum */ - if (offset>indexOffset) return -1; /* a resourse offset is allways before the index offset */ +printf("DEBUG: id=%d offset=%lu size=%lu flags=0x%08x index=%s\n",id,offset,*size,(int)(*flags),*index); *data=readDatFile+offset; - return ok?id:-1; + return id; } int mReadInitResource(tResource** res,const unsigned char* data,long size) {