diff tests/dzlib.c @ 1206:0f07f752cd73

Rename one module under tests/
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 05 Mar 2015 20:14:06 +0200
parents tests/testdmzlib.c@ef5a9c51569c
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/dzlib.c	Thu Mar 05 20:14:06 2015 +0200
@@ -0,0 +1,332 @@
+#include "dmlib.h"
+#include "dmzlib.h"
+#include "dmfile.h"
+#include "dmargs.h"
+#include <zlib.h>
+
+
+#define SET_TMPBUF_SIZE (16 * 1024)
+
+char 	*optInFilename = NULL,
+        *optOutFilename = NULL;
+
+unsigned int optSkip = 0;
+unsigned int optCompressLevel = Z_BEST_COMPRESSION;
+BOOL    optCompress = FALSE,
+        optUseZLIB = FALSE;
+
+
+static const DMOptArg optList[] =
+{
+    {  0, '?', "help",        "Show this help", OPT_NONE },
+    {  1, 'q', "quiet",       "Decrease verbosity", OPT_NONE },
+    {  2, 'Z', "zlib",        "Use ZLIB instead of dmzlib", OPT_NONE },
+    {  3, 'c', "compress",    "Compress instead of decompressing (ZLIB only)", OPT_NONE },
+    {  4, 'l', "level",       "Set zlib compression level 1-9", OPT_ARGREQ },
+    {  5, 's', "skip",        "Skip bytes from input start", OPT_ARGREQ },
+};
+
+static const int optListN = sizeof(optList) / sizeof(optList[0]);
+
+
+void argShowHelp()
+{
+    dmPrintBanner(stdout, dmProgName, "[options] [input filename] [output filename]");
+    dmArgsPrintHelp(stdout, optList, optListN, 0);
+}
+
+
+BOOL argHandleOpt(const int optN, char *optArg, char *currArg)
+{
+    (void) currArg;
+
+    switch (optN)
+    {
+        case 0:
+            argShowHelp();
+            exit(0);
+            break;
+
+        case 1:
+            dmVerbosity = 0;
+            break;
+
+        case 2:
+            optUseZLIB = TRUE;
+            break;
+
+        case 3:
+            optCompress = TRUE;
+            break;
+
+        case 4:
+            if (!dmGetIntVal(optArg, &optCompressLevel) ||
+                optCompressLevel < 1 || optCompressLevel > 9)
+            {
+                dmErrorMsg("Invalid compression level argument '%s', must be 1 .. 9.\n", optArg);
+                return FALSE;
+            }
+            break;
+
+        case 5:
+            if (!dmGetIntVal(optArg, &optSkip))
+            {
+                dmErrorMsg("Invalid skip value.\n", optArg);
+                return FALSE;
+            }
+            break;
+
+        default:
+            return FALSE;
+    }
+
+    return TRUE;
+}
+
+
+BOOL argHandleFile(char *currArg)
+{
+    if (optInFilename == NULL)
+        optInFilename = currArg;
+    else
+    if (optOutFilename == NULL)
+        optOutFilename = currArg;
+    else
+    {
+        dmErrorMsg("Excess filenames specified.\n");
+        return FALSE;
+    }
+    return TRUE;
+}
+
+
+int dmTestDMZlib(FILE *inFile, FILE *outFile, size_t *inSize, size_t *outSize, BOOL compress, int level)
+{
+    Uint8 *inBuffer = NULL, *outBuffer = NULL;
+    DMZLibContext ctx;
+    int ret;
+
+    (void) level;
+
+    if (compress)
+    {
+        ret = dmError(DMERR_NOT_SUPPORTED,
+            "Compression is not supported with dmzlib.\n");
+        goto out;
+    }
+
+    if ((ret = dmReadDataFile(inFile, "-", &inBuffer, inSize)) != DMERR_OK)
+    {
+        dmErrorMsg("Failed to read file.\n");
+        goto out;
+    }
+
+    if ((outBuffer = dmMalloc(SET_TMPBUF_SIZE)) == NULL)
+    {
+        ret = dmError(DMERR_MALLOC,
+            "Malloc failed.\n");
+        goto out;
+    }
+
+    // Initialize decompression structures
+    if ((ret = dmZLibInitInflate(&ctx)) != DMERR_OK)
+        goto out;
+
+    ctx.inBuffer     = ctx.inBufferStart = inBuffer;
+    ctx.inBufferEnd  = inBuffer + *inSize;
+
+    ctx.outBuffer    = ctx.outBufferStart = outBuffer;
+    ctx.outBufferEnd = outBuffer + SET_TMPBUF_SIZE;
+    ctx.expandable   = TRUE;
+
+    // Attempt decompression
+    if ((ret = dmZLibParseHeader(&ctx, TRUE)) != DMERR_OK)
+    {
+        dmErrorMsg("Error parsing ZLIB header: %d, %s\n", ret, dmErrorStr(ret));
+        goto out;
+    }
+
+    if ((ret = dmZLibInflate(&ctx)) != DMERR_OK)
+    {
+        dmErrorMsg("Error in ZLIB decompress: %d, %s\n", ret, dmErrorStr(ret));
+        goto out;
+    }
+
+    outBuffer = ctx.outBufferStart;
+    *outSize  = ctx.outBuffer - ctx.outBufferStart;
+
+    if (fwrite(outBuffer, sizeof(Uint8), *outSize, outFile) != *outSize)
+    {
+        ret = dmError(DMERR_FWRITE, "File write error.\n");
+        goto out;
+    }
+
+out:
+    dmZLibCloseInflate(&ctx);
+    dmFree(inBuffer);
+    dmFree(outBuffer);
+    return ret;
+}
+
+
+int dmTestZlib(FILE *inFile, FILE *outFile, size_t *inSize, size_t *outSize, BOOL compress, int level)
+{
+    Uint8 *inBuffer = NULL, *outBuffer = NULL;
+    int zret, zinit = FALSE;
+    int ret = DMERR_OK;
+    z_stream zstr;
+
+    dmMsg(0, "Operating mode: %s\n",
+        compress ? "compress" : "decompress");
+
+    dmMemset(&zstr, 0, sizeof(zstr));
+
+    if ((inBuffer = malloc(SET_TMPBUF_SIZE)) == NULL ||
+        (outBuffer = malloc(SET_TMPBUF_SIZE)) == NULL)
+    {
+        ret = dmError(DMERR_MALLOC, "Malloc failed.\n");
+        goto out;
+    }
+
+    if (compress)
+        zret = deflateInit(&zstr, level);
+    else
+        zret = inflateInit(&zstr);
+
+    if (zret != Z_OK)
+    {
+        ret = dmError(DMERR_INIT_FAIL, "Zlib init fail.\n");
+        goto out;
+    }
+    zinit = TRUE;
+
+    // Initialize compression streams
+    zret = Z_OK;
+    *outSize = 0;
+    while (!feof(inFile) && zret == Z_OK)
+    {
+        zstr.avail_in = fread(inBuffer, sizeof(Uint8), SET_TMPBUF_SIZE, inFile);
+
+        zstr.next_in = inBuffer;
+        zstr.next_out = outBuffer;
+        zstr.avail_out = SET_TMPBUF_SIZE;
+        zstr.total_out = 0;
+
+        if (compress)
+            zret = deflate(&zstr, Z_FULL_FLUSH);
+        else
+            zret = inflate(&zstr, Z_FULL_FLUSH);
+
+        if (zstr.total_out > 0)
+        {
+            *outSize += zstr.total_out;
+            if (fwrite(outBuffer, sizeof(Uint8), zstr.total_out, outFile) != zstr.total_out)
+            {
+                ret = dmError(DMERR_FWRITE,
+                    "File write error.\n");
+                goto out;
+            }
+        }
+    }
+
+
+    switch (zret)
+    {
+        case Z_OK:
+            break;
+
+        case Z_ERRNO:
+            dmErrorMsg("Error: errno\n");
+            break;
+
+        case Z_STREAM_END:
+            dmErrorMsg("Stream end.\n");
+            break;
+
+        default:
+            ret = dmError(DMERR_COMPRESSION,
+                "Error: %d, %s\n", zret, zError(zret));
+    }
+
+out:
+    *inSize = zstr.total_in;
+
+    if (zinit)
+    {
+        if (compress)
+            deflateEnd(&zstr);
+        else
+            inflateEnd(&zstr);
+    }
+
+    dmFree(inBuffer);
+    dmFree(outBuffer);
+
+    return ret;
+}
+
+
+int main(int argc, char *argv[])
+{
+    FILE *inFile = NULL, *outFile = NULL;
+    size_t inSize = 0, outSize = 0;
+    int ret;
+
+    dmInitProg("testdmzlib", "ZLIB/dmzlib tester", NULL, NULL, NULL);
+    dmVerbosity = 1;
+
+    if (!dmArgsProcess(argc, argv, optList, optListN,
+        argHandleOpt, argHandleFile, OPTH_BAILOUT))
+        exit(1);
+
+    dmZLibInit();
+
+    // Input and output files
+    if (optInFilename == NULL)
+        inFile = stdin;
+    else
+    if ((inFile = fopen(optInFilename, "rb")) == NULL)
+    {
+        int res = dmGetErrno();
+        dmErrorMsg("Failed to open input file '%s': %s\n",
+            optInFilename, dmErrorStr(res));
+        goto out;
+    }
+
+    if (optOutFilename == NULL)
+        outFile = stdout;
+    else
+    if ((outFile = fopen(optOutFilename, "wb")) == NULL)
+    {
+        int res = dmGetErrno();
+        dmErrorMsg("Failed to open output file '%s': %s\n",
+            optOutFilename, dmErrorStr(res));
+        goto out;
+    }
+
+    if (optSkip > 0 && fseeko(inFile, optSkip, SEEK_CUR) != 0)
+    {
+        int res = dmGetErrno();
+        dmErrorMsg("Failed to seek in input stream: %s\n",
+            dmErrorStr(res));
+        goto out;
+    }
+
+    if (optUseZLIB)
+        ret = dmTestZlib(inFile, outFile, &inSize, &outSize, optCompress, optCompressLevel);
+    else
+        ret = dmTestDMZlib(inFile, outFile, &inSize, &outSize, optCompress, optCompressLevel);
+
+    dmMsg(0, "[%d] In %d, out %d bytes.\n", ret, inSize, outSize);
+
+out:
+    // Cleanup
+    if (outFile != NULL)
+        fclose(outFile);
+
+    if (inFile != NULL)
+        fclose(inFile);
+
+    dmZLibClose();
+    return 0;
+}