[Top][All Lists]
[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Pspp-cvs] pspp/src data/ChangeLog data/value-labels.c dat...,
Ben Pfaff <=