about summary refs log tree commit diff
path: root/converter/other/fiasco/pnmtofiasco.c
diff options
context:
space:
mode:
Diffstat (limited to 'converter/other/fiasco/pnmtofiasco.c')
-rw-r--r--converter/other/fiasco/pnmtofiasco.c356
1 files changed, 166 insertions, 190 deletions
diff --git a/converter/other/fiasco/pnmtofiasco.c b/converter/other/fiasco/pnmtofiasco.c
index 9f63e7a1..311a21c3 100644
--- a/converter/other/fiasco/pnmtofiasco.c
+++ b/converter/other/fiasco/pnmtofiasco.c
@@ -1,5 +1,5 @@
 /*
- *  cwfa.c:     FIASCO coder
+ *  FIASCO coder
  *
  *  Written by:     Ullrich Hafner
  *
@@ -15,32 +15,25 @@
  */
 
 #include "config.h"
-#include "pm_c_util.h"
-#include "pnm.h"
-
 #include <stdlib.h>
 #include <string.h>
 #include <string.h>
 
+#include "pm_c_util.h"
+#include "mallocvar.h"
+#include "pnm.h"
+
 #include "types.h"
 #include "macros.h"
 
-#include "binerror.h"
 #include "misc.h"
 #include "params.h"
 #include "fiasco.h"
 
