/* 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
#include "output/driver-provider.h"
#include "output/measure.h"
-#include "gl/error.h"
#include "gl/xalloc.h"
#include "gettext.h"
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;
}
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;
}
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. */
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);
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);
}
{
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;
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;
}