8758af35b429b6cc026aead9db207aeb283fc339
[pspp] / src / data / variable.c
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014 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 "data/variable.h"
20
21 #include <stdlib.h>
22
23 #include "data/attributes.h"
24 #include "data/data-out.h"
25 #include "data/dictionary.h"
26 #include "data/format.h"
27 #include "data/identifier.h"
28 #include "data/missing-values.h"
29 #include "data/settings.h"
30 #include "data/value-labels.h"
31 #include "data/vardict.h"
32 #include "libpspp/assertion.h"
33 #include "libpspp/compiler.h"
34 #include "libpspp/hash-functions.h"
35 #include "libpspp/i18n.h"
36 #include "libpspp/message.h"
37 #include "libpspp/misc.h"
38 #include "libpspp/str.h"
39
40 #include "gl/minmax.h"
41 #include "gl/xalloc.h"
42
43 #include "gettext.h"
44 #define _(msgid) gettext (msgid)
45
46 /* A variable. */
47 struct variable
48   {
49     /* Dictionary information. */
50     char *name;                 /* Variable name.  Mixed case. */
51     int width;                  /* 0 for numeric, otherwise string width. */
52     struct missing_values miss; /* Missing values. */
53     struct fmt_spec print;      /* Default format for PRINT. */
54     struct fmt_spec write;      /* Default format for WRITE. */
55     struct val_labs *val_labs;  /* Value labels. */
56     char *label;                /* Variable label. */
57     struct string name_and_label; /* The name and label in the same string */
58
59     /* GUI information. */
60     enum measure measure;       /* Nominal, ordinal, or continuous. */
61     enum var_role role;         /* Intended use. */
62     int display_width;          /* Width of data editor column. */
63     enum alignment alignment;   /* Alignment of data in GUI. */
64
65     /* Case information. */
66     bool leave;                 /* Leave value from case to case? */
67
68     /* Data for use by containing dictionary. */
69     struct vardict_info *vardict;
70
71     /* Used only for system and portable file input and output.
72        See short-names.h. */
73     char **short_names;
74     size_t short_name_cnt;
75
76     /* Custom attributes. */
77     struct attrset attributes;
78   };
79 \f
80
81 static void var_set_print_format_quiet (struct variable *v, const struct fmt_spec *print);
82 static void var_set_write_format_quiet (struct variable *v, const struct fmt_spec *write);
83 static void var_set_label_quiet (struct variable *v, const char *label);
84 static void var_set_name_quiet (struct variable *v, const char *name);
85
86 /* Creates and returns a new variable with the given NAME and
87    WIDTH and other fields initialized to default values.  The
88    variable is not added to a dictionary; for that, use
89    dict_create_var instead. */
90 struct variable *
91 var_create (const char *name, int width)
92 {
93   struct variable *v;
94   enum val_type type;
95
96   assert (width >= 0 && width <= MAX_STRING);
97
98   v = xzalloc (sizeof *v);
99   var_set_name_quiet (v, name);
100   v->width = width;
101   mv_init (&v->miss, width);
102   v->leave = var_must_leave (v);
103   type = val_type_from_width (width);
104   v->alignment = var_default_alignment (type);
105   v->measure = var_default_measure (type);
106   v->role = ROLE_INPUT;
107   v->display_width = var_default_display_width (width);
108   v->print = v->write = var_default_formats (width);
109   attrset_init (&v->attributes);
110   ds_init_empty (&v->name_and_label);
111
112   return v;
113 }
114
115 /* Destroys variable V.
116    V must not belong to a dictionary.  If it does, use
117    dict_delete_var instead. */
118 void
119 var_destroy (struct variable *v)
120 {
121   if (v != NULL)
122     {
123       assert (!var_has_vardict (v));
124       mv_destroy (&v->miss);
125       var_clear_short_names (v);
126       val_labs_destroy (v->val_labs);
127       var_set_label_quiet (v, NULL);
128       attrset_destroy (var_get_attributes (v));
129       free (v->name);
130       ds_destroy (&v->name_and_label);
131       free (v);
132     }
133 }
134 \f
135 /* Variable names. */
136
137 /* Return variable V's name, as a UTF-8 encoded string. */
138 const char *
139 var_get_name (const struct variable *v)
140 {
141   return v->name;
142 }
143
144
145
146 /* Sets V's name to NAME, a UTF-8 encoded string.
147    Do not use this function for a variable in a dictionary.  Use
148    dict_rename_var instead. */
149 static void
150 var_set_name_quiet (struct variable *v, const char *name)
151 {
152   assert (!var_has_vardict (v));
153   assert (id_is_plausible (name, false));
154
155   free (v->name);
156   v->name = xstrdup (name);
157   ds_destroy (&v->name_and_label);
158   ds_init_empty (&v->name_and_label);
159 }
160
161 /* Sets V's name to NAME, a UTF-8 encoded string.
162    Do not use this function for a variable in a dictionary.  Use
163    dict_rename_var instead. */
164 void
165 var_set_name (struct variable *v, const char *name)
166 {
167   struct variable *ov = var_clone (v);
168   var_set_name_quiet (v, name);
169   dict_var_changed (v, VAR_TRAIT_NAME, ov);
170 }
171
172 /* Returns VAR's dictionary class. */
173 enum dict_class
174 var_get_dict_class (const struct variable *var)
175 {
176   return dict_class_from_id (var->name);
177 }
178
179 /* A hsh_compare_func that orders variables A and B by their
180    names. */
181 int
182 compare_vars_by_name (const void *a_, const void *b_, const void *aux UNUSED)
183 {
184   const struct variable *a = a_;
185   const struct variable *b = b_;
186
187   return utf8_strcasecmp (a->name, b->name);
188 }
189
190 /* A hsh_hash_func that hashes variable V based on its name. */
191 unsigned
192 hash_var_by_name (const void *v_, const void *aux UNUSED)
193 {
194   const struct variable *v = v_;
195
196   return utf8_hash_case_string (v->name, 0);
197 }
198
199 /* A hsh_compare_func that orders pointers to variables A and B
200    by their names. */
201 int
202 compare_var_ptrs_by_name (const void *a_, const void *b_,
203                           const void *aux UNUSED)
204 {
205   struct variable *const *a = a_;
206   struct variable *const *b = b_;
207
208   return utf8_strcasecmp (var_get_name (*a), var_get_name (*b));
209 }
210
211 /* A hsh_compare_func that orders pointers to variables A and B
212    by their dictionary indexes. */
213 int
214 compare_var_ptrs_by_dict_index (const void *a_, const void *b_,
215                                 const void *aux UNUSED)
216 {
217   struct variable *const *a = a_;
218   struct variable *const *b = b_;
219   size_t a_index = var_get_dict_index (*a);
220   size_t b_index = var_get_dict_index (*b);
221
222   return a_index < b_index ? -1 : a_index > b_index;
223 }
224
225 /* A hsh_hash_func that hashes pointer to variable V based on its
226    name. */
227 unsigned
228 hash_var_ptr_by_name (const void *v_, const void *aux UNUSED)
229 {
230   struct variable *const *v = v_;
231
232   return utf8_hash_case_string (var_get_name (*v), 0);
233 }
234 \f
235 /* Returns the type of variable V. */
236 enum val_type
237 var_get_type (const struct variable *v)
238 {
239   return val_type_from_width (v->width);
240 }
241
242 /* Returns the width of variable V. */
243 int
244 var_get_width (const struct variable *v)
245 {
246   return v->width;
247 }
248
249 void
250 var_set_width_and_formats (struct variable *v, int new_width,
251                            const struct fmt_spec *print, const struct fmt_spec *write)
252 {
253   struct variable *ov;
254   unsigned int traits = 0;
255
256   ov = var_clone (v);
257
258   if (var_has_missing_values (v))
259     {
260       if (mv_is_resizable (&v->miss, new_width))
261         mv_resize (&v->miss, new_width);
262       else
263         {
264           mv_destroy (&v->miss);
265           mv_init (&v->miss, new_width);
266         }
267       traits |= VAR_TRAIT_MISSING_VALUES;
268     }
269
270   if (v->val_labs != NULL)
271     {
272       if (val_labs_can_set_width (v->val_labs, new_width))
273         val_labs_set_width (v->val_labs, new_width);
274       else
275         {
276           val_labs_destroy (v->val_labs);
277           v->val_labs = NULL;
278         }
279       traits |= VAR_TRAIT_VALUE_LABELS;
280     }
281
282   if (fmt_resize (&v->print, new_width))
283     traits |= VAR_TRAIT_PRINT_FORMAT;
284
285   if (fmt_resize (&v->write, new_width))
286     traits |= VAR_TRAIT_WRITE_FORMAT;
287
288   if (v->width != new_width)
289     {
290       v->width = new_width;
291       traits |= VAR_TRAIT_WIDTH;
292     }
293
294   if (print)
295     {
296       var_set_print_format_quiet (v, print);
297       traits |= VAR_TRAIT_PRINT_FORMAT;
298     }
299
300   if (write)
301     {
302       var_set_write_format_quiet (v, write);
303       traits |= VAR_TRAIT_WRITE_FORMAT;
304     }
305
306   if (traits != 0)
307     dict_var_changed (v, traits, ov);
308 }
309
310 /* Changes the width of V to NEW_WIDTH.
311    This function should be used cautiously. */
312 void
313 var_set_width (struct variable *v, int new_width)
314 {
315   const int old_width = v->width;
316
317   if (old_width == new_width)
318     return;
319
320   var_set_width_and_formats (v, new_width, NULL, NULL);
321 }
322
323
324
325
326 /* Returns true if variable V is numeric, false otherwise. */
327 bool
328 var_is_numeric (const struct variable *v)
329 {
330   return var_get_type (v) == VAL_NUMERIC;
331 }
332
333 /* Returns true if variable V is a string variable, false
334    otherwise. */
335 bool
336 var_is_alpha (const struct variable *v)
337 {
338   return var_get_type (v) == VAL_STRING;
339 }
340 \f
341 /* Returns variable V's missing values. */
342 const struct missing_values *
343 var_get_missing_values (const struct variable *v)
344 {
345   return &v->miss;
346 }
347
348 /* Sets variable V's missing values to MISS, which must be of V's
349    width or at least resizable to V's width.
350    If MISS is null, then V's missing values, if any, are
351    cleared. */
352 static void
353 var_set_missing_values_quiet (struct variable *v, const struct missing_values *miss)
354 {
355   if (miss != NULL)
356     {
357       assert (mv_is_resizable (miss, v->width));
358       mv_destroy (&v->miss);
359       mv_copy (&v->miss, miss);
360       mv_resize (&v->miss, v->width);
361     }
362   else
363     mv_clear (&v->miss);
364 }
365
366 /* Sets variable V's missing values to MISS, which must be of V's
367    width or at least resizable to V's width.
368    If MISS is null, then V's missing values, if any, are
369    cleared. */
370 void
371 var_set_missing_values (struct variable *v, const struct missing_values *miss)
372 {
373   struct variable *ov = var_clone (v);
374   var_set_missing_values_quiet (v, miss);
375   dict_var_changed (v, VAR_TRAIT_MISSING_VALUES, ov);
376 }
377
378 /* Sets variable V to have no user-missing values. */
379 void
380 var_clear_missing_values (struct variable *v)
381 {
382   var_set_missing_values (v, NULL);
383 }
384
385 /* Returns true if V has any user-missing values,
386    false otherwise. */
387 bool
388 var_has_missing_values (const struct variable *v)
389 {
390   return !mv_is_empty (&v->miss);
391 }
392
393 /* Returns true if VALUE is in the given CLASS of missing values
394    in V, false otherwise. */
395 bool
396 var_is_value_missing (const struct variable *v, const union value *value,
397                       enum mv_class class)
398 {
399   return mv_is_value_missing (&v->miss, value, class);
400 }
401
402 /* Returns true if D is in the given CLASS of missing values in
403    V, false otherwise.
404    V must be a numeric variable. */
405 bool
406 var_is_num_missing (const struct variable *v, double d, enum mv_class class)
407 {
408   return mv_is_num_missing (&v->miss, d, class);
409 }
410
411 /* Returns true if S[] is a missing value for V, false otherwise.
412    S[] must contain exactly as many characters as V's width.
413    V must be a string variable. */
414 bool
415 var_is_str_missing (const struct variable *v, const uint8_t s[],
416                     enum mv_class class)
417 {
418   return mv_is_str_missing (&v->miss, s, class);
419 }
420 \f
421 /* Returns variable V's value labels,
422    possibly a null pointer if it has none. */
423 const struct val_labs *
424 var_get_value_labels (const struct variable *v)
425 {
426   return v->val_labs;
427 }
428
429 /* Returns true if variable V has at least one value label. */
430 bool
431 var_has_value_labels (const struct variable *v)
432 {
433   return val_labs_count (v->val_labs) > 0;
434 }
435
436 /* Sets variable V's value labels to a copy of VLS,
437    which must have a width equal to V's width or one that can be
438    changed to V's width.
439    If VLS is null, then V's value labels, if any, are removed. */
440 static void
441 var_set_value_labels_quiet (struct variable *v, const struct val_labs *vls)
442 {
443   val_labs_destroy (v->val_labs);
444   v->val_labs = NULL;
445
446   if (vls != NULL)
447     {
448       assert (val_labs_can_set_width (vls, v->width));
449       v->val_labs = val_labs_clone (vls);
450       val_labs_set_width (v->val_labs, v->width);
451     }
452 }
453
454
455 /* Sets variable V's value labels to a copy of VLS,
456    which must have a width equal to V's width or one that can be
457    changed to V's width.
458    If VLS is null, then V's value labels, if any, are removed. */
459 void
460 var_set_value_labels (struct variable *v, const struct val_labs *vls)
461 {
462   struct variable *ov = var_clone (v);
463   var_set_value_labels_quiet (v, vls);
464   dict_var_changed (v, VAR_TRAIT_LABEL, ov);  
465 }
466
467
468 /* Makes sure that V has a set of value labels,
469    by assigning one to it if necessary. */
470 static void
471 alloc_value_labels (struct variable *v)
472 {
473   if (v->val_labs == NULL)
474     v->val_labs = val_labs_create (v->width);
475 }
476
477 /* Attempts to add a value label with the given VALUE and UTF-8 encoded LABEL
478    to V.  Returns true if successful, false otherwise (probably due to an
479    existing label).
480
481    In LABEL, the two-byte sequence "\\n" is interpreted as a new-line. */
482 bool
483 var_add_value_label (struct variable *v,
484                      const union value *value, const char *label)
485 {
486   alloc_value_labels (v);
487   return val_labs_add (v->val_labs, value, label);
488 }
489
490 /* Adds or replaces a value label with the given VALUE and UTF-8 encoded LABEL
491    to V.
492
493    In LABEL, the two-byte sequence "\\n" is interpreted as a new-line. */
494 void
495 var_replace_value_label (struct variable *v,
496                          const union value *value, const char *label)
497 {
498   alloc_value_labels (v);
499   val_labs_replace (v->val_labs, value, label);
500 }
501
502 /* Removes V's value labels, if any. */
503 void
504 var_clear_value_labels (struct variable *v)
505 {
506   var_set_value_labels (v, NULL);
507 }
508
509 /* Returns the label associated with VALUE for variable V, as a UTF-8 string in
510    a format suitable for output, or a null pointer if none. */
511 const char *
512 var_lookup_value_label (const struct variable *v, const union value *value)
513 {
514   return val_labs_find (v->val_labs, value);
515 }
516
517 /*
518    Append to STR the string representation of VALUE for variable V.
519    STR must be a pointer to an initialised struct string.
520 */
521 static void
522 append_value (const struct variable *v, const union value *value,
523               struct string *str)
524 {
525   char *s = data_out (value, var_get_encoding (v), &v->print);
526   ds_put_cstr (str, s);
527   free (s);
528 }
529
530 /* Append STR with a string representing VALUE for variable V.
531    That is, if VALUE has a label, append that label,
532    otherwise format VALUE and append the formatted string.
533    STR must be a pointer to an initialised struct string.
534 */
535 void
536 var_append_value_name (const struct variable *v, const union value *value,
537                        struct string *str)
538 {
539   enum settings_value_style style = settings_get_value_style ();
540   const char *name = var_lookup_value_label (v, value);
541
542   switch (style)
543     {
544     case SETTINGS_VAL_STYLE_VALUES:
545       append_value (v, value, str);
546       break;
547       
548     case SETTINGS_VAL_STYLE_LABELS:
549       if (name == NULL)
550         append_value (v, value, str);
551       else
552         ds_put_cstr (str, name);
553       break;
554
555     case SETTINGS_VAL_STYLE_BOTH:
556     default:
557       append_value (v, value, str);
558       if (name != NULL)
559         {
560           ds_put_cstr (str, " (");
561           ds_put_cstr (str, name);
562           ds_put_cstr (str, ")");
563         }
564       break;
565     };
566 }
567 \f
568 /* Print and write formats. */
569
570 /* Returns V's print format specification. */
571 const struct fmt_spec *
572 var_get_print_format (const struct variable *v)
573 {
574   return &v->print;
575 }
576
577 /* Sets V's print format specification to PRINT, which must be a
578    valid format specification for a variable of V's width
579    (ordinarily an output format, but input formats are not
580    rejected). */
581 static void
582 var_set_print_format_quiet (struct variable *v, const struct fmt_spec *print)
583 {
584   if (!fmt_equal (&v->print, print))
585     {
586       assert (fmt_check_width_compat (print, v->width));
587       v->print = *print;
588     }
589 }
590
591 /* Sets V's print format specification to PRINT, which must be a
592    valid format specification for a variable of V's width
593    (ordinarily an output format, but input formats are not
594    rejected). */
595 void
596 var_set_print_format (struct variable *v, const struct fmt_spec *print)
597 {
598   struct variable *ov = var_clone (v);
599   var_set_print_format_quiet (v, print);
600   dict_var_changed (v, VAR_TRAIT_PRINT_FORMAT, ov);
601 }
602
603 /* Returns V's write format specification. */
604 const struct fmt_spec *
605 var_get_write_format (const struct variable *v)
606 {
607   return &v->write;
608 }
609
610 /* Sets V's write format specification to WRITE, which must be a
611    valid format specification for a variable of V's width
612    (ordinarily an output format, but input formats are not
613    rejected). */
614 static void
615 var_set_write_format_quiet (struct variable *v, const struct fmt_spec *write)
616 {
617   if (!fmt_equal (&v->write, write))
618     {
619       assert (fmt_check_width_compat (write, v->width));
620       v->write = *write;
621     }
622 }
623
624 /* Sets V's write format specification to WRITE, which must be a
625    valid format specification for a variable of V's width
626    (ordinarily an output format, but input formats are not
627    rejected). */
628 void
629 var_set_write_format (struct variable *v, const struct fmt_spec *write)
630 {
631   struct variable *ov = var_clone (v);
632   var_set_write_format_quiet (v, write);
633   dict_var_changed (v, VAR_TRAIT_WRITE_FORMAT, ov);
634 }
635
636
637 /* Sets V's print and write format specifications to FORMAT,
638    which must be a valid format specification for a variable of
639    V's width (ordinarily an output format, but input formats are
640    not rejected). */
641 void
642 var_set_both_formats (struct variable *v, const struct fmt_spec *format)
643 {
644   struct variable *ov = var_clone (v);
645   var_set_print_format_quiet (v, format);
646   var_set_write_format_quiet (v, format);
647   dict_var_changed (v, VAR_TRAIT_PRINT_FORMAT | VAR_TRAIT_WRITE_FORMAT, ov);
648 }
649
650 /* Returns the default print and write format for a variable of
651    the given TYPE, as set by var_create.  The return value can be
652    used to reset a variable's print and write formats to the
653    default. */
654 struct fmt_spec
655 var_default_formats (int width)
656 {
657   return (width == 0
658           ? fmt_for_output (FMT_F, 8, 2)
659           : fmt_for_output (FMT_A, width, 0));
660 }
661
662
663 \f
664
665 /* Update the combined name and label string if necessary */
666 static void
667 update_vl_string (const struct variable *v)
668 {
669   /* Cast away const! */
670   struct string *str = (struct string *) &v->name_and_label;
671
672   if (ds_is_empty (str))
673     {
674       if (v->label)
675         ds_put_format (str, _("%s (%s)"), v->label, v->name);
676       else
677         ds_put_cstr (str, v->name);
678     }
679 }
680
681
682 /* Return a string representing this variable, in the form most
683    appropriate from a human factors perspective, that is, its
684    variable label if it has one, otherwise its name. */
685 const char *
686 var_to_string (const struct variable *v)
687 {
688   enum settings_var_style style = settings_get_var_style ();
689
690   switch (style)
691   {
692     case SETTINGS_VAR_STYLE_NAMES:
693       return v->name;
694       break;
695     case SETTINGS_VAR_STYLE_LABELS:
696       return v->label != NULL ? v->label : v->name;
697       break;
698     case SETTINGS_VAR_STYLE_BOTH:
699       update_vl_string (v);
700       return ds_cstr (&v->name_and_label);
701       break;
702     default:
703       NOT_REACHED ();
704       break;
705   };
706 }
707
708 /* Returns V's variable label, or a null pointer if it has none. */
709 const char *
710 var_get_label (const struct variable *v)
711 {
712   return v->label;
713 }
714
715 /* Sets V's variable label to UTF-8 encoded string LABEL, stripping off leading
716    and trailing white space.  If LABEL is a null pointer or if LABEL is an
717    empty string (after stripping white space), then V's variable label (if any)
718    is removed. */
719 static void
720 var_set_label_quiet (struct variable *v, const char *label)
721 {
722   free (v->label);
723   v->label = NULL;
724
725   if (label != NULL && label[strspn (label, CC_SPACES)])
726     v->label = xstrdup (label);
727
728   ds_destroy (&v->name_and_label);
729   ds_init_empty (&v->name_and_label);
730 }
731
732
733
734 /* Sets V's variable label to UTF-8 encoded string LABEL, stripping off leading
735    and trailing white space.  If LABEL is a null pointer or if LABEL is an
736    empty string (after stripping white space), then V's variable label (if any)
737    is removed. */
738 void
739 var_set_label (struct variable *v, const char *label)
740 {
741   struct variable *ov = var_clone (v);
742   var_set_label_quiet (v, label);
743   dict_var_changed (v, VAR_TRAIT_LABEL, ov);
744 }
745
746
747 /* Removes any variable label from V. */
748 void
749 var_clear_label (struct variable *v)
750 {
751   var_set_label (v, NULL);
752 }
753
754 /* Returns true if V has a variable V,
755    false otherwise. */
756 bool
757 var_has_label (const struct variable *v)
758 {
759   return v->label != NULL;
760 }
761 \f
762 /* Returns true if M is a valid variable measurement level,
763    false otherwise. */
764 bool
765 measure_is_valid (enum measure m)
766 {
767   return m == MEASURE_NOMINAL || m == MEASURE_ORDINAL || m == MEASURE_SCALE;
768 }
769
770 /* Returns a string version of measurement level M, for display to a user. */
771 const char *
772 measure_to_string (enum measure m)
773 {
774   switch (m)
775     {
776     case MEASURE_NOMINAL:
777       return _("Nominal");
778
779     case MEASURE_ORDINAL:
780       return _("Ordinal");
781
782     case MEASURE_SCALE:
783       return _("Scale");
784
785     default:
786       return "Invalid";
787     }
788 }
789
790 /* Returns a string version of measurement level M, for use in PSPP command
791    syntax. */
792 const char *
793 measure_to_syntax (enum measure m)
794 {
795   switch (m)
796     {
797     case MEASURE_NOMINAL:
798       return "NOMINAL";
799
800     case MEASURE_ORDINAL:
801       return "ORDINAL";
802
803     case MEASURE_SCALE:
804       return "SCALE";
805
806     default:
807       return "Invalid";
808     }
809 }
810
811 /* Returns V's measurement level. */
812 enum measure
813 var_get_measure (const struct variable *v)
814 {
815   return v->measure;
816 }
817
818 /* Sets V's measurement level to MEASURE. */
819 static void
820 var_set_measure_quiet (struct variable *v, enum measure measure)
821 {
822   assert (measure_is_valid (measure));
823   v->measure = measure;
824 }
825
826
827 /* Sets V's measurement level to MEASURE. */
828 void
829 var_set_measure (struct variable *v, enum measure measure)
830 {
831   struct variable *ov = var_clone (v);
832   var_set_measure_quiet (v, measure);
833   dict_var_changed (v, VAR_TRAIT_MEASURE, ov);
834 }
835
836
837 /* Returns the default measurement level for a variable of the
838    given TYPE, as set by var_create.  The return value can be
839    used to reset a variable's measurement level to the
840    default. */
841 enum measure
842 var_default_measure (enum val_type type)
843 {
844   return type == VAL_NUMERIC ? MEASURE_SCALE : MEASURE_NOMINAL;
845 }
846 \f
847 /* Returns true if M is a valid variable role,
848    false otherwise. */
849 bool
850 var_role_is_valid (enum var_role role)
851 {
852   switch (role)
853     {
854     case ROLE_NONE:
855     case ROLE_INPUT:
856     case ROLE_TARGET:
857     case ROLE_BOTH:
858     case ROLE_PARTITION:
859     case ROLE_SPLIT:
860       return true;
861
862     default:
863       return false;
864     }
865 }
866
867 /* Returns a string version of ROLE, for display to a user. */
868 const char *
869 var_role_to_string (enum var_role role)
870 {
871   switch (role)
872     {
873     case ROLE_INPUT:
874       return _("Input");
875
876     case ROLE_TARGET:
877       return _("Output");
878
879     case ROLE_BOTH:
880       return _("Both");
881
882     case ROLE_NONE:
883       return _("None");
884
885     case ROLE_PARTITION:
886       return _("Partition");
887
888     case ROLE_SPLIT:
889       return _("Split");
890
891     default:
892       return "Invalid";
893     }
894 }
895
896 /* Returns a string version of ROLE, for use in PSPP comamnd syntax. */
897 const char *
898 var_role_to_syntax (enum var_role role)
899 {
900   switch (role)
901     {
902     case ROLE_INPUT:
903       return "INPUT";
904
905     case ROLE_TARGET:
906       return "TARGET";
907
908     case ROLE_BOTH:
909       return "BOTH";
910
911     case ROLE_NONE:
912       return "NONE";
913
914     case ROLE_PARTITION:
915       return "PARTITION";
916
917     case ROLE_SPLIT:
918       return "SPLIT";
919
920     default:
921       return "<invalid>";
922     }
923 }
924
925 /* Returns V's role. */
926 enum var_role
927 var_get_role (const struct variable *v)
928 {
929   return v->role;
930 }
931
932 /* Sets V's role to ROLE. */
933 static void
934 var_set_role_quiet (struct variable *v, enum var_role role)
935 {
936   assert (var_role_is_valid (role));
937   v->role = role;
938 }
939
940
941 /* Sets V's role to ROLE. */
942 void
943 var_set_role (struct variable *v, enum var_role role)
944 {
945   struct variable *ov = var_clone (v);
946   var_set_role_quiet (v, role);
947   dict_var_changed (v, VAR_TRAIT_ROLE, ov);
948 }
949 \f
950 /* Returns V's display width, which applies only to GUIs. */
951 int
952 var_get_display_width (const struct variable *v)
953 {
954   return v->display_width;
955 }
956
957 /* Sets V's display width to DISPLAY_WIDTH. */
958 static void
959 var_set_display_width_quiet (struct variable *v, int new_width)
960 {
961   if (v->display_width != new_width)
962     {
963       v->display_width = new_width;
964     }
965 }
966
967 void
968 var_set_display_width (struct variable *v, int new_width)
969 {
970   struct variable *ov = var_clone (v);
971   var_set_display_width_quiet (v, new_width);
972   dict_var_changed (v, VAR_TRAIT_DISPLAY_WIDTH, ov);
973 }
974
975
976 /* Returns the default display width for a variable of the given
977    WIDTH, as set by var_create.  The return value can be used to
978    reset a variable's display width to the default. */
979 int
980 var_default_display_width (int width)
981 {
982   return width == 0 ? 8 : MIN (width, 32);
983 }
984 \f
985 /* Returns true if A is a valid alignment,
986    false otherwise. */
987 bool
988 alignment_is_valid (enum alignment a)
989 {
990   return a == ALIGN_LEFT || a == ALIGN_RIGHT || a == ALIGN_CENTRE;
991 }
992
993 /* Returns a string version of alignment A, for display to a user. */
994 const char *
995 alignment_to_string (enum alignment a)
996 {
997   switch (a)
998     {
999     case ALIGN_LEFT:
1000       return _("Left");
1001
1002     case ALIGN_RIGHT:
1003       return _("Right");
1004
1005     case ALIGN_CENTRE:
1006       return _("Center");
1007
1008     default:
1009       return "Invalid";
1010     }
1011 }
1012
1013 /* Returns a string version of alignment A, for use in PSPP command syntax. */
1014 const char *
1015 alignment_to_syntax (enum alignment a)
1016 {
1017   switch (a)
1018     {
1019     case ALIGN_LEFT:
1020       return "LEFT";
1021
1022     case ALIGN_RIGHT:
1023       return "RIGHT";
1024
1025     case ALIGN_CENTRE:
1026       return "CENTER";
1027
1028     default:
1029       return "Invalid";
1030     }
1031 }
1032
1033 /* Returns V's display alignment, which applies only to GUIs. */
1034 enum alignment
1035 var_get_alignment (const struct variable *v)
1036 {
1037   return v->alignment;
1038 }
1039
1040 /* Sets V's display alignment to ALIGNMENT. */
1041 static void
1042 var_set_alignment_quiet (struct variable *v, enum alignment alignment)
1043 {
1044   assert (alignment_is_valid (alignment));
1045   v->alignment = alignment;
1046 }
1047
1048 /* Sets V's display alignment to ALIGNMENT. */
1049 void
1050 var_set_alignment (struct variable *v, enum alignment alignment)
1051 {
1052   struct variable *ov = var_clone (v);
1053   var_set_alignment_quiet (v, alignment);
1054   dict_var_changed (v, VAR_TRAIT_ALIGNMENT, ov);
1055 }
1056
1057
1058 /* Returns the default display alignment for a variable of the
1059    given TYPE, as set by var_create.  The return value can be
1060    used to reset a variable's display alignment to the default. */
1061 enum alignment
1062 var_default_alignment (enum val_type type)
1063 {
1064   return type == VAL_NUMERIC ? ALIGN_RIGHT : ALIGN_LEFT;
1065 }
1066 \f
1067 /* Whether variables' values should be preserved from case to
1068    case. */
1069
1070 /* Returns true if variable V's value should be left from case to
1071    case, instead of being reset to system-missing or blanks. */
1072 bool
1073 var_get_leave (const struct variable *v)
1074 {
1075   return v->leave;
1076 }
1077
1078 /* Sets V's leave setting to LEAVE. */
1079 static void
1080 var_set_leave_quiet (struct variable *v, bool leave)
1081 {
1082   assert (leave || !var_must_leave (v));
1083   v->leave = leave;
1084 }
1085
1086
1087 /* Sets V's leave setting to LEAVE. */
1088 void
1089 var_set_leave (struct variable *v, bool leave)
1090 {
1091   struct variable *ov = var_clone (v);
1092   var_set_leave_quiet (v, leave);
1093   dict_var_changed (v, VAR_TRAIT_LEAVE, ov);
1094 }
1095
1096
1097 /* Returns true if V must be left from case to case,
1098    false if it can be set either way. */
1099 bool
1100 var_must_leave (const struct variable *v)
1101 {
1102   return var_get_dict_class (v) == DC_SCRATCH;
1103 }
1104 \f
1105 /* Returns the number of short names stored in VAR.
1106
1107    Short names are used only for system and portable file input
1108    and output.  They are upper-case only, not necessarily unique,
1109    and limited to SHORT_NAME_LEN characters (plus a null
1110    terminator).  Ordinarily a variable has at most one short
1111    name, but very long string variables (longer than 255 bytes)
1112    may have more.  A variable might not have any short name at
1113    all if it hasn't been saved to or read from a system or
1114    portable file. */
1115 size_t
1116 var_get_short_name_cnt (const struct variable *var) 
1117 {
1118   return var->short_name_cnt;
1119 }
1120
1121 /* Returns VAR's short name with the given IDX, if it has one
1122    with that index, or a null pointer otherwise.  Short names may
1123    be sparse: even if IDX is less than the number of short names
1124    in VAR, this function may return a null pointer. */
1125 const char *
1126 var_get_short_name (const struct variable *var, size_t idx)
1127 {
1128   return idx < var->short_name_cnt ? var->short_names[idx] : NULL;
1129 }
1130
1131 /* Sets VAR's short name with the given IDX to the UTF-8 string SHORT_NAME.
1132    The caller must already have checked that, in the dictionary encoding,
1133    SHORT_NAME is no more than SHORT_NAME_LEN bytes long.  The new short name
1134    will be converted to uppercase.
1135
1136    Specifying a null pointer for SHORT_NAME clears the specified short name. */
1137 void
1138 var_set_short_name (struct variable *var, size_t idx, const char *short_name)
1139 {
1140   struct variable *ov = var_clone (var);
1141
1142   assert (short_name == NULL || id_is_plausible (short_name, false));
1143
1144   /* Clear old short name numbered IDX, if any. */
1145   if (idx < var->short_name_cnt) 
1146     {
1147       free (var->short_names[idx]);
1148       var->short_names[idx] = NULL; 
1149     }
1150
1151   /* Install new short name for IDX. */
1152   if (short_name != NULL) 
1153     {
1154       if (idx >= var->short_name_cnt)
1155         {
1156           size_t old_cnt = var->short_name_cnt;
1157           size_t i;
1158           var->short_name_cnt = MAX (idx * 2, 1);
1159           var->short_names = xnrealloc (var->short_names, var->short_name_cnt,
1160                                         sizeof *var->short_names);
1161           for (i = old_cnt; i < var->short_name_cnt; i++)
1162             var->short_names[i] = NULL;
1163         }
1164       var->short_names[idx] = utf8_to_upper (short_name);
1165     }
1166
1167   dict_var_changed (var, VAR_TRAIT_NAME, ov);
1168 }
1169
1170 /* Clears V's short names. */
1171 void
1172 var_clear_short_names (struct variable *v)
1173 {
1174   size_t i;
1175
1176   for (i = 0; i < v->short_name_cnt; i++)
1177     free (v->short_names[i]);
1178   free (v->short_names);
1179   v->short_names = NULL;
1180   v->short_name_cnt = 0;
1181 }
1182 \f
1183 /* Relationship with dictionary. */
1184
1185 /* Returns V's index within its dictionary, the value
1186    for which "dict_get_var (dict, index)" will return V.
1187    V must be in a dictionary. */
1188 size_t
1189 var_get_dict_index (const struct variable *v)
1190 {
1191   assert (var_has_vardict (v));
1192   return vardict_get_dict_index (v->vardict);
1193 }
1194
1195 /* Returns V's index within the case represented by its
1196    dictionary, that is, the value for which "case_data_idx (case,
1197    index)" will return the data for V in that case.
1198    V must be in a dictionary. */
1199 size_t
1200 var_get_case_index (const struct variable *v)
1201 {
1202   assert (var_has_vardict (v));
1203   return vardict_get_case_index (v->vardict);
1204 }
1205 \f
1206 /* Returns variable V's attribute set.  The caller may examine or
1207    modify the attribute set, but must not destroy it.  Destroying
1208    V, or calling var_set_attributes() on V, will also destroy its
1209    attribute set. */
1210 struct attrset *
1211 var_get_attributes (const struct variable *v) 
1212 {
1213   return CONST_CAST (struct attrset *, &v->attributes);
1214 }
1215
1216 /* Replaces variable V's attributes set by a copy of ATTRS. */
1217 static void
1218 var_set_attributes_quiet (struct variable *v, const struct attrset *attrs) 
1219 {
1220   attrset_destroy (&v->attributes);
1221   attrset_clone (&v->attributes, attrs);
1222 }
1223
1224 /* Replaces variable V's attributes set by a copy of ATTRS. */
1225 void
1226 var_set_attributes (struct variable *v, const struct attrset *attrs) 
1227 {
1228   struct variable *ov = var_clone (v);
1229   var_set_attributes_quiet (v, attrs);
1230   dict_var_changed (v, VAR_TRAIT_ATTRIBUTES, ov);
1231 }
1232
1233
1234 /* Returns true if V has any custom attributes, false if it has none. */
1235 bool
1236 var_has_attributes (const struct variable *v)
1237 {
1238   return attrset_count (&v->attributes) > 0;
1239 }
1240 \f
1241
1242 /* Creates and returns a clone of OLD_VAR.  Most properties of
1243    the new variable are copied from OLD_VAR, except:
1244
1245     - The variable's short name is not copied, because there is
1246       no reason to give a new variable with potentially a new
1247       name the same short name.
1248
1249     - The new variable is not added to OLD_VAR's dictionary by
1250       default.  Use dict_clone_var, instead, to do that.
1251 */
1252 struct variable *
1253 var_clone (const struct variable *old_var)
1254 {
1255   struct variable *new_var = var_create (var_get_name (old_var),
1256                                          var_get_width (old_var));
1257
1258   var_set_missing_values_quiet (new_var, var_get_missing_values (old_var));
1259   var_set_print_format_quiet (new_var, var_get_print_format (old_var));
1260   var_set_write_format_quiet (new_var, var_get_write_format (old_var));
1261   var_set_value_labels_quiet (new_var, var_get_value_labels (old_var));
1262   var_set_label_quiet (new_var, var_get_label (old_var));
1263   var_set_measure_quiet (new_var, var_get_measure (old_var));
1264   var_set_role_quiet (new_var, var_get_role (old_var));
1265   var_set_display_width_quiet (new_var, var_get_display_width (old_var));
1266   var_set_alignment_quiet (new_var, var_get_alignment (old_var));
1267   var_set_leave_quiet (new_var, var_get_leave (old_var));
1268   var_set_attributes_quiet (new_var, var_get_attributes (old_var));
1269
1270   return new_var;
1271 }
1272
1273
1274
1275 /* Returns the encoding of values of variable VAR.  (This is actually a
1276    property of the dictionary.)  Returns null if no specific encoding has been
1277    set.  */
1278 const char *
1279 var_get_encoding (const struct variable *var)
1280 {
1281   return (var_has_vardict (var)
1282           ? dict_get_encoding (vardict_get_dictionary (var->vardict))
1283           : NULL);
1284 }
1285 \f
1286 /* Returns V's vardict structure. */
1287 struct vardict_info *
1288 var_get_vardict (const struct variable *v)
1289 {
1290   return CONST_CAST (struct vardict_info *, v->vardict);
1291 }
1292
1293 /* Sets V's vardict data to VARDICT. */
1294 void
1295 var_set_vardict (struct variable *v, struct vardict_info *vardict)
1296 {
1297   v->vardict = vardict;
1298 }
1299
1300 /* Returns true if V has vardict data. */
1301 bool
1302 var_has_vardict (const struct variable *v)
1303 {
1304   return v->vardict != NULL;
1305 }
1306
1307 /* Clears V's vardict data. */
1308 void
1309 var_clear_vardict (struct variable *v)
1310 {
1311   v->vardict = NULL;
1312 }