X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fvalue-labels.c;h=b9c85d54f1e1477f39bab8e0b2e3d9ccb189e6be;hb=5853c2fb0300e3db0ac6a06f1d91a7454f53be42;hp=594518e07758611882ef428c519543a2f4af0fab;hpb=396f0111f30096a7615f4767e10cdff42c03e57d;p=pspp-builds.git diff --git a/src/data/value-labels.c b/src/data/value-labels.c index 594518e0..b9c85d54 100644 --- a/src/data/value-labels.c +++ b/src/data/value-labels.c @@ -47,8 +47,8 @@ struct val_labs }; /* 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 @@ val_labs_copy (const struct val_labs *vls) 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 @@ val_labs_destroy (struct val_labs *vls) { if (vls != NULL) { - if (vls->labels != NULL) - hsh_destroy (vls->labels); + hsh_destroy (vls->labels); free (vls); } }