#include <assert.h>
#include <stdlib.h>
-#include <time.h>
#include "data/case.h"
#include "data/format.h"
/* 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;
bool include;
- int epoch;
bool route_errors_to_terminal;
bool route_errors_to_listing;
bool scompress;
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;
int syntax;
struct fmt_settings styles;
+ double small;
enum settings_output_devices output_routing[SETTINGS_N_OUTPUT_TYPES];
};
static struct settings the_settings = {
- INTEGER_NATIVE, /* input_integer_format */
- FLOAT_NATIVE_DOUBLE, /* input_float_format */
- INTEGER_NATIVE, /* output_integer_format */
- FLOAT_NATIVE_DOUBLE, /* output_float_format */
- 24, /* viewlength */
- 79, /* viewwidth */
- false, /* safer_mode */
- true, /* include */
- -1, /* epoch */
- true, /* route_errors_to_terminal */
- true, /* route_errors_to_listing */
- true, /* scompress */
- true, /* undefined */
- SYSMIS, /* blanks */
-
- /* max_messages */
- {
- 100, /* MSG_S_ERROR */
- 100, /* MSG_S_WARNING */
- 100 /* MSG_S_NOTE */
+ .input_integer_format = INTEGER_NATIVE,
+ .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,
+ .include = true,
+ .route_errors_to_terminal = true,
+ .route_errors_to_listing = true,
+ .scompress = true,
+ .undefined = true,
+ .blanks = SYSMIS,
+
+ .max_messages = {
+ [MSG_S_ERROR] = 100,
+ [MSG_S_WARNING] = 100,
+ [MSG_S_NOTE] = 100
},
- true, /* printback */
- true, /* mprint */
- 40, /* mxloops */
- 64L * 1024 * 1024, /* workspace */
- {FMT_F, 8, 2}, /* default_format */
- false, /* testing_mode */
- 6, /* fuzzbits */
- ENHANCED, /* cmd_algorithm */
- ENHANCED, /* global_algorithm */
- ENHANCED, /* syntax */
- FMT_SETTINGS_INIT, /* styles */
+ .printback = 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,
+ .cmd_algorithm = ENHANCED,
+ .global_algorithm = ENHANCED,
+ .syntax = ENHANCED,
+ .styles = FMT_SETTINGS_INIT,
+ .small = .0001,
/* output_routing */
- {SETTINGS_DEVICE_LISTING | SETTINGS_DEVICE_TERMINAL,
- SETTINGS_DEVICE_LISTING | SETTINGS_DEVICE_TERMINAL,
- 0,
- SETTINGS_DEVICE_LISTING | SETTINGS_DEVICE_TERMINAL},
+ .output_routing = {
+#define LT (SETTINGS_DEVICE_LISTING | SETTINGS_DEVICE_TERMINAL)
+ [SETTINGS_OUTPUT_ERROR] = LT,
+ [SETTINGS_OUTPUT_NOTE] = LT,
+ [SETTINGS_OUTPUT_SYNTAX] = 0,
+ [SETTINGS_OUTPUT_RESULT] = LT
+#undef LT
+ },
- SETTINGS_VALUE_SHOW_LABEL,
- SETTINGS_VALUE_SHOW_LABEL
+ .show_values = SETTINGS_VALUE_SHOW_LABEL,
+ .show_variables = SETTINGS_VALUE_SHOW_LABEL,
};
/* Initializes the settings module. */
void
settings_init (void)
{
- settings_set_epoch (-1);
settings_set_decimal_char (get_system_decimal ());
}
settings_copy (struct settings *dst, const struct settings *src)
{
*dst = *src;
- fmt_settings_copy (&dst->styles, &src->styles);
+ dst->styles = fmt_settings_copy (&src->styles);
}
/* Returns a copy of the current settings. */
the_settings.include = include;
}
-/* What year to use as the start of the epoch. */
+/* Returns the year that starts the epoch. */
int
settings_get_epoch (void)
{
- assert (the_settings.epoch >= 0);
-
- return the_settings.epoch;
+ return the_settings.styles.epoch;
}
/* Sets the year that starts the epoch. */
void
settings_set_epoch (int epoch)
{
- if (epoch < 0)
- {
- time_t t = time (0);
- struct tm *tm = localtime (&t);
- epoch = (tm != NULL ? tm->tm_year + 1900 : 2000) - 69;
- }
-
- the_settings.epoch = epoch;
- assert (the_settings.epoch >= 0);
+ the_settings.styles.epoch = epoch;
}
/* Compress system files by default? */
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)
return true;
}
-/* Returns the decimal point character for TYPE. */
-int
-settings_get_decimal_char (enum fmt_type type)
-{
- return fmt_settings_get_style (&the_settings.styles, type)->decimal;
-}
-
void
settings_set_decimal_char (char decimal)
{
the_settings.styles.decimal = decimal;
}
-/* Returns the number formatting style associated with the given
- format TYPE. */
-const struct fmt_number_style *
-settings_get_style (enum fmt_type type)
+const struct fmt_settings *
+settings_get_fmt_settings (void)
+{
+ return &the_settings.styles;
+}
+
+double
+settings_get_small (void)
{
- assert (is_fmt_type (type));
- return fmt_settings_get_style (&the_settings.styles, type);
+ return the_settings.small;
+}
+
+void
+settings_set_small (double small)
+{
+ the_settings.small = small;
}
/* Returns a string of the form "$#,###.##" according to FMT,
{
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;
+}