X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fpor-file-writer.c;h=7b1b25512a89358b966d44416467dfd5e4bf2b10;hb=b5c82cc9aabe7e641011130240ae1b2e84348e23;hp=773969302ebcb9ddc3b06fea93aa1da6c66c313c;hpb=a1efcf97ca2f75f4be6a0389ff2372c03ed2d4e1;p=pspp-builds.git diff --git a/src/data/por-file-writer.c b/src/data/por-file-writer.c index 77396930..7b1b2551 100644 --- a/src/data/por-file-writer.c +++ b/src/data/por-file-writer.c @@ -45,6 +45,7 @@ #include #include +#include "minmax.h" #include "xalloc.h" #include "gettext.h" @@ -172,7 +173,7 @@ pfm_open_writer (struct file_handle *fh, struct dictionary *dict, buf_write (w, "F", 1); if (ferror (w->file)) goto error; - return casewriter_create (dict_get_next_value_idx (dict), + return casewriter_create (dict_get_proto (dict), &por_file_casewriter_class, w); error: @@ -215,7 +216,8 @@ write_float (struct pfm_writer *w, double d) char buffer[64]; format_trig_double (d, floor (d) == d ? DBL_DIG : w->digits, buffer); buf_write (w, buffer, strlen (buffer)); - buf_write (w, "/", 1); + if (d != SYSMIS) + buf_write (w, "/", 1); } /* Write N to the portable file as an integer field. */ @@ -305,17 +307,17 @@ write_format (struct pfm_writer *w, struct fmt_spec f, int width) write_int (w, f.d); } -/* Write value V for variable VV to file H. */ +/* Write value V with width WIDTH to file H. */ static void -write_value (struct pfm_writer *w, union value *v, struct variable *vv) +write_value (struct pfm_writer *w, const union value *v, int width) { - if (var_is_numeric (vv)) + if (width == 0) write_float (w, v->f); else { - int width = MIN (var_get_width (vv), MAX_POR_WIDTH); + width = MIN (width, MAX_POR_WIDTH); write_int (w, width); - buf_write (w, v->s, width); + buf_write (w, value_str (v, width), width); } } @@ -342,6 +344,7 @@ write_variables (struct pfm_writer *w, struct dictionary *dict) struct variable *v = dict_get_var (dict, i); struct missing_values mv; int width = MIN (var_get_width (v), MAX_POR_WIDTH); + int j; buf_write (w, "7", 1); write_int (w, width); @@ -351,10 +354,12 @@ write_variables (struct pfm_writer *w, struct dictionary *dict) /* Write missing values. */ mv_copy (&mv, var_get_missing_values (v)); - while (mv_has_range (&mv)) + if (var_get_width (v) > 8) + mv_resize (&mv, 8); + if (mv_has_range (&mv)) { double x, y; - mv_pop_range (&mv, &x, &y); + mv_get_range (&mv, &x, &y); if (x == LOWEST) { buf_write (w, "9", 1); @@ -372,13 +377,12 @@ write_variables (struct pfm_writer *w, struct dictionary *dict) write_float (w, y); } } - while (mv_has_value (&mv)) + for (j = 0; j < mv_n_values (&mv); j++) { - union value value; - mv_pop_value (&mv, &value); buf_write (w, "8", 1); - write_value (w, &value, v); + write_value (w, mv_get_value (&mv, j), mv_get_width (&mv)); } + mv_destroy (&mv); /* Write variable label. */ if (var_get_label (v) != NULL) @@ -397,12 +401,12 @@ write_value_labels (struct pfm_writer *w, const struct dictionary *dict) for (i = 0; i < dict_get_var_cnt (dict); i++) { - struct val_labs_iterator *j; struct variable *v = dict_get_var (dict, i); const struct val_labs *val_labs = var_get_value_labels (v); - struct val_lab *vl; + size_t n_labels = val_labs_count (val_labs); + const struct val_lab **labels; - if (val_labs == NULL) + if (n_labels == 0) continue; buf_write (w, "D", 1); @@ -410,12 +414,15 @@ write_value_labels (struct pfm_writer *w, const struct dictionary *dict) write_string (w, var_get_short_name (v, 0)); write_int (w, val_labs_count (val_labs)); - for (vl = val_labs_first_sorted (val_labs, &j); vl != NULL; - vl = val_labs_next (val_labs, &j)) + n_labels = val_labs_count (val_labs); + labels = val_labs_sorted (val_labs); + for (i = 0; i < n_labels; i++) { - write_value (w, &vl->value, v); - write_string (w, vl->label); + const struct val_lab *vl = labels[i]; + write_value (w, val_lab_get_value (vl), var_get_width (v)); + write_string (w, val_lab_get_label (vl)); } + free (labels); } }