Make minimum breaks configurable.
[pspp] / src / output / options.c
index 918f718c0fb79df7a06d2bb19416581b09e42624..be2bed42d98ecfd8f4040f81e0f912e4b3a3fec6 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2010, 2014 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -29,7 +29,6 @@
 #include "output/driver-provider.h"
 #include "output/measure.h"
 
-#include "gl/error.h"
 #include "gl/xalloc.h"
 
 #include "gettext.h"
@@ -49,7 +48,7 @@ driver_option_create (const char *driver_name, const char *name,
   o->driver_name = xstrdup (driver_name);
   o->name = xstrdup (name);
   o->value = value != NULL ? xstrdup (value) : NULL;
-  o->default_value = xstrdup (default_value);
+  o->default_value = default_value ? xstrdup (default_value) : NULL;
   return o;
 }
 
@@ -110,7 +109,7 @@ do_parse_boolean (const char *driver_name, const char *key,
     return false;
   else
     {
-      error (0, 0, _("%s: \"%s\" is \"%s\" but a Boolean value is required"),
+      msg (MW, _("%s: `%s' is `%s' but a Boolean value is required"),
              driver_name, value, key);
       return -1;
     }
@@ -145,7 +144,7 @@ parse_boolean (struct driver_option *o)
    O has no user-specified value, then O's default value is treated the same
    way.  If the default value still does not match, parse_enum() returns 0.
 
-   Example: parse_enum (o, "a", 1, "b", 2, (char *) NULL) returns 1 if O's
+   Example: parse_enum (o, "a", 1, "b", 2, NULL_SENTINEL) returns 1 if O's
    value if "a", 2 if O's value is "b".
 
    Destroys O. */
@@ -185,7 +184,7 @@ parse_enum (struct driver_option *o, ...)
                   ds_put_format (&choices, "`%s'", s);
                 }
 
-              error (0, 0, _("%s: \"%s\" is \"%s\" but one of the following "
+              msg (MW, _("%s: `%s' is `%s' but one of the following "
                              "is required: %s"),
                      o->driver_name, o->name, o->value, ds_cstr (&choices));
               ds_destroy (&choices);
@@ -229,22 +228,22 @@ parse_int (struct driver_option *o, int min_value, int max_value)
       else if (max_value == INT_MAX)
         {
           if (min_value == 0)
-            error (0, 0, _("%s: \"%s\" is \"%s\" but a nonnegative integer "
+            msg (MW, _("%s: `%s' is `%s' but a nonnegative integer "
                            "is required"),
                    o->driver_name, o->name, o->value);
           else if (min_value == 1)
-            error (0, 0, _("%s: \"%s\" is \"%s\" but a positive integer is "
+            msg (MW, _("%s: `%s' is `%s' but a positive integer is "
                            "required"), o->driver_name, o->name, o->value);
           else if (min_value == INT_MIN)
-            error (0, 0, _("%s: \"%s\" is \"%s\" but an integer is required"),
+            msg (MW, _("%s: `%s' is `%s' but an integer is required"),
                    o->driver_name, o->name, o->value);
           else
-            error (0, 0, _("%s: \"%s\" is \"%s\" but an integer greater "
+            msg (MW, _("%s: `%s' is `%s' but an integer greater "
                            "than %d is required"),
                    o->driver_name, o->name, o->value, min_value - 1);
         }
       else
-        error (0, 0, _("%s: \"%s\" is \"%s\"  but an integer between %d and "
+        msg (MW, _("%s: `%s' is `%s'  but an integer between %d and "
                        "%d is required"),
                o->driver_name, o->name, o->value, min_value, max_value);
     }
@@ -262,9 +261,9 @@ parse_dimension (struct driver_option *o)
 {
   int retval;
 
-  retval = o->value != NULL ? measure_dimension (o->value) : -1;
-  if (retval == -1)
-    retval = measure_dimension (o->default_value);
+  retval = (o->value != NULL ? measure_dimension (o->value)
+            : o->default_value != NULL ? measure_dimension (o->default_value)
+            : -1);
 
   driver_option_destroy (o);
   return retval;
@@ -282,30 +281,57 @@ parse_string (struct driver_option *o)
   return retval;
 }
 
-/* Parses O's value as a string and returns it as a malloc'd string that the
-   caller is responsible for freeing.
+static char *
+default_chart_file_name (const char *file_name)
+{
+  if (strcmp (file_name, "-"))
+    {
+      const char *extension = strrchr (file_name, '.');
+      int stem_length = extension ? extension - file_name : strlen (file_name);
+      return xasprintf ("%.*s-#.png", stem_length, file_name);
+    }
+  else
+    return NULL;
+}
+
+/* Parses and returns a chart file name, or NULL if no charts should be output.
+   If a nonnull string is returned, it will contain at least one '#' character,
+   which the client will presumably replace by a number as part of writing
+   charts to separate files.
+
+   If O->value is "none", then this function returns NULL.
 
-   The string must contain at least one '#' character, which the client will
-   presumably replace by a number as part of writing charts to separate files.
+   If O->value is non-NULL but not "none", returns a copy of that string (if it
+   contains '#').
+
+   If O->value is NULL, then O's default_value should be the name of the main
+   output file.  Returns NULL if default_value is "-", and otherwise returns a
+   copy of string string with its extension stripped off and "-#.png" appended.
 
    Destroys O. */
 char *
 parse_chart_file_name (struct driver_option *o)
 {
-  char *value;
+  char *chart_file_name;
 
-  if (o->value != NULL && strchr (o->value, '#') != NULL)
-    value = xstrdup (o->value);
-  else
+  if (o->value != NULL)
     {
-      value = xstrdup (o->default_value);
-      if (o->value != NULL)
-        error (0, 0, _("%s: \"%s\" is \"%s\" but a file name that contains "
-                       "\"#\" is required."),
-               o->name, o->value, o->driver_name);
+      if (!strcmp (o->value, "none"))
+        chart_file_name = NULL;
+      else if (strchr (o->value, '#') != NULL)
+        chart_file_name = xstrdup (o->value);
+      else
+        {
+          msg (MW, _("%s: `%s' is `%s' but a file name that contains "
+                         "`#' is required."),
+                 o->name, o->value, o->driver_name);
+          chart_file_name = default_chart_file_name (o->default_value);
+        }
     }
+  else
+    chart_file_name = default_chart_file_name (o->default_value);
 
   driver_option_destroy (o);
 
-  return value;
+  return chart_file_name;
 }