diff options
| author | John Wilbert M. Villamor <lameguy64@gmail.com> | 2019-04-06 10:11:07 +0800 |
|---|---|---|
| committer | John Wilbert M. Villamor <lameguy64@gmail.com> | 2019-04-06 10:11:07 +0800 |
| commit | f3e040230772f978540a71aea43dfde200992922 (patch) | |
| tree | bd8ca31b72dd01e24980b073854e263589530f56 /libpsn00b/lzp/lzp.c | |
| download | psn00bsdk-f3e040230772f978540a71aea43dfde200992922.tar.gz | |
First commit
Diffstat (limited to 'libpsn00b/lzp/lzp.c')
| -rw-r--r-- | libpsn00b/lzp/lzp.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/libpsn00b/lzp/lzp.c b/libpsn00b/lzp/lzp.c new file mode 100644 index 0000000..1f4fea4 --- /dev/null +++ b/libpsn00b/lzp/lzp.c @@ -0,0 +1,88 @@ +#include <stdio.h> +#include <string.h> +#include <ctype.h> + +#include "lzp.h" + + +static char* lcase(char* text) { + + int i; + + for(i=0; text[i]!=0x00; i++) + text[i] = tolower(text[i]); + + return(text); + +} + + +int lzpSearchFile(const char* fileName, void* lzpack) { + + int i; + char searchName[16]; + char compareName[16]; + LZP_FILE* fileEntry; + + strcpy(searchName, fileName); + lcase(searchName); + + fileEntry = (LZP_FILE*)(lzpack+4); + for(i=0; i<((LZP_HEAD*)lzpack)->numFiles; i++) { + + strcpy(compareName, fileEntry[i].fileName); + lcase(compareName); + + if (strcmp(searchName, compareName) == 0) + return(i); + + } + + return(LZP_ERR_NOTFOUND); + +} + +LZP_FILE* lzpFileEntry(void* lzpack, int fileNum) { + + if (strncmp("LZP", ((LZP_HEAD*)lzpack)->id, 3) != 0) + return(NULL); + + if ((fileNum < 0) || (fileNum > (((LZP_HEAD*)lzpack)->numFiles-1))) + return(NULL); + + return(&((LZP_FILE*)(lzpack+4))[fileNum]); + +} + +int lzpFileSize(void* lzpack, int fileNum) { + + if (strncmp("LZP", ((LZP_HEAD*)lzpack)->id, 3) != 0) + return 0; + + if ((fileNum < 0) || (fileNum > (((LZP_HEAD*)lzpack)->numFiles-1))) + return 0; + + return ((LZP_FILE*)(lzpack+4))[fileNum].fileSize; +} + +int lzpUnpackFile(void* buff, void* lzpack, int fileNum) { + + LZP_FILE* fileEntry = &((LZP_FILE*)(lzpack+4))[fileNum]; + int unpackedSize; + + // Check ID header + if (strncmp("LZP", ((LZP_HEAD*)lzpack)->id, 3) != 0) + return(LZP_ERR_INVALID_PACK); + + // Do a CRC16 check of the compressed data's integrity + if (lzCRC32(lzpack+fileEntry->offset, fileEntry->packedSize, LZP_CRC32_REMAINDER) != fileEntry->crc) + return(LZP_ERR_CRC_MISMATCH); + + // Decompress data to the specified address + unpackedSize = lzDecompress(buff, lzpack+fileEntry->offset, fileEntry->packedSize); + if (unpackedSize < 0) + return(unpackedSize); + + return(unpackedSize); + +} |
