]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
added decompression support
authorSen Huang <senhuang96@fb.com>
Fri, 6 Sep 2019 00:56:24 +0000 (17:56 -0700)
committerSen Huang <senhuang96@fb.com>
Fri, 6 Sep 2019 00:56:24 +0000 (17:56 -0700)
programs/fileio.c
programs/fileio.h
programs/util.c
programs/zstdcli.c

index f257718648d5dfbff81dbb4c8649e413bb726efa..c8a971c274becd6765a35dbfa4d45e135ae2f98a 100644 (file)
@@ -1422,7 +1422,6 @@ int FIO_compressMultipleFilenames(FIO_prefs_t* const prefs, const char** inFileN
                                   const char* suffix, const char* dictFileName,
                                   int compressionLevel, ZSTD_compressionParameters comprParams)
 {
-    printf("compressing multiple...\n");
     int error = 0;
     cRess_t ress = FIO_createCResources(prefs, dictFileName, compressionLevel, comprParams);
 
@@ -1457,7 +1456,7 @@ int FIO_compressMultipleFilenames(FIO_prefs_t* const prefs, const char** inFileN
     }   }
 
     FIO_freeCResources(ress);
-    UTIL_freeDestinationFilenameTable(dstFileNamesTable, nbFiles);
+    /*UTIL_freeDestinationFilenameTable(dstFileNamesTable, nbFiles);*/
     return error;
 }
 
