aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/lzp/lzp.c
diff options
context:
space:
mode:
authorJohn Wilbert M. Villamor <lameguy64@gmail.com>2019-04-06 10:11:07 +0800
committerJohn Wilbert M. Villamor <lameguy64@gmail.com>2019-04-06 10:11:07 +0800
commitf3e040230772f978540a71aea43dfde200992922 (patch)
treebd8ca31b72dd01e24980b073854e263589530f56 /libpsn00b/lzp/lzp.c
downloadpsn00bsdk-f3e040230772f978540a71aea43dfde200992922.tar.gz
First commit
Diffstat (limited to 'libpsn00b/lzp/lzp.c')
-rw-r--r--libpsn00b/lzp/lzp.c88
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);
+
+}