pspp-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Pspp-cvs] pspp/src data/ChangeLog data/value-labels.c dat...


From: Ben Pfaff
Subject: [Pspp-cvs] pspp/src data/ChangeLog data/value-labels.c dat...
Date: Sun, 07 May 2006 02:04:12 +0000

CVSROOT:        /cvsroot/pspp
Module name:    pspp
Branch:         
Changes by:     Ben Pfaff <address@hidden>      06/05/07 02:04:12

Modified files:
        src/data       : ChangeLog value-labels.c value-labels.h 
        src/language/data-io: ChangeLog get.c 
        src/language/dictionary: ChangeLog apply-dictionary.c 

Log message:
        Some more cleanup with value labels.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/data/ChangeLog.diff?tr1=1.40&tr2=1.41&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/data/value-labels.c.diff?tr1=1.4&tr2=1.5&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/data/value-labels.h.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/language/data-io/ChangeLog.diff?tr1=1.16&tr2=1.17&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/language/data-io/get.c.diff?tr1=1.10&tr2=1.11&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/language/dictionary/ChangeLog.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/language/dictionary/apply-dictionary.c.diff?tr1=1.6&tr2=1.7&r1=text&r2=text

Patches:
Index: pspp/src/data/ChangeLog
diff -u pspp/src/data/ChangeLog:1.40 pspp/src/data/ChangeLog:1.41
--- pspp/src/data/ChangeLog:1.40        Sat May  6 23:14:31 2006
+++ pspp/src/data/ChangeLog     Sun May  7 02:04:12 2006
@@ -1,3 +1,10 @@
+Sat May  6 19:02:00 2006  Ben Pfaff  <address@hidden>
+
+       * value-labels.c (val_labs_can_set_width): New function.
+       (val_labs_set_width) Clear labels if increasing width to long
+       string.
+       (val_labs_destroy) Remove unneeded test for null.
+       
 Sat May  6 16:14:08 2006  Ben Pfaff  <address@hidden>
 
        * value-labels.h: Remove unneeded dependency on variable.h.
Index: pspp/src/data/value-labels.c
diff -u pspp/src/data/value-labels.c:1.4 pspp/src/data/value-labels.c:1.5
--- pspp/src/data/value-labels.c:1.4    Sat May  6 23:14:31 2006
+++ pspp/src/data/value-labels.c        Sun May  7 02:04:12 2006
@@ -47,8 +47,8 @@
   };
 
 /* Creates and returns a new, empty set of value labels with the
-   given WIDTH, which must designate a numeric (0) or short
-   string (1...MAX_SHORT_STRING inclusive) width. */
+   given WIDTH.  To actually add any value labels, WIDTH must be
+   a numeric or short string width. */
 struct val_labs *
 val_labs_create (int width) 
 {
@@ -80,16 +80,53 @@
   return copy;
 }
 
+/* Determines whether VLS's width can be changed to NEW_WIDTH.
+   Numeric widths cannot be changed at all.
+   Strings can be widened.  They can be shortened only if the
+   characters that will be truncated are spaces. */
+bool
+val_labs_can_set_width (const struct val_labs *vls, int new_width) 
+{
+  assert ((vls->width == 0) == (new_width == 0));
+
+  if (vls->width == 0)
+    return new_width == 0;
+  else if (new_width < vls->width)
+    {
+      struct val_labs_iterator *i;
+      struct val_lab *lab;
+
+      for (lab = val_labs_first (vls, &i); lab != NULL;
+           lab = val_labs_next (vls, &i))
+        {
+          int j;
+
+          /* We can shorten the value labels only if all the
+             truncated characters are blanks. */
+          for (j = vls->width; j < new_width; j++)
+            if (lab->value.s[j] != ' ') 
+              {
+                val_labs_done (&i);
+                return false;
+              }
+        }
+      return true;
+    }
+  else
+    return true;
+}
+
 /* Changes the width of VLS to NEW_WIDTH.  If VLS is numeric,
    NEW_WIDTH must be 0, otherwise it must be within the range
    1...MAX_SHORT_STRING inclusive. */
 void
 val_labs_set_width (struct val_labs *vls, int new_width) 
 {
-  assert (vls != NULL);
-  assert ((vls->width == 0) == (new_width == 0));
+  assert (val_labs_can_set_width (vls, new_width));
 
   vls->width = new_width;
+  if (new_width > MAX_SHORT_STRING)
+    val_labs_clear (vls);
 }
 
 /* Destroys VLS. */
@@ -98,8 +135,7 @@
 {
   if (vls != NULL) 
     {
-      if (vls->labels != NULL)
-        hsh_destroy (vls->labels);
+      hsh_destroy (vls->labels);
       free (vls);
     }
 }
Index: pspp/src/data/value-labels.h
diff -u pspp/src/data/value-labels.h:1.2 pspp/src/data/value-labels.h:1.3
--- pspp/src/data/value-labels.h:1.2    Sat May  6 23:14:31 2006
+++ pspp/src/data/value-labels.h        Sun May  7 02:04:12 2006
@@ -20,6 +20,7 @@
 #ifndef VAL_LABS_H
 #define VAL_LABS_H 1
 
