/* Format of reals in output (SET WRB). */
enum float_format output_float_format;
+ /* MATRIX...END MATRIX settings. */
+ enum settings_mdisplay mdisplay;
+
int viewlength;
int viewwidth;
bool safer_mode;
double blanks;
int max_messages[MSG_N_SEVERITIES];
bool printback;
- bool mprint;
+
+ /* Macro settings. */
+ bool mexpand; /* Expand macros? */
+ bool mprint; /* Print macro expansions? */
+ int miterate; /* Maximum iterations of !FOR. */
+ int mnest; /* Maximum nested macro expansion levels. */
+
int mxloops;
size_t workspace;
struct fmt_spec default_format;
bool testing_mode;
int fuzzbits;
+ int scalemin;
int cmd_algorithm;
int global_algorithm;
.input_float_format = FLOAT_NATIVE_DOUBLE,
.output_integer_format = INTEGER_NATIVE,
.output_float_format = FLOAT_NATIVE_DOUBLE,
+ .mdisplay = SETTINGS_MDISPLAY_TEXT,
.viewlength = 24,
.viewwidth = 79,
.safer_mode = false,
},
.printback = true,
- .mprint = true,
+
+ .mexpand = true,
+ .mprint = false,
+ .miterate = 1000,
+ .mnest = 50,
+
.mxloops = 40,
.workspace = 64L * 1024 * 1024,
.default_format = { .type = FMT_F, .w = 8, .d = 2 },
.testing_mode = false,
.fuzzbits = 6,
+ .scalemin = 24,
.cmd_algorithm = ENHANCED,
.global_algorithm = ENHANCED,
.syntax = ENHANCED,
the_settings.include = include;
}
+/* Returns the year that starts the epoch. */
+int
+settings_get_epoch (void)
+{
+ return the_settings.styles.epoch;
+}
+
/* Sets the year that starts the epoch. */
void
settings_set_epoch (int epoch)
the_settings.max_messages[severity] = max;
}
+/* Returns whether to expand macro invocations. */
+bool
+settings_get_mexpand (void)
+{
+ return the_settings.mexpand;
+}
+
+/* Sets whether to expand macro invocations. */
+void
+settings_set_mexpand (bool mexpand)
+{
+ the_settings.mexpand = mexpand;
+}
+
/* Independent of get_printback, controls whether the commands
generated by macro invocations are displayed. */
bool
the_settings.mprint = mprint;
}
+/* Returns the limit for loop iterations within a macro. */
+int
+settings_get_miterate (void)
+{
+ return the_settings.miterate;
+}
+
+/* Sets the limit for loop iterations within a macro. */
+void
+settings_set_miterate (int miterate)
+{
+ the_settings.miterate = miterate;
+}
+
+/* Returns the limit for recursion macro expansions. */
+int settings_get_mnest (void)
+{
+ return the_settings.mnest;
+}
+
+/* Sets the limit for recursion macro expansions. */
+void
+settings_set_mnest (int mnest)
+{
+ the_settings.mnest = mnest;
+}
+
+int settings_get_mxloops (void);
+void settings_set_mxloops (int);
/* Implied limit of unbounded loop. */
int
settings_get_mxloops (void)
/* Default format for variables created by transformations and by
DATA LIST {FREE,LIST}. */
-const struct fmt_spec *
+struct fmt_spec
settings_get_format (void)
{
- return &the_settings.default_format;
+ return the_settings.default_format;
}
/* Set default format for variables created by transformations
and by DATA LIST {FREE,LIST}. */
void
-settings_set_format (const struct fmt_spec *default_format)
+settings_set_format (const struct fmt_spec default_format)
{
- the_settings.default_format = *default_format;
+ the_settings.default_format = default_format;
}
/* Are we in testing mode? (e.g. --testing-mode command line
the_settings.fuzzbits = fuzzbits;
}
+int
+settings_get_scalemin (void)
+{
+ return the_settings.scalemin;
+}
+
+void
+settings_set_scalemin (int scalemin)
+{
+ the_settings.scalemin = scalemin;
+}
+
/* Return the current algorithm setting */
enum behavior_mode
settings_get_algorithm (void)
}
\f
-/* Sets custom currency specifier CC having name CC_NAME ('A' through
- 'E') to correspond to the settings in CC_STRING. */
-bool
+/* Sets custom currency specifier CC having name CC_NAME ('A' through 'E') to
+ correspond to the settings in CC_STRING. Returns NULL if successful,
+ otherwise an error message that the caller must free. */
+char * WARN_UNUSED_RESULT
settings_set_cc (const char *cc_string, enum fmt_type type)
{
struct fmt_number_style *style = fmt_number_style_from_string (cc_string);
if (!style)
- {
- msg (SE, _("%s: Custom currency string `%s' does not contain "
- "exactly three periods or commas (or it contains both)."),
- fmt_name (type), cc_string);
- return false;
- }
+ return xasprintf (_("Custom currency string `%s' for %s does not contain "
+ "exactly three periods or commas (or it contains "
+ "both)."),
+ fmt_name (type), cc_string);
fmt_settings_set_cc (&the_settings.styles, type, style);
- return true;
+ return NULL;
}
void
the_settings.styles.decimal = decimal;
}
+void
+settings_set_include_leading_zero (bool include_leading_zero)
+{
+ the_settings.styles.include_leading_zero = include_leading_zero;
+}
+
const struct fmt_settings *
settings_get_fmt_settings (void)
{
which must be of type FMT_DOLLAR. The caller must free the
string. */
char *
-settings_dollar_template (const struct fmt_spec *fmt)
+settings_dollar_template (const struct fmt_spec fmt)
{
struct string str = DS_EMPTY_INITIALIZER;
int c;
const struct fmt_number_style *fns ;
- assert (fmt->type == FMT_DOLLAR);
+ assert (fmt.type == FMT_DOLLAR);
- fns = fmt_settings_get_style (&the_settings.styles, fmt->type);
+ fns = fmt_settings_get_style (&the_settings.styles, fmt.type);
ds_put_byte (&str, '$');
- for (c = MAX (fmt->w - fmt->d - 1, 0); c > 0;)
+ for (c = MAX (fmt.w - fmt.d - 1, 0); c > 0;)
{
ds_put_byte (&str, '#');
if (--c % 4 == 0 && c > 0)
--c;
}
}
- if (fmt->d > 0)
+ if (fmt.d > 0)
{
ds_put_byte (&str, fns->decimal);
- ds_put_byte_multiple (&str, '#', fmt->d);
+ ds_put_byte_multiple (&str, '#', fmt.d);
}
return ds_cstr (&str);
{
the_settings.show_variables = s;
}
+
+enum settings_mdisplay
+settings_get_mdisplay (void)
+{
+ return the_settings.mdisplay;
+}
+
+void
+settings_set_mdisplay (enum settings_mdisplay mdisplay)
+{
+ the_settings.mdisplay = mdisplay;
+}