X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdictionary%2Fsys-file-info.c;h=01f4246fd816ff0b17ab00cad4c2cf03813088ac;hb=5cc88fdabd7f3bd107052538f9f1b961f4914385;hp=6d033419d1f404e8a0a6dcfd3ff0cabe32f919cd;hpb=f4768c8822dcce37de6286b2b5acccb69c61de97;p=pspp diff --git a/src/language/dictionary/sys-file-info.c b/src/language/dictionary/sys-file-info.c index 6d033419d1..01f4246fd8 100644 --- a/src/language/dictionary/sys-file-info.c +++ b/src/language/dictionary/sys-file-info.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -69,17 +69,18 @@ static int describe_variable (const struct variable *v, struct tab_table *t, /* Sets the widths of all the columns and heights of all the rows in table T for driver D. */ static void -sysfile_info_dim (struct tab_table *t, struct outp_driver *d) +sysfile_info_dim (struct tab_rendering *r, void *aux UNUSED) { + const struct tab_table *t = r->table; static const int max[] = {20, 5, 35, 3, 0}; const int *p; int i; for (p = max; *p; p++) - t->w[p - max] = MIN (tab_natural_width (t, d, p - max), - *p * d->prop_em_width); + r->w[p - max] = MIN (tab_natural_width (r, p - max), + *p * r->driver->prop_em_width); for (i = 0; i < t->nr; i++) - t->h[i] = tab_natural_height (t, d, i); + r->h[i] = tab_natural_height (r, i); } /* SYSFILE INFO utility. */ @@ -160,11 +161,11 @@ cmd_sysfile_info (struct lexer *lexer, struct dataset *ds UNUSED) dict_get_encoding(d) ? dict_get_encoding(d) : _("Unknown")); - tab_dim (t, tab_natural_dimensions); + tab_dim (t, tab_natural_dimensions, NULL, NULL); tab_submit (t); t = tab_create (4, 1 + 2 * dict_get_var_cnt (d), 1); - tab_dim (t, sysfile_info_dim); + tab_dim (t, sysfile_info_dim, NULL, NULL); tab_headers (t, 0, 0, 1, 0); tab_text (t, 0, 0, TAB_LEFT | TAT_TITLE, _("Variable")); tab_joint_text (t, 1, 0, 2, 0, TAB_LEFT | TAT_TITLE, _("Description")); @@ -339,44 +340,45 @@ display_documents (const struct dictionary *dict) } } -static int _flags; +struct variables_dim_aux + { + int flags; + }; /* Sets the widths of all the columns and heights of all the rows in table T for driver D. */ static void -variables_dim (struct tab_table *t, struct outp_driver *d) +variables_dim (struct tab_rendering *r, void *aux_) { - int pc; - int i; + const struct outp_driver *d = r->driver; + struct variables_dim_aux *aux = aux_; - t->w[0] = tab_natural_width (t, d, 0); - if (_flags & (DF_VALUE_LABELS | DF_VARIABLE_LABELS | DF_MISSING_VALUES - | DF_AT_ATTRIBUTES | DF_ATTRIBUTES)) + tab_natural_dimensions (r, NULL); + if (aux->flags & (DF_VALUE_LABELS | DF_VARIABLE_LABELS | DF_MISSING_VALUES + | DF_AT_ATTRIBUTES | DF_ATTRIBUTES)) { - t->w[1] = MAX (tab_natural_width (t, d, 1), d->prop_em_width * 5); - t->w[2] = MAX (tab_natural_width (t, d, 2), d->prop_em_width * 35); - pc = 3; + r->w[1] = MAX (r->w[1], d->prop_em_width * 5); + r->w[2] = MAX (r->w[2], d->prop_em_width * 35); } - else - pc = 1; - if (_flags & DF_DICT_INDEX) - t->w[pc] = tab_natural_width (t, d, pc); +} - for (i = 0; i < t->nr; i++) - t->h[i] = tab_natural_height (t, d, i); +static void +variables_dim_free (void *aux_) +{ + struct variables_dim_aux *aux = aux_; + free (aux); } static void display_variables (const struct variable **vl, size_t n, int flags) { struct tab_table *t; + struct variables_dim_aux *aux; int nc; /* Number of columns. */ int pc; /* `Position column' */ int r; /* Current row. */ size_t i; - _flags = flags; - /* One column for the name, two columns for general description, one column for dictionary index. */ @@ -397,7 +399,10 @@ display_variables (const struct variable **vl, size_t n, int flags) ? _("Description") : _("Label"))); if (flags & DF_DICT_INDEX) tab_text (t, pc, 0, TAB_LEFT | TAT_TITLE, _("Position")); - tab_dim (t, variables_dim); + + aux = xmalloc (sizeof *aux); + aux->flags = flags; + tab_dim (t, variables_dim, variables_dim_free, aux); r = 1; for (i = 0; i < n; i++) @@ -413,7 +418,7 @@ display_variables (const struct variable **vl, size_t n, int flags) if (flags & ~DF_DICT_INDEX) tab_vline (t, TAL_1, nc - 1, 0, r - 1); tab_resize (t, -1, r); - tab_columns (t, TAB_COL_DOWN, 1); + tab_columns (t, TAB_COL_DOWN); tab_submit (t); } @@ -486,8 +491,8 @@ display_data_file_attributes (struct attrset *set, int flags) tab_text (t, 0, 0, TAB_LEFT | TAT_TITLE, _("Attribute")); tab_text (t, 1, 0, TAB_LEFT | TAT_TITLE, _("Value")); display_attributes (t, set, flags, 0, 1); - tab_columns (t, TAB_COL_DOWN, 1); - tab_dim (t, tab_natural_dimensions); + tab_columns (t, TAB_COL_DOWN); + tab_dim (t, tab_natural_dimensions, NULL, NULL); tab_title (t, "Custom data file attributes."); tab_submit (t); } @@ -582,18 +587,18 @@ describe_variable (const struct variable *v, struct tab_table *t, int r, /* Missing values if any. */ if (flags & DF_MISSING_VALUES && var_has_missing_values (v)) { + const struct missing_values *mv = var_get_missing_values (v); char buf[128]; char *cp; - struct missing_values mv; int cnt = 0; + int i; cp = stpcpy (buf, _("Missing Values: ")); - mv_copy (&mv, var_get_missing_values (v)); - if (mv_has_range (&mv)) + if (mv_has_range (mv)) { double x, y; - mv_pop_range (&mv, &x, &y); + mv_get_range (mv, &x, &y); if (x == LOWEST) cp += sprintf (cp, "LOWEST THRU %g", y); else if (y == HIGHEST) @@ -602,19 +607,21 @@ describe_variable (const struct variable *v, struct tab_table *t, int r, cp += sprintf (cp, "%g THRU %g", x, y); cnt++; } - while (mv_has_value (&mv)) + for (i = 0; i < mv_n_values (mv); i++) { - union value value; - mv_pop_value (&mv, &value); + const union value *value = mv_get_value (mv, i); if (cnt++ > 0) cp += sprintf (cp, "; "); if (var_is_numeric (v)) - cp += sprintf (cp, "%g", value.f); + cp += sprintf (cp, "%g", value->f); else { + int width = var_get_width (v); + int mv_width = MIN (width, MV_MAX_STRING); + *cp++ = '"'; - memcpy (cp, value.s, var_get_width (v)); - cp += var_get_width (v); + memcpy (cp, value_str (value, width), mv_width); + cp += mv_width; *cp++ = '"'; *cp = '\0'; } @@ -628,9 +635,10 @@ describe_variable (const struct variable *v, struct tab_table *t, int r, if (flags & DF_VALUE_LABELS && var_has_value_labels (v)) { const struct val_labs *val_labs = var_get_value_labels (v); - struct val_labs_iterator *i; - struct val_lab *vl; + size_t n_labels = val_labs_count (val_labs); + const struct val_lab **labels; int orig_r = r; + size_t i; #if 0 tab_text (t, 1, r, TAB_LEFT, _("Value")); @@ -639,23 +647,27 @@ describe_variable (const struct variable *v, struct tab_table *t, int r, #endif tab_hline (t, TAL_1, 1, 2, r); - for (vl = val_labs_first_sorted (val_labs, &i); vl != NULL; - vl = val_labs_next (val_labs, &i)) + + labels = val_labs_sorted (val_labs); + for (i = 0; i < n_labels; i++) { - char buf[128]; + const struct val_lab *vl = labels[i]; + char buf[MAX_STRING + 1]; if (var_is_alpha (v)) { - memcpy (buf, vl->value.s, var_get_width (v)); - buf[var_get_width (v)] = 0; + int width = var_get_width (v); + memcpy (buf, value_str (&vl->value, width), width); + buf[width] = 0; } else sprintf (buf, "%g", vl->value.f); tab_text (t, 1, r, TAB_NONE, buf); - tab_text (t, 2, r, TAB_LEFT, vl->label); + tab_text (t, 2, r, TAB_LEFT, val_lab_get_label (vl)); r++; } + free (labels); tab_vline (t, TAL_1, 2, orig_r, r - 1); } @@ -706,8 +718,8 @@ display_vectors (const struct dictionary *dict, int sorted) t = tab_create (4, nrow + 1, 0); tab_headers (t, 0, 0, 1, 0); - tab_columns (t, TAB_COL_DOWN, 1); - tab_dim (t, tab_natural_dimensions); + tab_columns (t, TAB_COL_DOWN); + tab_dim (t, tab_natural_dimensions, NULL, NULL); tab_box (t, TAL_1, TAL_1, -1, -1, 0, 0, 3, nrow); tab_box (t, -1, -1, -1, TAL_1, 0, 0, 3, nrow); tab_hline (t, TAL_2, 0, 3, 1);