MISSING VALUES: Report an error when too many missing values are specified.
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 20 Feb 2016 05:35:53 +0000 (21:35 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Sat, 20 Feb 2016 05:36:08 +0000 (21:36 -0800)
Reported by news <news.ftr@free.fr>.

src/language/dictionary/missing-values.c
tests/language/dictionary/missing-values.at

index a369c2ea6999a802f00b9d8b723f244d2f4a2ffe..8d82b480cb308edb3d45f617c2bcc82178ff9db2 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2013, 2016 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
@@ -80,16 +80,19 @@ cmd_missing_values (struct lexer *lexer, struct dataset *ds)
                 {
                   enum fmt_type type = var_get_print_format (v[0])->type;
                   double x, y;
-                  bool ok;
 
                   if (!parse_num_range (lexer, &x, &y, &type))
                     goto error;
 
-                  ok = (x == y
+                  if (!(x == y
                         ? mv_add_num (&mv, x)
-                        : mv_add_range (&mv, x, y));
-                  if (!ok)
-                    ok = false;
+                        : mv_add_range (&mv, x, y)))
+                    {
+                      msg (SE, _("Too many numeric missing values.  At most "
+                                 "three individual values or one value and "
+                                 "one range are allowed."));
+                      ok = false;
+                    }
 
                   lex_match (lexer, T_COMMA);
                 }
@@ -129,7 +132,12 @@ cmd_missing_values (struct lexer *lexer, struct dataset *ds)
                                          utf8_s, utf8_trunc_len);
                   if (!mv_add_str (&mv, CHAR_CAST (const uint8_t *, raw_s),
                                    strlen (raw_s)))
-                    ok = false;
+                    {
+                      msg (SE,
+                           _("Too many string missing values.  "
+                             "At most three individual values are allowed."));
+                      ok = false;
+                    }
                   free (raw_s);
 
                   lex_get (lexer);
index 214fc3f0fa50938c16c47475342ea3f25a7f4398..d4a901658276385104a6bf51b5084c0504f8787d 100644 (file)
@@ -142,6 +142,15 @@ MISSING VALUES str1 ('a' THRU 'z').
 
 * Mixing string and numeric variables.
 MISSING VALUES str1 num1 ('123').
+
+* Too many values.
+MISSING VALUES num1 (1, 2, 3, 4).
+MISSING VALUES num1 (1 THRU 2, 3 THRU 4).
+MISSING VALUES num1 (1, 2 THRU 3, 4).
+MISSING VALUES str1 ('abc', 'def', 'ghi', 'jkl').
+
+* Bad range.
+MISSING VALUES num1 (2 THRU 1).
 ])
 AT_CHECK([pspp -O format=csv missing-values.sps], [1], [dnl
 missing-values.sps:5: error: MISSING VALUES: Missing values provided are too long to assign to variable of width 3.
@@ -153,5 +162,15 @@ missing-values.sps:11.26-11.29: error: MISSING VALUES: Syntax error at `THRU': e
 missing-values.sps:11: error: MISSING VALUES: THRU is not a variable name.
 
 missing-values.sps:14: error: MISSING VALUES: Cannot mix numeric variables (e.g. num1) and string variables (e.g. str1) within a single list.
+
+missing-values.sps:17: error: MISSING VALUES: Too many numeric missing values.  At most three individual values or one value and one range are allowed.
+
+missing-values.sps:18: error: MISSING VALUES: Too many numeric missing values.  At most three individual values or one value and one range are allowed.
+
+missing-values.sps:19: error: MISSING VALUES: Too many numeric missing values.  At most three individual values or one value and one range are allowed.
+
+missing-values.sps:20: error: MISSING VALUES: Too many string missing values.  At most three individual values are allowed.
+
+missing-values.sps:23: warning: MISSING VALUES: The high end of the range (1) is below the low end (2).  The range will be treated as if reversed.
 ])
 AT_CLEANUP