-/*****************************************************************************
 
-                 local variables
 
-*****************************************************************************/
-
-static param_t params [] =
-{
-  /*
-   *  Options for standard user
-   */
+static param_t params[] = {
+  /* Options for standard user */
   {"image-name", "FILE", 'i', PSTR, {0}, NULL,
    "Compress raw PPM/PGM image(s) `%s'."},
   {"output-name", "FILE", 'o', PSTR, {0}, "-",
@@ -136,244 +129,202 @@ static param_t params [] =
   {NULL, NULL, 0, PSTR, {0}, NULL, NULL }
 };
 
-/*****************************************************************************
-
-                prototypes
-
-*****************************************************************************/
-
-static void
-checkargs (int argc, char **argv, char const ***image_template,
-       char **wfa_name, float *quality, fiasco_c_options_t **options);
-
-/*****************************************************************************
-
-                public code
-
-*****************************************************************************/
-
-int
-main (int argc, char **argv)
-{
-   char const         **image_template; /* template for input image files */
-   char                *wfa_name;   /* filename of output WFA */
-   float            quality;    /* approximation quality */
-   fiasco_c_options_t  *options;    /* additional coder options */
-
-   pnm_init(&argc, argv);
-
-   init_error_handling (argv [0]);
-
-   checkargs (argc, argv, &image_template, &wfa_name, &quality, &options);
-
-   if (fiasco_coder (image_template, wfa_name, quality, options))
-      return 0;
-   else
-   {
-       fprintf (stderr, "%s", fiasco_get_error_message ());
-      fprintf (stderr, "\n");
-      return 1;
-   }
-}
-
-/*****************************************************************************
-
-                private code
 
-*****************************************************************************/
 
 static void
-checkargs (int argc, char **argv, char const ***image_template,
-           char **wfa_name, float *quality, fiasco_c_options_t **options)
-/*
- *  Check validness of command line parameters and of the parameter files.
- *
- *  Return value:
- *  1 on success
- *  0 otherwise
- *
- *
- *  Side effects:
- *  'image_template', 'wfa_name', 'quality' and 'options' are set.
- */
-{
-    int   optind;            /* last processed commandline param */
-    char *image_name;            /* filename given by option '--input_name' */
-    int   i;             /* counter */
-
-    optind = parseargs (params, argc, argv,
-                        "Compress raw PPM/PGM image FILEs to a FIASCO file.",
-                        "With no image FILE, or if FILE is -, "
-                        "read standard input.\n"
-                        "FILE must be either a filename"
-                        " or an image template of the form:\n"
-                        "`prefix[start-end{+,-}step]suffix'\n"
-                        "e.g., img0[12-01-1].pgm is substituted by"
-                        " img012.pgm ... img001.pgm\n\n"
-                        "Environment:\n"
-                        "FIASCO_DATA   Search and save path for FIASCO files. "
-                        "Default: ./\n"
-                        "FIASCO_IMAGES Search path for image files. "
-                        "Default: ./", " [FILE]...",
-                        FIASCO_SHARE, "system.fiascorc", ".fiascorc");
-
-    /*
-     *  Default options ...
-     */
-    image_name = (char *) parameter_value (params, "image-name");
-    *wfa_name  = (char *) parameter_value (params, "output-name");
-    for (;;)
-    {
-        *quality = * (float *) parameter_value (params, "quality");
+checkargs(int                         argc,
+          const char **               argv,
+          const char ***        const imageTemplateListP,
+          char **               const wfa_name,
+          float *               const quality,
+          fiasco_c_options_t ** const options) {
+/*----------------------------------------------------------------------------
+  Check validness of command line parameters and of the parameter files.
+
+  Return value:
+    1 on success
+    0 otherwise
+-----------------------------------------------------------------------------*/
+    int    optind;            /* last processed commandline param */
+    char * image_name;            /* filename given by option '--input_name' */
+    const char ** imageTemplateList;
+
+    optind = parseargs(params, argc, argv,
+                       "Compress raw PPM/PGM image FILEs to a FIASCO file.",
+                       "With no image FILE, or if FILE is -, "
+                       "read standard input.\n"
+                       "FILE must be either a filename"
+                       " or an image template of the form:\n"
+                       "`prefix[start-end{+,-}step]suffix'\n"
+                       "e.g., img0[12-01-1].pgm is substituted by"
+                       " img012.pgm ... img001.pgm\n\n"
+                       "Environment:\n"
+                       "FIASCO_DATA   Search and save path for FIASCO files. "
+                       "Default: ./\n"
+                       "FIASCO_IMAGES Search path for image files. "
+                       "Default: ./", " [FILE]...",
+                       FIASCO_SHARE, "system.fiascorc", ".fiascorc");
+
+    /* Default options  */
+    image_name = (char *) parameter_value(params, "image-name");
+    *wfa_name  = (char *) parameter_value(params, "output-name");
+    for (;;) {
+        *quality = * (float *) parameter_value(params, "quality");
         if (*quality > 100)
-            fprintf (stderr, "Typical range of quality: (0,100].\n"
-                     "Expect some trouble on slow machines.\n");
+            pm_message("Typical range of quality: (0,100].  "
+                       "Expect some trouble on slow machines.");
         if (*quality > 0)
             break;
-        ask_and_set (params, "quality",
-                     "Please enter coding quality 'q' ('q' > 0): ");
+        ask_and_set(params, "quality",
+                    "Please enter coding quality 'q' ('q' > 0): ");
     }
 
-    if (optind < argc)           /* Additional command line param */
-    {
+    /* Non-option command line params */
+    if (optind < argc) {
+        unsigned int i;
         if (image_name)
-            error ("Multiple image_template arguments."
-                   "\nOption --input-name %s already specified!", image_name);
-
-        *image_template = calloc (argc - optind + 1, sizeof (char *));
-        if (!*image_template)
-            error ("Out of memory.");
-        for (i = 0; optind < argc; i++, optind++)
-            (*image_template) [i] = argv [optind];
-        (*image_template) [i] = NULL;
-    }
-    else                 /* option -i image_name */
-    {
-        *image_template = calloc (2, sizeof (char *));
-        if (!*image_template)
-            error ("Out of memory.");
-        (*image_template) [0] = image_name;
-        (*image_template) [1] = NULL;
+            pm_error("Multiple image name template arguments.  "
+                     "Option --image-name already specified with '%s'",
+                     image_name);
+
+        MALLOCARRAY_NOFAIL(imageTemplateList, argc - optind + 1);
+
+        for (i = 0; optind < argc; ++i, ++optind)
+            imageTemplateList[i] = argv[optind];
+        imageTemplateList[i] = NULL;
+    } else {
+        /* option -i image_name */
+
+        MALLOCARRAY_NOFAIL(imageTemplateList, 2);
+
+        imageTemplateList[0] = image_name;
+        imageTemplateList[1] = NULL;
     }
-    /*
-     *  Additional options ... (have to be set with the fiasco_set_... methods)
+    /* Additional options ... (have to be set with the fiasco_set_... methods)
      */
     {
-        *options = fiasco_c_options_new ();
+        *options = fiasco_c_options_new();
 
         {
-            char *pattern = (char *) parameter_value (params, "pattern");
+            const char * const pattern = parameter_value(params, "pattern");
 
             if (!fiasco_c_options_set_frame_pattern (*options, pattern))
-                error (fiasco_get_error_message ());
+                pm_error("%s", fiasco_get_error_message ());
         }
 
         {
-            char *basis = (char *) parameter_value (params, "basis-name");
+            const char *const basis = parameter_value(params, "basis-name");
 
             if (!fiasco_c_options_set_basisfile (*options, basis))
-                error (fiasco_get_error_message ());
+                pm_error("%s", fiasco_get_error_message ());
         }
 
         {
-            int   n = * (int *) parameter_value (params, "chroma-dictionary");
-            float q = * (float *) parameter_value (params, "chroma-qfactor");
+            int   const n =
+                *(int *)parameter_value(params, "chroma-dictionary");
+            float const q =
+                *(float *)parameter_value(params, "chroma-qfactor");
 
-            if (!fiasco_c_options_set_chroma_quality (*options, q, MAX(0, n)))
-                error (fiasco_get_error_message ());
+            if (!fiasco_c_options_set_chroma_quality(*options, q, MAX(0, n)))
+                pm_error("%s", fiasco_get_error_message ());
         }
 
         {
-            int n = *((int *) parameter_value (params, "smooth"));
+            int const n = *((int *)parameter_value(params, "smooth"));
 
-            if (!fiasco_c_options_set_smoothing (*options, MAX(0, n)))
-                error (fiasco_get_error_message ());
+            if (!fiasco_c_options_set_smoothing(*options, MAX(0, n)))
+                pm_error("%s", fiasco_get_error_message ());
         }
 
         {
-            int n = * (int *) parameter_value (params, "progress-meter");
+            int const n = *(int *)parameter_value(params, "progress-meter");
             fiasco_progress_e type = (n < 0) ?
                 FIASCO_PROGRESS_NONE : (fiasco_progress_e) n;
 
-            if (!fiasco_c_options_set_progress_meter (*options, type))
-                error (fiasco_get_error_message ());
+            if (!fiasco_c_options_set_progress_meter(*options, type))
+                pm_error("%s", fiasco_get_error_message ());
         }
 
         {
-            char *t = (char *) parameter_value (params, "title");
+            const char * const t = parameter_value(params, "title");
 
-            if (strlen (t) > 0 && !fiasco_c_options_set_title (*options, t))
-                error (fiasco_get_error_message ());
+            if (strlen(t) > 0 && !fiasco_c_options_set_title(*options, t))
+                pm_error("%s", fiasco_get_error_message ());
         }
 
         {
-            char *c = (char *) parameter_value (params, "comment");
+            const char * const c = parameter_value(params, "comment");
 
             if (strlen (c) > 0 && !fiasco_c_options_set_comment (*options, c))
-                error (fiasco_get_error_message ());
+                pm_error("%s", fiasco_get_error_message ());
         }
 
         {
             fiasco_tiling_e method = FIASCO_TILING_VARIANCE_DSC;
-            int   e  = * (int *) parameter_value (params, "tiling-exponent");
-            char *m  = (char *) parameter_value (params, "tiling-method");
+            int    const e =
+                *(int *)parameter_value(params, "tiling-exponent");
+            const char * const m = parameter_value (params, "tiling-method");
 
-            if (strcaseeq (m, "desc-variance"))
+            if (strcaseeq(m, "desc-variance"))
                 method = FIASCO_TILING_VARIANCE_DSC;
-            else if (strcaseeq (m, "asc-variance"))
+            else if (strcaseeq(m, "asc-variance"))
                 method = FIASCO_TILING_VARIANCE_ASC;
-            else if (strcaseeq (m, "asc-spiral"))
+            else if (strcaseeq(m, "asc-spiral"))
                 method = FIASCO_TILING_SPIRAL_ASC;
-            else if (strcaseeq (m, "dsc-spiral"))
+            else if (strcaseeq(m, "dsc-spiral"))
                 method = FIASCO_TILING_SPIRAL_DSC;
             else
-                error (_("Invalid tiling method `%s' specified."), m);
+                pm_error("Invalid tiling method `%s' specified.", m);
 
-            if (!fiasco_c_options_set_tiling (*options, method, MAX(0, e)))
-                error (fiasco_get_error_message ());
+            if (!fiasco_c_options_set_tiling(*options, method, MAX(0, e)))
+                pm_error("%s", fiasco_get_error_message ());
         }
 
         {
-            int M/*  = * (int *) parameter_value (params, "max-level") */;
-            int m/*  = * (int *) parameter_value (params, "min-level") */;
-            int N/*  = * (int *) parameter_value (params, "max-elements") */;
-            int D = * (int *) parameter_value (params, "dictionary-size");
-            int o = * (int *) parameter_value (params, "optimize");
-
-            if (o <= 0)
-            {
+            int M /*  = * (int *) parameter_value (params, "max-level") */;
+            int m /*  = * (int *) parameter_value (params, "min-level") */;
+            int N /*  = * (int *) parameter_value (params, "max-elements") */;
+            int o;
+            int D = * (int *) parameter_value(params, "dictionary-size");
+            int const optimizeOpt =
+                *(int *)parameter_value(params, "optimize");
+
+            if (optimizeOpt <= 0) {
                 o = 0;
                 M = 10;
                 m = 6;
                 N = 3;
-            }
-            else
-            {
+            } else {
                 o -= 1;
                 M = 12;
                 m = 4;
                 N = 5;
             }
 
-            if (!fiasco_c_options_set_optimizations (*options, m, M, N,
-                                                     MAX(0, D), o))
-                error (fiasco_get_error_message ());
+            if (!fiasco_c_options_set_optimizations(*options, m, M, N,
+                                                    MAX(0, D), o))
+                pm_error("%s", fiasco_get_error_message ());
         }
         {
-            int M = * (int *) parameter_value (params, "max-level");
-            int m = * (int *) parameter_value (params, "min-level");
-            int p = * (int *) parameter_value (params, "prediction");
+            int const M = *(int *)parameter_value(params, "max-level");
+            int const m = *(int *)parameter_value(params, "min-level");
+            int const p = *(int *)parameter_value(params, "prediction");
 
             if (!fiasco_c_options_set_prediction (*options,
                                                   p, MAX(0, m), MAX(0, M)))
-                error (fiasco_get_error_message ());
+                pm_error("%s", fiasco_get_error_message ());
         }
         {
-            float r    = * (float *)parameter_value(params, "rpf-range");
-            float dc_r = * (float *)parameter_value(params, "dc-rpf-range");
-            int   m    = * (int *)  parameter_value(params, "rpf-mantissa");
-            int   dc_m = * (int *)  parameter_value(params, "dc-rpf-mantissa");
-            fiasco_rpf_range_e range, dc_range;
+            float const r    =
+                *(float *)parameter_value(params, "rpf-range");
+            float const dcR =
+                *(float *)parameter_value(params, "dc-rpf-range");
+            int   const m    =
+                *(int *)parameter_value(params, "rpf-mantissa");
+            int   const dcM =
+                *(int *)parameter_value(params, "dc-rpf-mantissa");
+
+            fiasco_rpf_range_e range, dcRange;
 
             if (r < 1)
                 range = FIASCO_RPF_RANGE_0_75;
@@ -384,24 +335,49 @@ checkargs (int argc, char **argv, char const ***image_template,
             else
                 range = FIASCO_RPF_RANGE_2_00;
 
-            if (dc_r < 1)
-                dc_range = FIASCO_RPF_RANGE_0_75;
-            else if (dc_r < 1.5)
-                dc_range = FIASCO_RPF_RANGE_1_00;
-            else if (dc_r < 2.0)
-                dc_range = FIASCO_RPF_RANGE_1_50;
+            if (dcR < 1)
+                dcRange = FIASCO_RPF_RANGE_0_75;
+            else if (dcR < 1.5)
+                dcRange = FIASCO_RPF_RANGE_1_00;
+            else if (dcR < 2.0)
+                dcRange = FIASCO_RPF_RANGE_1_50;
             else
-                dc_range = FIASCO_RPF_RANGE_2_00;
+                dcRange = FIASCO_RPF_RANGE_2_00;
 
-            if (!fiasco_c_options_set_quantization (*options,
-                                                    MAX(0, m), range,
-                                                    MAX(0, dc_m), dc_range))
-                error (fiasco_get_error_message ());
+            if (!fiasco_c_options_set_quantization(*options,
+                                                   MAX(0, m), range,
+                                                   MAX(0, dcM), dcRange))
+                pm_error("%s", fiasco_get_error_message ());
         }
 
-        if (fiasco_get_verbosity () == FIASCO_ULTIMATE_VERBOSITY)
-            write_parameters (params, stderr);
+        if (fiasco_get_verbosity() == FIASCO_ULTIMATE_VERBOSITY)
+            write_parameters(params, stderr);
+    }
+    *imageTemplateListP = imageTemplateList;
+}
+
+
+
+int
+main(int argc, const char **argv) {
+
+    char const **        image_template; /* template for input image files */
+    char *               wfa_name;   /* filename of output WFA */
+    float                quality;    /* approximation quality */
+    fiasco_c_options_t * options;    /* additional coder options */
+    int                  retval;
+
+    pm_proginit(&argc, argv);
+
+    checkargs(argc, argv, &image_template, &wfa_name, &quality, &options);
+
+    if (fiasco_coder(image_template, wfa_name, quality, options))
+        retval = 0;
+    else {
+        pm_message("Encoding failed.  %s", fiasco_get_error_message());
+        retval = 1;
     }
+    return retval;
 }