Disentangle the interaction parser from the variable parser.
[pspp] / src / language / lexer / variable-parser.c
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2020 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #include <config.h>
18
19 #include "language/lexer/variable-parser.h"
20
21 #include <ctype.h>
22 #include <limits.h>
23 #include <stdbool.h>
24 #include <stdlib.h>
25
26 #include "data/dataset.h"
27 #include "data/dictionary.h"
28 #include "data/variable.h"
29 #include "language/lexer/lexer.h"
30 #include "libpspp/assertion.h"
31 #include "libpspp/cast.h"
32 #include "libpspp/hash-functions.h"
33 #include "libpspp/i18n.h"
34 #include "libpspp/hmapx.h"
35 #include "libpspp/message.h"
36 #include "libpspp/misc.h"
37 #include "libpspp/pool.h"
38 #include "libpspp/str.h"
39 #include "libpspp/stringi-set.h"
40
41 #include "math/interaction.h"
42
43 #include "gl/c-ctype.h"
44 #include "gl/xalloc.h"
45
46 #include "gettext.h"
47 #define _(msgid) gettext (msgid)
48
49 static struct variable *var_set_get_var (const struct var_set *, size_t);
50 static struct variable *var_set_lookup_var (const struct var_set *,
51                                             const char *);
52 static bool var_set_lookup_var_idx (const struct var_set *, const char *,
53                                     size_t *);
54 static bool var_set_get_names_must_be_ids (const struct var_set *);
55
56 static bool
57 is_name_token (const struct lexer *lexer, bool names_must_be_ids)
58 {
59   return (lex_token (lexer) == T_ID
60           || (!names_must_be_ids && lex_token (lexer) == T_STRING));
61 }
62
63 static bool
64 is_vs_name_token (const struct lexer *lexer, const struct var_set *vs)
65 {
66   return is_name_token (lexer, var_set_get_names_must_be_ids (vs));
67 }
68
69 static bool
70 is_dict_name_token (const struct lexer *lexer, const struct dictionary *d)
71 {
72   return is_name_token (lexer, dict_get_names_must_be_ids (d));
73 }
74
75 /* Parses a name as a variable within VS.  Sets *IDX to the
76    variable's index and returns true if successful.  On failure
77    emits an error message and returns false. */
78 static bool
79 parse_vs_variable_idx (struct lexer *lexer, const struct var_set *vs,
80                        size_t *idx)
81 {
82   assert (idx != NULL);
83
84   if (!is_vs_name_token (lexer, vs))
85     {
86       lex_error (lexer, _("Syntax error expecting variable name."));
87       return false;
88     }
89   else if (var_set_lookup_var_idx (vs, lex_tokcstr (lexer), idx))
90     {
91       lex_get (lexer);
92       return true;
93     }
94   else
95     {
96       lex_error (lexer, _("%s is not a variable name."), lex_tokcstr (lexer));
97       return false;
98     }
99 }
100
101 /* Parses a name as a variable within VS and returns the variable
102    if successful.  On failure emits an error message and returns
103    a null pointer. */
104 static struct variable *
105 parse_vs_variable (struct lexer *lexer, const struct var_set *vs)
106 {
107   size_t idx;
108   return parse_vs_variable_idx (lexer, vs, &idx) ? var_set_get_var (vs, idx) : NULL;
109 }
110
111 /* Parses a variable name in dictionary D and returns the
112    variable if successful.  On failure emits an error message and
113    returns a null pointer. */
114 struct variable *
115 parse_variable (struct lexer *lexer, const struct dictionary *d)
116 {
117   struct var_set *vs = var_set_create_from_dict (d);
118   struct variable *var = parse_vs_variable (lexer, vs);
119   var_set_destroy (vs);
120   return var;
121 }
122
123 /* Parses a set of variables from dictionary D given options
124    OPTS.  Resulting list of variables stored in *VAR and the
125    number of variables into *N.  Returns true only if
126    successful.  The dictionary D must contain at least one
127    variable.  */
128 bool
129 parse_variables (struct lexer *lexer, const struct dictionary *d,
130                  struct variable ***var,
131                  size_t *n, int opts)
132 {
133   struct var_set *vs;
134   int success;
135
136   assert (d != NULL);
137   assert (var != NULL);
138   assert (n != NULL);
139
140   vs = var_set_create_from_dict (d);
141   if (var_set_get_n (vs) == 0)
142     {
143       *n = 0;
144       var_set_destroy (vs);
145       return false;
146     }
147   success = parse_var_set_vars (lexer, vs, var, n, opts);
148   var_set_destroy (vs);
149   return success;
150 }
151
152 /* Parses a set of variables from dictionary D given options
153    OPTS.  Resulting list of variables stored in *VARS and the
154    number of variables into *N_VARS.  Returns true only if
155    successful.  Same behavior as parse_variables, except that all
156    allocations are taken from the given POOL. */
157 bool
158 parse_variables_pool (struct lexer *lexer, struct pool *pool,
159                 const struct dictionary *dict,
160                 struct variable ***vars, size_t *n_vars, int opts)
161 {
162   int retval;
163
164   /* PV_APPEND is unsafe because parse_variables would free the
165      existing names on failure, but those names are presumably
166      already in the pool, which would attempt to re-free it
167      later. */
168   assert (!(opts & PV_APPEND));
169
170   retval = parse_variables (lexer, dict, vars, n_vars, opts);
171   if (retval)
172     pool_register (pool, free, *vars);
173   return retval;
174 }
175
176 /* Parses a variable name from VS.  If successful, sets *IDX to
177    the variable's index in VS, *CLASS to the variable's
178    dictionary class, and returns true.  Returns false on
179    failure. */
180 static bool
181 parse_var_idx_class (struct lexer *lexer, const struct var_set *vs,
182                         size_t *idx,
183                         enum dict_class *class)
184 {
185   if (!parse_vs_variable_idx (lexer, vs, idx))
186     return false;
187
188   *class = dict_class_from_id (var_get_name (var_set_get_var (vs, *idx)));
189   return true;
190 }
191
192 /* Add the variable from VS with index IDX to the list of
193    variables V that has *NV elements and room for *MV.
194    Uses and updates INCLUDED to avoid duplicates if indicated by
195    PV_OPTS, which also affects what variables are allowed in
196    appropriate ways. */
197 static void
198 add_variable (struct lexer *lexer,
199               struct variable ***v, size_t *nv, size_t *mv,
200               char *included, int pv_opts,
201               const struct var_set *vs, size_t idx,
202               int start_ofs, int end_ofs)
203 {
204   struct variable *add = var_set_get_var (vs, idx);
205   const char *add_name = var_get_name (add);
206
207   if ((pv_opts & PV_NUMERIC) && !var_is_numeric (add))
208     lex_ofs_msg (lexer, SW, start_ofs, end_ofs,
209                  _("%s is not a numeric variable.  It will not be "
210                    "included in the variable list."), add_name);
211   else if ((pv_opts & PV_STRING) && !var_is_alpha (add))
212     lex_ofs_error (lexer, start_ofs, end_ofs,
213                    _("%s is not a string variable.  It will not be "
214                      "included in the variable list."), add_name);
215   else if ((pv_opts & PV_NO_SCRATCH)
216            && dict_class_from_id (add_name) == DC_SCRATCH)
217     lex_ofs_error (lexer, start_ofs, end_ofs,
218                    _("Scratch variables (such as %s) are not allowed "
219                      "here."), add_name);
220   else if ((pv_opts & (PV_SAME_TYPE | PV_SAME_WIDTH)) && *nv
221            && var_get_type (add) != var_get_type ((*v)[0]))
222     lex_ofs_error (lexer, start_ofs, end_ofs,
223                  _("%s and %s are not the same type.  All variables in "
224                    "this variable list must be of the same type.  %s "
225                    "will be omitted from the list."),
226                  var_get_name ((*v)[0]), add_name, add_name);
227   else if ((pv_opts & PV_SAME_WIDTH) && *nv
228            && var_get_width (add) != var_get_width ((*v)[0]))
229     lex_ofs_error (lexer, start_ofs, end_ofs,
230                  _("%s and %s are string variables with different widths.  "
231                    "All variables in this variable list must have the "
232                    "same width.  %s will be omitted from the list."),
233                  var_get_name ((*v)[0]), add_name, add_name);
234   else if ((pv_opts & PV_NO_DUPLICATE) && included && included[idx])
235     lex_ofs_error (lexer, start_ofs, end_ofs,
236                    _("Variable %s appears twice in variable list."), add_name);
237   else if ((pv_opts & PV_DUPLICATE) || !included || !included[idx])
238     {
239       if (*nv >= *mv)
240         {
241           *mv = 2 * (*nv + 1);
242           *v = xnrealloc (*v, *mv, sizeof **v);
243         }
244       (*v)[(*nv)++] = add;
245       if (included != NULL)
246         included[idx] = 1;
247     }
248 }
249
250 /* Adds the variables in VS with indexes FIRST_IDX through
251    LAST_IDX, inclusive, to the list of variables V that has *NV
252    elements and room for *MV.  Uses and updates INCLUDED to avoid
253    duplicates if indicated by PV_OPTS, which also affects what
254    variables are allowed in appropriate ways. */
255 static void
256 add_variables (struct lexer *lexer,
257                struct variable ***v, size_t *nv, size_t *mv, char *included,
258                int pv_opts,
259                const struct var_set *vs, int first_idx, int last_idx,
260                enum dict_class class,
261                int start_ofs, int end_ofs)
262 {
263   size_t i;
264
265   for (i = first_idx; i <= last_idx; i++)
266     if (dict_class_from_id (var_get_name (var_set_get_var (vs, i))) == class)
267       add_variable (lexer, v, nv, mv, included, pv_opts, vs, i,
268                     start_ofs, end_ofs);
269 }
270
271 /* Note that if parse_variables() returns false, *v is free()'d.
272    Conversely, if parse_variables() returns true, then *nv is
273    nonzero and *v is non-NULL. */
274 bool
275 parse_var_set_vars (struct lexer *lexer, const struct var_set *vs,
276                     struct variable ***v, size_t *nv,
277                     int pv_opts)
278 {
279   size_t mv;
280   char *included;
281
282   assert (vs != NULL);
283   assert (v != NULL);
284   assert (nv != NULL);
285
286   /* At most one of PV_NUMERIC, PV_STRING, PV_SAME_TYPE,
287      PV_SAME_WIDTH may be specified. */
288   assert (((pv_opts & PV_NUMERIC) != 0)
289           + ((pv_opts & PV_STRING) != 0)
290           + ((pv_opts & PV_SAME_TYPE) != 0)
291           + ((pv_opts & PV_SAME_WIDTH) != 0) <= 1);
292
293   /* PV_DUPLICATE and PV_NO_DUPLICATE are incompatible. */
294   assert (!(pv_opts & PV_DUPLICATE) || !(pv_opts & PV_NO_DUPLICATE));
295
296   if (!(pv_opts & PV_APPEND))
297     {
298       *v = NULL;
299       *nv = 0;
300       mv = 0;
301     }
302   else
303     mv = *nv;
304
305   if (!(pv_opts & PV_DUPLICATE))
306     {
307       size_t i;
308
309       included = xcalloc (var_set_get_n (vs), sizeof *included);
310       for (i = 0; i < *nv; i++)
311         {
312           size_t index;
313           if (!var_set_lookup_var_idx (vs, var_get_name ((*v)[i]), &index))
314             NOT_REACHED ();
315           included[index] = 1;
316         }
317     }
318   else
319     included = NULL;
320
321   do
322     {
323       int start_ofs = lex_ofs (lexer);
324       if (lex_match (lexer, T_ALL))
325         add_variables (lexer, v, nv, &mv, included, pv_opts,
326                        vs, 0, var_set_get_n (vs) - 1, DC_ORDINARY,
327                        start_ofs, start_ofs);
328       else
329         {
330           enum dict_class class;
331           size_t first_idx;
332
333           if (!parse_var_idx_class (lexer, vs, &first_idx, &class))
334             goto fail;
335
336           if (!lex_match (lexer, T_TO))
337             add_variable (lexer, v, nv, &mv, included, pv_opts, vs, first_idx,
338                           start_ofs, start_ofs);
339           else
340             {
341               size_t last_idx;
342               enum dict_class last_class;
343               struct variable *first_var, *last_var;
344
345               if (!parse_var_idx_class (lexer, vs, &last_idx, &last_class))
346                 goto fail;
347
348               int end_ofs = lex_ofs (lexer) - 1;
349
350               first_var = var_set_get_var (vs, first_idx);
351               last_var = var_set_get_var (vs, last_idx);
352
353               if (last_idx < first_idx)
354                 {
355                   const char *first_name = var_get_name (first_var);
356                   const char *last_name = var_get_name (last_var);
357                   lex_ofs_error (lexer, start_ofs, end_ofs,
358                                  _("%s TO %s is not valid syntax since %s "
359                                    "precedes %s in the dictionary."),
360                                  first_name, last_name, first_name, last_name);
361                   goto fail;
362                 }
363
364               if (class != last_class)
365                 {
366                   lex_ofs_error (lexer, start_ofs, end_ofs,
367                                  _("With the syntax <a> TO <b>, variables <a> "
368                                    "and <b> must be both regular variables "
369                                    "or both scratch variables."));
370                   struct pair
371                     {
372                       const char *name;
373                       enum dict_class class;
374                       int ofs;
375                     }
376                   pairs[2] = {
377                     { var_get_name (first_var), class, start_ofs },
378                     { var_get_name (last_var), last_class, end_ofs },
379                   };
380                   for (size_t i = 0; i < 2; i++)
381                     switch (pairs[i].class)
382                       {
383                       case DC_ORDINARY:
384                         lex_ofs_msg (lexer, SN, pairs[i].ofs, pairs[i].ofs,
385                                      _("%s is a regular variable."),
386                                      pairs[i].name);
387                         break;
388
389                       case DC_SCRATCH:
390                         lex_ofs_msg (lexer, SN, pairs[i].ofs, pairs[i].ofs,
391                                      _("%s is a scratch variable."),
392                                      pairs[i].name);
393                         break;
394
395                       case DC_SYSTEM:
396                         lex_ofs_msg (lexer, SN, pairs[i].ofs, pairs[i].ofs,
397                                      _("%s is a system variable."),
398                                      pairs[i].name);
399                         break;
400                       }
401                   goto fail;
402                 }
403
404               add_variables (lexer, v, nv, &mv, included, pv_opts,
405                              vs, first_idx, last_idx, class,
406                              start_ofs, lex_ofs (lexer) - 1);
407             }
408         }
409
410       if (pv_opts & PV_SINGLE)
411         break;
412       lex_match (lexer, T_COMMA);
413     }
414   while (lex_token (lexer) == T_ALL
415          || (is_vs_name_token (lexer, vs)
416              && var_set_lookup_var (vs, lex_tokcstr (lexer)) != NULL));
417
418   if (*nv == 0)
419     goto fail;
420
421   free (included);
422   return 1;
423
424 fail:
425   free (included);
426   free (*v);
427   *v = NULL;
428   *nv = 0;
429   return 0;
430 }
431
432 char *
433 parse_DATA_LIST_var (struct lexer *lexer, const struct dictionary *d)
434 {
435   if (!is_dict_name_token (lexer, d))
436     {
437       lex_error (lexer, ("Syntax error expecting variable name."));
438       return NULL;
439     }
440   char *error = dict_id_is_valid__ (d, lex_tokcstr (lexer));
441   if (error)
442     {
443       lex_error (lexer, "%s", error);
444       free (error);
445       return NULL;
446     }
447
448   char *name = xstrdup (lex_tokcstr (lexer));
449   lex_get (lexer);
450   return name;
451 }
452
453 /* Attempts to break UTF-8 encoded NAME into a root (whose contents are
454    arbitrary except that it does not end in a digit) followed by an integer
455    numeric suffix.  On success, stores the value of the suffix into *NUMBERP,
456    the number of digits in the suffix into *N_DIGITSP, and returns the number
457    of bytes in the root.  On failure, returns 0. */
458 static int
459 extract_numeric_suffix (struct lexer *lexer, int ofs, const char *name,
460                         unsigned long int *numberp, int *n_digitsp)
461 {
462   size_t root_len, n_digits;
463   size_t i;
464
465   /* Count length of root. */
466   root_len = 1;                 /* Valid identifier never starts with digit. */
467   for (i = 1; name[i] != '\0'; i++)
468     if (!c_isdigit (name[i]))
469       root_len = i + 1;
470   n_digits = i - root_len;
471
472   if (n_digits == 0)
473     {
474       lex_ofs_error (lexer, ofs, ofs,
475                      _("`%s' cannot be used with TO because it does not end in "
476                        "a digit."), name);
477       return 0;
478     }
479
480   *numberp = strtoull (name + root_len, NULL, 10);
481   if (*numberp == ULONG_MAX)
482     {
483       lex_ofs_error (lexer, ofs, ofs,
484                      _("Numeric suffix on `%s' is larger than supported with TO."),
485                      name);
486       return 0;
487     }
488   *n_digitsp = n_digits;
489   return root_len;
490 }
491
492 static bool
493 add_var_name (struct lexer *lexer, int start_ofs, int end_ofs, char *name,
494               char ***names, size_t *n_vars, size_t *allocated_vars,
495               struct stringi_set *set, int pv_opts)
496 {
497   if (pv_opts & PV_NO_DUPLICATE && !stringi_set_insert (set, name))
498     {
499       lex_ofs_error (lexer, start_ofs, end_ofs,
500                      _("Variable %s appears twice in variable list."),
501                      name);
502       return false;
503     }
504
505   if (*n_vars >= *allocated_vars)
506     *names = x2nrealloc (*names, allocated_vars, sizeof **names);
507   (*names)[(*n_vars)++] = name;
508   return true;
509 }
510
511 /* Parses a list of variable names according to the DATA LIST version
512    of the TO convention.  */
513 bool
514 parse_DATA_LIST_vars (struct lexer *lexer, const struct dictionary *dict,
515                       char ***namesp, size_t *n_varsp, int pv_opts)
516 {
517   char **names;
518   size_t n_vars;
519   size_t allocated_vars;
520
521   struct stringi_set set;
522
523   char *name1 = NULL;
524   char *name2 = NULL;
525
526   bool ok = false;
527
528   assert ((pv_opts & ~(PV_APPEND | PV_SINGLE
529                        | PV_NO_SCRATCH | PV_NO_DUPLICATE)) == 0);
530   stringi_set_init (&set);
531
532   if (pv_opts & PV_APPEND)
533     {
534       n_vars = allocated_vars = *n_varsp;
535       names = *namesp;
536
537       if (pv_opts & PV_NO_DUPLICATE)
538         {
539           size_t i;
540
541           for (i = 0; i < n_vars; i++)
542             stringi_set_insert (&set, names[i]);
543         }
544     }
545   else
546     {
547       n_vars = allocated_vars = 0;
548       names = NULL;
549     }
550
551   do
552     {
553       int start_ofs = lex_ofs (lexer);
554       name1 = parse_DATA_LIST_var (lexer, dict);
555       if (!name1)
556         goto exit;
557       if (dict_class_from_id (name1) == DC_SCRATCH && pv_opts & PV_NO_SCRATCH)
558         {
559           lex_ofs_error (lexer, start_ofs, start_ofs,
560                          _("Scratch variables not allowed here."));
561           goto exit;
562         }
563       if (lex_match (lexer, T_TO))
564         {
565           unsigned long int num1, num2;
566           int n_digits1, n_digits2;
567           int root_len1, root_len2;
568           unsigned long int number;
569
570           name2 = parse_DATA_LIST_var (lexer, dict);
571           if (!name2)
572             goto exit;
573           int end_ofs = lex_ofs (lexer) - 1;
574
575           root_len1 = extract_numeric_suffix (lexer, start_ofs,
576                                               name1, &num1, &n_digits1);
577           if (root_len1 == 0)
578             goto exit;
579
580           root_len2 = extract_numeric_suffix (lexer, end_ofs,
581                                               name2, &num2, &n_digits2);
582           if (root_len2 == 0)
583             goto exit;
584
585           if (root_len1 != root_len2 || memcasecmp (name1, name2, root_len1))
586             {
587               lex_ofs_error (lexer, start_ofs, end_ofs,
588                              _("Prefixes don't match in use of TO convention."));
589               goto exit;
590             }
591           if (num1 > num2)
592             {
593               lex_ofs_error (lexer, start_ofs, end_ofs,
594                              _("Bad bounds in use of TO convention."));
595               goto exit;
596             }
597
598           for (number = num1; number <= num2; number++)
599             {
600               char *name = xasprintf ("%.*s%0*lu",
601                                       root_len1, name1,
602                                       n_digits1, number);
603               if (!add_var_name (lexer, start_ofs, end_ofs,
604                                  name, &names, &n_vars, &allocated_vars,
605                                  &set, pv_opts))
606                 {
607                   free (name);
608                   goto exit;
609                 }
610             }
611
612           free (name1);
613           name1 = NULL;
614           free (name2);
615           name2 = NULL;
616         }
617       else
618         {
619           if (!add_var_name (lexer, start_ofs, start_ofs,
620                              name1, &names, &n_vars, &allocated_vars,
621                              &set, pv_opts))
622             goto exit;
623           name1 = NULL;
624         }
625
626       lex_match (lexer, T_COMMA);
627
628       if (pv_opts & PV_SINGLE)
629         break;
630     }
631   while (lex_token (lexer) == T_ID);
632   ok = true;
633
634 exit:
635   stringi_set_destroy (&set);
636   if (ok)
637     {
638       *namesp = names;
639       *n_varsp = n_vars;
640     }
641   else
642     {
643       int i;
644       for (i = 0; i < n_vars; i++)
645         free (names[i]);
646       free (names);
647       *namesp = NULL;
648       *n_varsp = 0;
649
650       free (name1);
651       free (name2);
652     }
653   return ok;
654 }
655
656 /* Registers each of the NAMES[0...NNAMES - 1] in POOL, as well
657    as NAMES itself. */
658 static void
659 register_vars_pool (struct pool *pool, char **names, size_t nnames)
660 {
661   size_t i;
662
663   for (i = 0; i < nnames; i++)
664     pool_register (pool, free, names[i]);
665   pool_register (pool, free, names);
666 }
667
668 /* Parses a list of variable names according to the DATA LIST
669    version of the TO convention.  Same args as
670    parse_DATA_LIST_vars(), except that all allocations are taken
671    from the given POOL. */
672 bool
673 parse_DATA_LIST_vars_pool (struct lexer *lexer, const struct dictionary *dict,
674                            struct pool *pool,
675                            char ***names, size_t *nnames, int pv_opts)
676 {
677   int retval;
678
679   /* PV_APPEND is unsafe because parse_DATA_LIST_vars would free
680      the existing names on failure, but those names are
681      presumably already in the pool, which would attempt to
682      re-free it later. */
683   assert (!(pv_opts & PV_APPEND));
684
685   retval = parse_DATA_LIST_vars (lexer, dict, names, nnames, pv_opts);
686   if (retval)
687     register_vars_pool (pool, *names, *nnames);
688   return retval;
689 }
690
691 /* Parses a list of variables where some of the variables may be
692    existing and the rest are to be created.  Same args as
693    parse_DATA_LIST_vars(). */
694 bool
695 parse_mixed_vars (struct lexer *lexer, const struct dictionary *dict,
696                   char ***names, size_t *nnames, int pv_opts)
697 {
698   size_t i;
699
700   assert (names != NULL);
701   assert (nnames != NULL);
702
703   if (!(pv_opts & PV_APPEND))
704     {
705       *names = NULL;
706       *nnames = 0;
707     }
708   while (is_dict_name_token (lexer, dict) || lex_token (lexer) == T_ALL)
709     {
710       if (lex_token (lexer) == T_ALL || dict_lookup_var (dict, lex_tokcstr (lexer)) != NULL)
711         {
712           struct variable **v;
713           size_t nv;
714
715           if (!parse_variables (lexer, dict, &v, &nv, pv_opts))
716             goto fail;
717           *names = xnrealloc (*names, *nnames + nv, sizeof **names);
718           for (i = 0; i < nv; i++)
719             (*names)[*nnames + i] = xstrdup (var_get_name (v[i]));
720           free (v);
721           *nnames += nv;
722         }
723       else if (!parse_DATA_LIST_vars (lexer, dict, names, nnames, PV_APPEND | pv_opts))
724         goto fail;
725     }
726   if (*nnames == 0)
727     goto fail;
728
729   return true;
730
731 fail:
732   for (i = 0; i < *nnames; i++)
733     free ((*names)[i]);
734   free (*names);
735   *names = NULL;
736   *nnames = 0;
737   return false;
738 }
739
740 /* Parses a list of variables where some of the variables may be
741    existing and the rest are to be created.  Same args as
742    parse_mixed_vars(), except that all allocations are taken
743    from the given POOL. */
744 bool
745 parse_mixed_vars_pool (struct lexer *lexer, const struct dictionary *dict, struct pool *pool,
746                        char ***names, size_t *nnames, int pv_opts)
747 {
748   int retval;
749
750   /* PV_APPEND is unsafe because parse_mixed_vars_pool would free
751      the existing names on failure, but those names are
752      presumably already in the pool, which would attempt to
753      re-free it later. */
754   assert (!(pv_opts & PV_APPEND));
755
756   retval = parse_mixed_vars (lexer, dict, names, nnames, pv_opts);
757   if (retval)
758     register_vars_pool (pool, *names, *nnames);
759   return retval;
760 }
761 \f
762 /* Frees the N var_syntax structures in VS, as well as VS itself. */
763 void
764 var_syntax_destroy (struct var_syntax *vs, size_t n)
765 {
766   for (size_t i = 0; i < n; i++)
767     {
768       free (vs[i].first);
769       free (vs[i].last);
770     }
771   free (vs);
772 }
773
774 /* Parses syntax for variables and variable ranges from LEXER.  If successful,
775    initializes *VS to the beginning of an array of var_syntax structs and *N_VS
776    to the number of elements in the array and returns true.  On error, sets *VS
777    to NULL and *N_VS to 0 and returns false. */
778 bool
779 var_syntax_parse (struct lexer *lexer, struct var_syntax **vs, size_t *n_vs)
780 {
781   *vs = NULL;
782   *n_vs = 0;
783
784   if (lex_token (lexer) != T_ID)
785     {
786       lex_error (lexer, _("Syntax error expecting variable name."));
787       goto error;
788     }
789
790   size_t allocated_vs = 0;
791   do
792     {
793       if (allocated_vs >= *n_vs)
794         *vs = x2nrealloc (*vs, &allocated_vs, sizeof **vs);
795       struct var_syntax *new = &(*vs)[(*n_vs)++];
796       *new = (struct var_syntax) {
797         .first = ss_xstrdup (lex_tokss (lexer)),
798         .first_ofs = lex_ofs (lexer)
799       };
800       lex_get (lexer);
801
802       if (lex_match (lexer, T_TO))
803         {
804           if (lex_token (lexer) != T_ID)
805             {
806               lex_error (lexer, _("Syntax error expecting variable name."));
807               goto error;
808             }
809
810           new->last = ss_xstrdup (lex_tokss (lexer));
811           lex_get (lexer);
812         }
813       new->last_ofs = lex_ofs (lexer) - 1;
814     }
815   while (lex_token (lexer) == T_ID);
816   return true;
817
818 error:
819   var_syntax_destroy (*vs, *n_vs);
820   *vs = NULL;
821   *n_vs = 0;
822   return false;
823 }
824
825 /* Looks up the N_VS var syntax structs in VS in DICT, translating them to an
826    array of variables.  If successful, initializes *VARS to the beginning of an
827    array of pointers to variables and *N_VARS to the length of the array and
828    returns true.  On error, sets *VARS to NULL and *N_VARS to 0.
829
830    The LEXER is just used for error messages.
831
832    For the moment, only honors PV_NUMERIC in OPTS. */
833 bool
834 var_syntax_evaluate (struct lexer *lexer,
835                      const struct var_syntax *vs, size_t n_vs,
836                      const struct dictionary *dict,
837                      struct variable ***vars, size_t *n_vars, int opts)
838 {
839   assert (!(opts & ~PV_NUMERIC));
840
841   *vars = NULL;
842   *n_vars = 0;
843
844   size_t allocated_vars = 0;
845   for (size_t i = 0; i < n_vs; i++)
846     {
847       int first_ofs = vs[i].first_ofs;
848       struct variable *first = dict_lookup_var (dict, vs[i].first);
849       if (!first)
850         {
851           lex_ofs_error (lexer, first_ofs, first_ofs,
852                          _("%s is not a variable name."), vs[i].first);
853           goto error;
854         }
855
856       int last_ofs = vs[i].last_ofs;
857       struct variable *last = (vs[i].last
858                                ? dict_lookup_var (dict, vs[i].last)
859                                : first);
860       if (!last)
861         {
862           lex_ofs_error (lexer, last_ofs, last_ofs,
863                          _("%s is not a variable name."), vs[i].last);
864           goto error;
865         }
866
867       size_t first_idx = var_get_dict_index (first);
868       size_t last_idx = var_get_dict_index (last);
869       if (last_idx < first_idx)
870         {
871           lex_ofs_error (lexer, first_ofs, last_ofs,
872                          _("%s TO %s is not valid syntax since %s "
873                            "precedes %s in the dictionary."),
874                          vs[i].first, vs[i].last,
875                          vs[i].first, vs[i].last);
876           goto error;
877         }
878
879       for (size_t j = first_idx; j <= last_idx; j++)
880         {
881           struct variable *v = dict_get_var (dict, j);
882           if (opts & PV_NUMERIC && !var_is_numeric (v))
883             {
884               lex_ofs_error (lexer, first_ofs, last_ofs,
885                              _("%s is not a numeric variable."),
886                              var_get_name (v));
887               goto error;
888             }
889
890           if (*n_vars >= allocated_vars)
891             *vars = x2nrealloc (*vars, &allocated_vars, sizeof **vars);
892           (*vars)[(*n_vars)++] = v;
893         }
894     }
895
896   return true;
897
898 error:
899   free (*vars);
900   *vars = NULL;
901   *n_vars = 0;
902   return false;
903 }
904 \f
905 /* A set of variables. */
906 struct var_set
907   {
908     bool names_must_be_ids;
909     size_t (*get_n) (const struct var_set *);
910     struct variable *(*get_var) (const struct var_set *, size_t idx);
911     bool (*lookup_var_idx) (const struct var_set *, const char *, size_t *);
912     void (*destroy) (struct var_set *);
913     void *aux;
914   };
915
916 /* Returns the number of variables in VS. */
917 size_t
918 var_set_get_n (const struct var_set *vs)
919 {
920   assert (vs != NULL);
921
922   return vs->get_n (vs);
923 }
924
925 /* Return variable with index IDX in VS.
926    IDX must be less than the number of variables in VS. */
927 static struct variable *
928 var_set_get_var (const struct var_set *vs, size_t idx)
929 {
930   assert (vs != NULL);
931   assert (idx < var_set_get_n (vs));
932
933   return vs->get_var (vs, idx);
934 }
935
936 /* Returns the variable in VS named NAME, or a null pointer if VS
937    contains no variable with that name. */
938 struct variable *
939 var_set_lookup_var (const struct var_set *vs, const char *name)
940 {
941   size_t idx;
942   return (var_set_lookup_var_idx (vs, name, &idx)
943           ? var_set_get_var (vs, idx)
944           : NULL);
945 }
946
947 /* If VS contains a variable named NAME, sets *IDX to its index
948    and returns true.  Otherwise, returns false. */
949 bool
950 var_set_lookup_var_idx (const struct var_set *vs, const char *name,
951                         size_t *idx)
952 {
953   assert (vs != NULL);
954   assert (name != NULL);
955
956   return vs->lookup_var_idx (vs, name, idx);
957 }
958
959 /* Destroys VS. */
960 void
961 var_set_destroy (struct var_set *vs)
962 {
963   if (vs != NULL)
964     vs->destroy (vs);
965 }
966
967 static bool
968 var_set_get_names_must_be_ids (const struct var_set *vs)
969 {
970   return vs->names_must_be_ids;
971 }
972 \f
973 /* Returns the number of variables in VS. */
974 static size_t
975 dict_var_set_get_n (const struct var_set *vs)
976 {
977   struct dictionary *d = vs->aux;
978
979   return dict_get_n_vars (d);
980 }
981
982 /* Return variable with index IDX in VS.
983    IDX must be less than the number of variables in VS. */
984 static struct variable *
985 dict_var_set_get_var (const struct var_set *vs, size_t idx)
986 {
987   struct dictionary *d = vs->aux;
988
989   return dict_get_var (d, idx);
990 }
991
992 /* If VS contains a variable named NAME, sets *IDX to its index
993    and returns true.  Otherwise, returns false. */
994 static bool
995 dict_var_set_lookup_var_idx (const struct var_set *vs, const char *name,
996                              size_t *idx)
997 {
998   struct dictionary *d = vs->aux;
999   struct variable *v = dict_lookup_var (d, name);
1000   if (v != NULL)
1001     {
1002       *idx = var_get_dict_index (v);
1003       return true;
1004     }
1005   else
1006     return false;
1007 }
1008
1009 /* Destroys VS. */
1010 static void
1011 dict_var_set_destroy (struct var_set *vs)
1012 {
1013   free (vs);
1014 }
1015
1016 /* Returns a variable set based on D. */
1017 struct var_set *
1018 var_set_create_from_dict (const struct dictionary *d)
1019 {
1020   struct var_set *vs = xmalloc (sizeof *vs);
1021   vs->names_must_be_ids = dict_get_names_must_be_ids (d);
1022   vs->get_n = dict_var_set_get_n;
1023   vs->get_var = dict_var_set_get_var;
1024   vs->lookup_var_idx = dict_var_set_lookup_var_idx;
1025   vs->destroy = dict_var_set_destroy;
1026   vs->aux = (void *) d;
1027   return vs;
1028 }
1029 \f
1030 /* A variable set based on an array. */
1031 struct array_var_set
1032   {
1033     struct variable *const *var;/* Array of variables. */
1034     size_t n_vars;              /* Number of elements in var. */
1035     struct hmapx vars_by_name;  /* Variables hashed by name. */
1036   };
1037
1038 /* Returns the number of variables in VS. */
1039 static size_t
1040 array_var_set_get_n (const struct var_set *vs)
1041 {
1042   struct array_var_set *avs = vs->aux;
1043
1044   return avs->n_vars;
1045 }
1046
1047 /* Return variable with index IDX in VS.
1048    IDX must be less than the number of variables in VS. */
1049 static struct variable *
1050 array_var_set_get_var (const struct var_set *vs, size_t idx)
1051 {
1052   struct array_var_set *avs = vs->aux;
1053
1054   return CONST_CAST (struct variable *, avs->var[idx]);
1055 }
1056
1057 /* If VS contains a variable named NAME, sets *IDX to its index
1058    and returns true.  Otherwise, returns false. */
1059 static bool
1060 array_var_set_lookup_var_idx (const struct var_set *vs, const char *name,
1061                               size_t *idx)
1062 {
1063   struct array_var_set *avs = vs->aux;
1064   struct hmapx_node *node;
1065   struct variable **varp;
1066
1067   HMAPX_FOR_EACH_WITH_HASH (varp, node, utf8_hash_case_string (name, 0),
1068                             &avs->vars_by_name)
1069     if (!utf8_strcasecmp (name, var_get_name (*varp)))
1070       {
1071         *idx = varp - avs->var;
1072         return true;
1073       }
1074
1075   return false;
1076 }
1077
1078 /* Destroys VS. */
1079 static void
1080 array_var_set_destroy (struct var_set *vs)
1081 {
1082   struct array_var_set *avs = vs->aux;
1083
1084   hmapx_destroy (&avs->vars_by_name);
1085   free (avs);
1086   free (vs);
1087 }
1088
1089 /* Returns a variable set based on the N_VARS variables in VAR. */
1090 struct var_set *
1091 var_set_create_from_array (struct variable *const *var, size_t n_vars)
1092 {
1093   struct var_set *vs;
1094   struct array_var_set *avs;
1095   size_t i;
1096
1097   vs = xmalloc (sizeof *vs);
1098   vs->names_must_be_ids = true;
1099   vs->get_n = array_var_set_get_n;
1100   vs->get_var = array_var_set_get_var;
1101   vs->lookup_var_idx = array_var_set_lookup_var_idx;
1102   vs->destroy = array_var_set_destroy;
1103   vs->aux = avs = xmalloc (sizeof *avs);
1104   avs->var = var;
1105   avs->n_vars = n_vars;
1106   hmapx_init (&avs->vars_by_name);
1107   for (i = 0; i < n_vars; i++)
1108     {
1109       const char *name = var_get_name (var[i]);
1110       size_t idx;
1111
1112       if (array_var_set_lookup_var_idx (vs, name, &idx))
1113         {
1114           var_set_destroy (vs);
1115           return NULL;
1116         }
1117       hmapx_insert (&avs->vars_by_name, CONST_CAST (void *, &avs->var[i]),
1118                     utf8_hash_case_string (name, 0));
1119     }
1120
1121   return vs;
1122 }
1123
1124
1125 /* Match a variable.
1126    If the match succeeds, the variable will be placed in VAR.
1127    Returns true if successful */
1128 bool
1129 lex_match_variable (struct lexer *lexer, const struct dictionary *dict, const struct variable **var)
1130 {
1131   if (lex_token (lexer) != T_ID)
1132     return false;
1133
1134   *var = parse_variable_const (lexer, dict);
1135   return *var != NULL;
1136 }