@@ -2240,14 +2239,24 @@ FIO_determineDstName(const char* srcFileName)
 
 int
 FIO_decompressMultipleFilenames(FIO_prefs_t* const prefs,
-                                const char* srcNamesTable[], unsigned nbFiles,
+                                const char** srcNamesTable, unsigned nbFiles,
+                                const char* outDirName, char** dstFileNamesTable, 
                                 const char* outFileName,
                                 const char* dictFileName)
 {
     int error = 0;
     dRess_t ress = FIO_createDResources(prefs, dictFileName);
 
-    if (outFileName) {
+    if (outDirName != NULL) {   /* output into a particular folder */
+        unsigned u;
+        for (u = 0; u < nbFiles; ++u) {
+            const char* const srcFileName = srcNamesTable[u];
+            const char* const dstFileName = FIO_determineDstName(dstFileNamesTable[u]);
+            if (dstFileName == NULL) { error=1; continue; }
+            
+            error |= FIO_decompressSrcFile(prefs, ress, dstFileName, srcFileName);
+        }
+    } else if (outFileName) {
         unsigned u;
         ress.dstFile = FIO_openDstFile(prefs, NULL, outFileName);
         if (ress.dstFile == 0) EXM_THROW(71, "cannot open %s", outFileName);
@@ -2268,10 +2277,23 @@ FIO_decompressMultipleFilenames(FIO_prefs_t* const prefs,
     }
 
     FIO_freeDResources(ress);
+    /* UTIL_freeDestinationFilenameTable(dstFileNamesTable, nbFiles); */
     return error;
 }
 
+void FIO_processMultipleFilenameDestinationDir(char** dstFilenameTable,
+                                              const char** filenameTable, unsigned filenameIdx,
+                                              const char* outFileName, const char* outDirName) {
+    int dirResult;
+    dirResult = UTIL_createDir(outDirName);
+    if (dirResult)
+        DISPLAY("Directory creation unsuccessful \n");
 
+    UTIL_createDestinationDirTable(filenameTable, filenameIdx, outDirName, dstFilenameTable);
+    if (outFileName) {
+        outFileName = dstFilenameTable[0]; /* in case -O is called with single file */
+    }
+}
 
 /* **************************************************************************
  *  .zst file info (--list command)
index 1ed6d153839b14c2369159bbfa8af77688593c3b..1b435c5f35e54a4bc3075b5931f9afaed0d9131b 100644 (file)
@@ -114,9 +114,14 @@ int FIO_compressMultipleFilenames(FIO_prefs_t* const prefs, const char** inFileN
     @return : nb of missing or skipped files */
 int FIO_decompressMultipleFilenames(FIO_prefs_t* const prefs,
                                     const char** srcNamesTable, unsigned nbFiles,
+                                    const char* outDirName, char** dstFilenameTable, 
                                     const char* outFileName,
                                     const char* dictFileName);
 
+void FIO_processMultipleFilenameDestinationDir(char** dstFilenameTable,
+                                              const char** filenameTable, unsigned filenameIdx,
+                                              const char* outFileName, const char* outDirName);
+
 
 /*-*************************************
 *  Advanced stuff (should actually be hosted elsewhere)
index e8b599aaa3b558d81a79da855f7db8f55e70c2c1..448a78899bc609bae06aeb8f26a44165489a672f 100644 (file)
@@ -108,6 +108,7 @@ void UTIL_createDestinationDirTable(const char** filenameTable, unsigned nbFiles
     unsigned u;
     char c;
     c = '/';
+    printf("NBFILE: %u\n", nbFiles);
 
     /* duplicate source file table */
     for (u = 0; u < nbFiles; ++u) {
@@ -120,14 +121,17 @@ void UTIL_createDestinationDirTable(const char** filenameTable, unsigned nbFiles
         dstFilenameTable[u] = (char*) malloc(finalPathLen * sizeof(char) + 1);
         strcpy(dstFilenameTable[u], outDirName);
         strcat(dstFilenameTable[u], filename);
+        printf("%s    %s\n", filenameTable[u], dstFilenameTable[u]);
     } 
 }
 
 void UTIL_freeDestinationFilenameTable(char** dstDirTable, unsigned nbFiles) {
     unsigned u;
-    for (u = 0; u < nbFiles; ++u)
-        free(dstDirTable[u]);
-    free((void*)dstDirTable);
+    for (u = 0; u < nbFiles; ++u) {
+        if (dstDirTable[u] != NULL)
+            free(dstDirTable[u]);
+    }
+    if (dstDirTable != NULL) free((void*)dstDirTable);
 }
 
 int UTIL_isSameFile(const char* file1, const char* file2)
index 2d3254ae56371663417555199f10673fb8cf705a..7c00b3d7140495060377d0204c84d36e6f75e80b 100644 (file)
@@ -1177,16 +1177,9 @@ int main(int argCount, const char* argv[])
         if (adaptMin > cLevel) cLevel = adaptMin;
         if (adaptMax < cLevel) cLevel = adaptMax;
 
-        if (outDirName) {
-            int dirResult;
-            dirResult = UTIL_createDir(outDirName);
-            if (dirResult) DISPLAY("Directory creation unsuccessful \n");
-
-            UTIL_createDestinationDirTable(filenameTable, filenameIdx, outDirName, dstFilenameTable);
-            if (outFileName) {
-                outFileName = dstFilenameTable[0]; /* in case -O is called with single file */
-            }
-        }
+        if (outDirName)
+            FIO_processMultipleFilenameDestinationDir(dstFilenameTable, filenameTable, filenameIdx, outFileName, outDirName);
+
         if ((filenameIdx==1) && outFileName)
           operationResult = FIO_compressFilename(prefs, outFileName, filenameTable[0], dictFileName, cLevel, compressionParams);
         else
@@ -1205,10 +1198,14 @@ int main(int argCount, const char* argv[])
             }
         }
         FIO_setMemLimit(prefs, memLimit);
+
+        if (outDirName)
+            FIO_processMultipleFilenameDestinationDir(dstFilenameTable, filenameTable, filenameIdx, outFileName, outDirName);
+
         if (filenameIdx==1 && outFileName)
             operationResult = FIO_decompressFilename(prefs, outFileName, filenameTable[0], dictFileName);
         else
-            operationResult = FIO_decompressMultipleFilenames(prefs, filenameTable, filenameIdx, outFileName, dictFileName);
+            operationResult = FIO_decompressMultipleFilenames(prefs, filenameTable, filenameIdx, outDirName, dstFilenameTable, outFileName, dictFileName);
 #else
         DISPLAY("Decompression not supported \n");
 #endif