X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdictionary%2Fmissing-values.c;h=8d82b480cb308edb3d45f617c2bcc82178ff9db2;hb=f5711a3a6d3f28e53513269e774bfa1e8274c1c5;hp=3ff4c426ff691771c0051118e064a7056cd71029;hpb=9ade26c8349b4434008c46cf09bc7473ec743972;p=pspp diff --git a/src/language/dictionary/missing-values.c b/src/language/dictionary/missing-values.c index 3ff4c426ff..8d82b480cb 100644 --- a/src/language/dictionary/missing-values.c +++ b/src/language/dictionary/missing-values.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011 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 @@ -20,9 +20,9 @@ #include "data/data-in.h" #include "data/dictionary.h" +#include "data/dataset.h" #include "data/format.h" #include "data/missing-values.h" -#include "data/procedure.h" #include "data/value.h" #include "data/variable.h" #include "language/command.h" @@ -80,28 +80,35 @@ 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); } } else { + const char *encoding = dict_get_encoding (dict); + mv_init (&mv, MV_MAX_STRING); while (!lex_match (lexer, T_RPAREN)) { - uint8_t value[MV_MAX_STRING]; - char *dict_mv; - size_t length; + const char *utf8_s; + size_t utf8_trunc_len; + size_t utf8_len; + + char *raw_s; if (!lex_force_string (lexer)) { @@ -109,24 +116,29 @@ cmd_missing_values (struct lexer *lexer, struct dataset *ds) break; } - dict_mv = recode_string (dict_get_encoding (dict), "UTF-8", - lex_tokcstr (lexer), - ss_length (lex_tokss (lexer))); - length = strlen (dict_mv); - if (length > MV_MAX_STRING) + /* Truncate the string to fit in 8 bytes in the dictionary + encoding. */ + utf8_s = lex_tokcstr (lexer); + utf8_len = ss_length (lex_tokss (lexer)); + utf8_trunc_len = utf8_encoding_trunc_len (utf8_s, encoding, + MV_MAX_STRING); + if (utf8_trunc_len < utf8_len) + msg (SE, _("Truncating missing value to maximum " + "acceptable length (%d bytes)."), + MV_MAX_STRING); + + /* Recode to dictionary encoding and add. */ + raw_s = recode_string (encoding, "UTF-8", + utf8_s, utf8_trunc_len); + if (!mv_add_str (&mv, CHAR_CAST (const uint8_t *, raw_s), + strlen (raw_s))) { - /* XXX truncate graphemes not bytes */ - msg (SE, _("Truncating missing value to maximum " - "acceptable length (%d bytes)."), - MV_MAX_STRING); - length = MV_MAX_STRING; + msg (SE, + _("Too many string missing values. " + "At most three individual values are allowed.")); + ok = false; } - memset (value, ' ', MV_MAX_STRING); - memcpy (value, dict_mv, length); - free (dict_mv); - - if (!mv_add_str (&mv, value)) - ok = false; + free (raw_s); lex_get (lexer); lex_match (lexer, T_COMMA);