+ mv_init (&v[i]->miss, v[i]->width);
+
+ if (!lex_match (')'))
+ {
+ struct missing_values mv;
+
+ for (i = 0; i < nv; i++)
+ if (v[i]->type != v[0]->type)
+ {
+ const struct variable *n = v[0]->type == NUMERIC ? v[0] : v[i];
+ const struct variable *s = v[0]->type == NUMERIC ? v[i] : v[0];
+ msg (SE, _("Cannot mix numeric variables (e.g. %s) and "
+ "string variables (e.g. %s) within a single list."),
+ n->name, s->name);
+ goto done;
+ }
+
+ if (v[0]->type == NUMERIC)
+ {
+ mv_init (&mv, 0);
+ while (!lex_match (')'))
+ {
+ double x;
+
+ if (lex_match_id ("LO") || lex_match_id ("LOWEST"))
+ x = LOWEST;
+ else if (!parse_number (&x, &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;
+ }
+
+ lex_match (',');
+ }
+ }
+ else
+ {
+ mv_init (&mv, MAX_SHORT_STRING);
+ while (!lex_match (')'))
+ {
+ if (!lex_force_string ())
+ {
+ deferred_errors = true;
+ break;
+ }
+
+ if (ds_length (&tokstr) > MAX_SHORT_STRING)
+ {
+ ds_truncate (&tokstr, MAX_SHORT_STRING);
+ msg (SE, _("Truncating missing value to short string "
+ "length (%d characters)."),
+ MAX_SHORT_STRING);
+ }
+ else
+ ds_rpad (&tokstr, MAX_SHORT_STRING, ' ');
+
+ if (!mv_add_str (&mv, ds_data (&tokstr)))
+ deferred_errors = true;
+
+ lex_get ();
+ lex_match (',');
+ }
+ }
+
+ for (i = 0; i < nv; i++)
+ {
+ if (!mv_is_resizable (&mv, v[i]->width))
+ {
+ msg (SE, _("Missing values provided are too long to assign "
+ "to variable of width %d."),
+ v[i]->width);
+ deferred_errors = true;
+ }
+ else
+ {
+ mv_copy (&v[i]->miss, &mv);
+ mv_resize (&v[i]->miss, v[i]->width);
+ }
+ }
+ }