Put unique dictionary indexes into internal variables
[pspp-builds.git] / src / data / variable.c
index d14237d925c3442e4baa8bbf9204a09044f41818..30cf03b134666cf8f6db1f457c8e3733b0b311e9 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2009 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
@@ -148,17 +148,21 @@ var_clone (const struct variable *old_var)
   return new_var;
 }
 
-/* Create a variable to be used for internal calculations only */
+/* Create a variable to be used for internal calculations only.
+   The variable is assigned a unique dictionary index and a case
+   index of CASE_IDX. */
 struct variable *
 var_create_internal (int case_idx)
 {
   struct variable *v = var_create ("$internal", 0);
-
   struct vardict_info vdi;
+  static int counter = INT_MAX / 2;
 
   vdi.dict = NULL;
-  vdi.dict_index = 0;
   vdi.case_index = case_idx;
+  vdi.dict_index = counter++;
+  if (counter == INT_MAX)
+    counter = INT_MAX / 2;
 
   var_set_vardict (v, &vdi);
 
@@ -778,9 +782,15 @@ var_get_display_width (const struct variable *v)
 
 /* Sets V's display width to DISPLAY_WIDTH. */
 void
-var_set_display_width (struct variable *v, int display_width)
+var_set_display_width (struct variable *v, int new_width)
 {
-  v->display_width = display_width;
+  int old_width = v->display_width;
+
+  v->display_width = new_width;
+
+  if ( old_width != new_width)
+    dict_var_display_width_changed (v);
+
   dict_var_changed (v);
 }