X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fdata%2Fsettings.c;h=d4ed848a7e7336f47159debe4852a30ae027c82a;hb=54b3aa8432383287c75b9baf954b7bf887126a0c;hp=0dfa94751f974ff8ba1f6c50d05638c5d7a157d0;hpb=78d5f809e7dedb2fa85ac1961a340089fd2e2711;p=pspp diff --git a/src/data/settings.c b/src/data/settings.c index 0dfa94751f..d4ed848a7e 100644 --- a/src/data/settings.c +++ b/src/data/settings.c @@ -48,6 +48,9 @@ struct settings /* 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; @@ -59,12 +62,19 @@ struct settings 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; @@ -84,6 +94,7 @@ static struct settings the_settings = { .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, @@ -101,12 +112,18 @@ static struct settings the_settings = { }, .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, @@ -294,6 +311,13 @@ settings_set_include (bool include) 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) @@ -384,6 +408,20 @@ settings_set_max_messages (enum msg_severity severity, int max) 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 @@ -400,6 +438,35 @@ settings_set_mprint (bool mprint) 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) @@ -442,18 +509,18 @@ settings_set_workspace (size_t workspace) /* 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 @@ -483,6 +550,18 @@ settings_set_fuzzbits (int fuzzbits) 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) @@ -526,22 +605,21 @@ settings_set_syntax (enum behavior_mode mode) } -/* 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 @@ -550,6 +628,12 @@ settings_set_decimal_char (char decimal) 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) { @@ -572,18 +656,18 @@ settings_set_small (double small) 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) @@ -592,10 +676,10 @@ settings_dollar_template (const struct fmt_spec *fmt) --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); @@ -640,3 +724,15 @@ settings_set_show_variables (enum settings_value_show s) { 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; +}