X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmis-val.c;h=7aedc10b87e077e62d31e7e85f6ee9d73527d628;hb=c8e41f19f9af4d4bac023c63192484b970381027;hp=555dbf09be00c4688a12101a2fce9d2f5842a3a6;hpb=933b760efccdfa26f14254f1fae002ea3b0a1495;p=pspp diff --git a/src/mis-val.c b/src/mis-val.c index 555dbf09be..7aedc10b87 100644 --- a/src/mis-val.c +++ b/src/mis-val.c @@ -25,6 +25,7 @@ #include "error.h" #include "lexer.h" #include "magic.h" +#include "range-prs.h" #include "str.h" #include "var.h" @@ -33,21 +34,18 @@ #include "debug-print.h" -static bool parse_number (double *, const struct fmt_spec *); - int cmd_missing_values (void) { struct variable **v; - int nv; + size_t nv; int retval = CMD_PART_SUCCESS_MAYBE; bool deferred_errors = false; while (token != '.') { - int i; - + size_t i; if (!parse_variables (default_dict, &v, &nv, PV_NONE)) goto done; @@ -81,40 +79,17 @@ cmd_missing_values (void) mv_init (&mv, 0); while (!lex_match (')')) { - double x; + double x, y; + bool ok; - if (lex_match_id ("LO") || lex_match_id ("LOWEST")) - x = LOWEST; - else if (!parse_number (&x, &v[0]->print)) + if (!parse_num_range (&x, &y, &v[0]->print)) goto done; - - if (lex_match_id ("THRU")) - { - double y; - - if (lex_match_id ("HI") || lex_match_id ("HIGHEST")) - y = HIGHEST; - else if (!parse_number (&y, &v[0]->print)) - goto done; - - if (x == LOWEST && y == HIGHEST) - { - msg (SE, _("LO THRU HI is an invalid range.")); - deferred_errors = true; - } - else if (!mv_add_num_range (&mv, x, y)) - deferred_errors = true; - } - else - { - if (x == LOWEST) - { - msg (SE, _("LO or LOWEST must be part of a range.")); - deferred_errors = true; - } - else if (!mv_add_num (&mv, x)) - deferred_errors = true; - } + + ok = (x == y + ? mv_add_num (&mv, x) + : mv_add_num_range (&mv, x, y)); + if (!ok) + deferred_errors = true; lex_match (','); } @@ -178,35 +153,3 @@ cmd_missing_values (void) return retval; } -static bool -parse_number (double *x, const struct fmt_spec *f) -{ - if (lex_is_number ()) - { - *x = lex_number (); - lex_get (); - return true; - } - else if (token == T_STRING) - { - struct data_in di; - union value v; - di.s = ds_data (&tokstr); - di.e = ds_end (&tokstr); - di.v = &v; - di.flags = 0; - di.f1 = 1; - di.f2 = ds_length (&tokstr); - di.format = *f; - data_in (&di); - lex_get (); - *x = v.f; - return true; - } - else - { - lex_error (_("expecting number or data string")); - return false; - } -} -