]> de.git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
Fixes to the PAK utility.
authorDale Weiler <killfieldengine@gmail.com>
Thu, 7 Feb 2013 17:07:29 +0000 (17:07 +0000)
committerDale Weiler <killfieldengine@gmail.com>
Thu, 7 Feb 2013 17:07:29 +0000 (17:07 +0000)
pak.c

diff --git a/pak.c b/pak.c
index 541ca684737e76429f9e095ff69f2bf76f316e9e..7d2199c88273a93779ba6379c41aa8083adf6fd0 100644 (file)
--- a/pak.c
+++ b/pak.c
@@ -90,11 +90,12 @@ static bool pak_tree_spawn(const char *path) {
  * this function will handle the creation of
  * the directory structure, included nested
  * directories.
- */    
+ */
 static void pak_tree_build(const char *entry) {
     char *directory;
     char *elements[28];
     char *pathsplit;
+    char *token;
 
     size_t itr;
     size_t jtr;
@@ -102,8 +103,14 @@ static void pak_tree_build(const char *entry) {
     pathsplit = mem_a(56);
     directory = mem_a(56);
 
+    memset(pathsplit, 0, 56);
+    memset(directory, 0, 56);
+
     strncpy(directory, entry, 56);
-    for (itr = 0; (elements[itr] = pak_tree_sep(&directory, "/")); itr++);
+    for (itr = 0; (token = strsep(&directory, "/")) != NULL; itr++) {
+        elements[itr] = token;
+    }
+
     for (jtr = 0; jtr < itr - 1; jtr++) {
         strcat(pathsplit, elements[jtr]);
         strcat(pathsplit, "/");
@@ -137,16 +144,16 @@ pak_file_t *pak_open_read(const char *file) {
     pak->directories = NULL;
     pak->insert      = false; /* read doesn't allow insert */
 
-    memset         (&(pak->header), 0, sizeof(pak_header_t));
-    file_read      (&(pak->header), 1, sizeof(pak_header_t), pak->handle);
-    util_endianswap(&(pak->header), 1, sizeof(pak_header_t));
+    memset         (&pak->header, 0, sizeof(pak_header_t));
+    file_read      (&pak->header,    sizeof(pak_header_t), 1, pak->handle);
+    util_endianswap(&pak->header, 1, sizeof(pak_header_t));
 
     /*
      * Every PAK file has "PACK" stored as little endian data in the
      * header.  If this data cannot compare (as checked here), it's
      * probably not a PAK file.
-     */    
-    if (!(memcmp(&(pak->header.magic), (const void*)"PACK", sizeof(uint32_t)))) {
+     */
+    if ((memcmp(&(pak->header.magic), (const void*)"PACK", sizeof(uint32_t)))) {
         file_close(pak->handle);
         mem_d     (pak);
         return NULL;
@@ -164,8 +171,8 @@ pak_file_t *pak_open_read(const char *file) {
      */   
     for (itr = 0; itr < pak->header.dirlen / 64; itr++) {
         pak_directory_t dir;
-        file_read      (&dir, 1, sizeof(pak_directory_t), pak->handle);
-        util_endianswap(&dir, 1, sizeof(pak_directory_t));
+        file_read      (&dir, sizeof(pak_directory_t), 1, pak->handle);
+        /*util_endianswap(&dir, 1, sizeof(pak_directory_t));*/
 
         vec_push(pak->directories, dir);
     }
@@ -409,3 +416,15 @@ bool pak_close(pak_file_t *pak) {
 
     return true;
 }
+
+/* test extraction */
+#if 0
+int main() {
+    pak_file_t *pak = pak_open_read("pak0.pak");
+    if (!pak) abort();
+
+    pak_extract_all(pak);
+
+    return 0;
+}
+#endif