+Sat May 6 19:02:00 2006 Ben Pfaff <blp@gnu.org>
+
+ * 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 <blp@gnu.org>
* value-labels.h: Remove unneeded dependency on variable.h.
};
/* 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)
{
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. */
{
if (vls != NULL)
{
- if (vls->labels != NULL)
- hsh_destroy (vls->labels);
+ hsh_destroy (vls->labels);
free (vls);
}
}
#ifndef VAL_LABS_H
#define VAL_LABS_H 1
+#include <stdbool.h>
#include <stddef.h>
#include <data/value.h>
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);
+Sat May 6 19:03:13 2006 Ben Pfaff <blp@gnu.org>
+
+ * get.c: (mtf_merge_dictionary) Fix value label memory leak.
+
Sat May 6 13:51:16 2006 Ben Pfaff <blp@gnu.org>
Use a casefile, instead of a case sink, for MATCH FILES output.
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);
}
+Sat May 6 19:03:34 2006 Ben Pfaff <blp@gnu.org>
+
+ * apply-dictionary.c: (cmd_apply_dictionary) Use new function
+ val_labs_can_set_width().
+
Sat May 6 10:43:22 2006 Ben Pfaff <blp@gnu.org>
Continue reforming procedure execution. In this phase, get rid of
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;