+#include <stdbool.h>
 #include <stddef.h>
 
 #include <data/value.h>
@@ -35,11 +36,13 @@
 
 struct val_labs *val_labs_create (int width);
 struct val_labs *val_labs_copy (const struct val_labs *);
-void val_labs_set_width (struct val_labs *, int new_width);
 void val_labs_destroy (struct val_labs *);
 void val_labs_clear (struct val_labs *);
 size_t val_labs_count (const struct val_labs *);
 
+bool val_labs_can_set_width (const struct val_labs *, int new_width);
+void val_labs_set_width (struct val_labs *, int new_width);
+
 int val_labs_add (struct val_labs *, union value, const char *);
 int val_labs_replace (struct val_labs *, union value, const char *);
 int val_labs_remove (struct val_labs *, union value);
Index: pspp/src/language/data-io/ChangeLog
diff -u pspp/src/language/data-io/ChangeLog:1.16 
pspp/src/language/data-io/ChangeLog:1.17
--- pspp/src/language/data-io/ChangeLog:1.16    Sat May  6 20:53:25 2006
+++ pspp/src/language/data-io/ChangeLog Sun May  7 02:04:12 2006
@@ -1,3 +1,7 @@
+Sat May  6 19:03:13 2006  Ben Pfaff  <address@hidden>
+
+       * get.c: (mtf_merge_dictionary) Fix value label memory leak.
+
 Sat May  6 13:51:16 2006  Ben Pfaff  <address@hidden>
 
        Use a casefile, instead of a case sink, for MATCH FILES output.
Index: pspp/src/language/data-io/get.c
diff -u pspp/src/language/data-io/get.c:1.10 
pspp/src/language/data-io/get.c:1.11
--- pspp/src/language/data-io/get.c:1.10        Sat May  6 20:53:25 2006
+++ pspp/src/language/data-io/get.c     Sun May  7 02:04:12 2006
@@ -1540,8 +1540,11 @@
           if (dv->width == mv->width)
             {
               if (val_labs_count (dv->val_labs)
-                  && !val_labs_count (mv->val_labs))
-                mv->val_labs = val_labs_copy (dv->val_labs);
+                  && !val_labs_count (mv->val_labs)) 
+                {
+                  val_labs_destroy (mv->val_labs);
+                  mv->val_labs = val_labs_copy (dv->val_labs); 
+                }
               if (!mv_is_empty (&dv->miss) && mv_is_empty (&mv->miss))
                 mv_copy (&mv->miss, &dv->miss);
             }
Index: pspp/src/language/dictionary/ChangeLog
diff -u pspp/src/language/dictionary/ChangeLog:1.2 
pspp/src/language/dictionary/ChangeLog:1.3
--- pspp/src/language/dictionary/ChangeLog:1.2  Sat May  6 17:46:52 2006
+++ pspp/src/language/dictionary/ChangeLog      Sun May  7 02:04:12 2006
@@ -1,3 +1,8 @@
+Sat May  6 19:03:34 2006  Ben Pfaff  <address@hidden>
+
+       * apply-dictionary.c: (cmd_apply_dictionary) Use new function
+       val_labs_can_set_width().
+
 Sat May  6 10:43:22 2006  Ben Pfaff  <address@hidden>
 
        Continue reforming procedure execution.  In this phase, get rid of
Index: pspp/src/language/dictionary/apply-dictionary.c
diff -u pspp/src/language/dictionary/apply-dictionary.c:1.6 
pspp/src/language/dictionary/apply-dictionary.c:1.7
--- pspp/src/language/dictionary/apply-dictionary.c:1.6 Fri May  5 04:53:13 2006
+++ pspp/src/language/dictionary/apply-dictionary.c     Sun May  7 02:04:12 2006
@@ -91,38 +91,7 @@
             s->name);
       else if (val_labs_count (s->val_labs))
        {
-          /* Whether to apply the value labels. */
-          int apply = 1;
-          
-         if (t->width < s->width)
-           {
-             struct val_labs_iterator *i;
-             struct val_lab *lab;
-
-              for (lab = val_labs_first (s->val_labs, &i); lab != NULL;
-                   lab = val_labs_next (s->val_labs, &i))
-               {
-                 int j;
-
-                 /* We will apply the value labels only if all
-                     the truncated characters are blanks. */
-                 for (j = t->width; j < s->width; j++)
-                   if (lab->value.s[j] != ' ') 
-                      {
-                        val_labs_done (&i);
-                        apply = 0;
-                        break; 
-                      }
-               }
-           }
-         else
-           {
-             /* Fortunately, we follow the convention that all value
-                label values are right-padded with spaces, so it is
-                unnecessary to bother padding values here. */
-           }
-
-         if (apply) 
+          if (val_labs_can_set_width (s->val_labs, t->width))
             {
               val_labs_destroy (t->val_labs);
               t->val_labs = s->val_labs;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]