X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fsysfile-info.c;h=c12bd10081ef35b2941813ebaecc8f69dec4d8a1;hb=53ceff2865473a6b561b521986fafd31a993a1a6;hp=584db1430da30c212f7681ac3464ad05e2892beb;hpb=34627f7c652068280cc334829d1371b672d3b184;p=pspp diff --git a/src/sysfile-info.c b/src/sysfile-info.c index 584db1430d..c12bd10081 100644 --- a/src/sysfile-info.c +++ b/src/sysfile-info.c @@ -14,28 +14,32 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ #include -#include +#include "error.h" #include #include #include "algorithm.h" #include "alloc.h" #include "command.h" +#include "dictionary.h" #include "error.h" #include "file-handle.h" #include "hash.h" #include "lexer.h" +#include "magic.h" #include "misc.h" #include "output.h" -#include "sfm.h" +#include "sfm-read.h" #include "som.h" #include "tab.h" #include "value-labels.h" #include "var.h" -#include "vector.h" + +#include "gettext.h" +#define _(msgid) gettext (msgid) /* Constants for DISPLAY utility. */ enum @@ -49,7 +53,7 @@ enum AS_VECTOR }; -int describe_variable (struct variable *v, struct tab_table *t, int r, int as); +static int describe_variable (struct variable *v, struct tab_table *t, int r, int as); /* Sets the widths of all the columns and heights of all the rows in table T for driver D. */ @@ -74,55 +78,61 @@ cmd_sysfile_info (void) struct file_handle *h; struct dictionary *d; struct tab_table *t; - struct sfm_read_info inf; + struct sfm_reader *reader; + struct sfm_read_info info; int r, nr; int i; - lex_match_id ("SYSFILE"); - lex_match_id ("INFO"); - lex_match_id ("FILE"); lex_match ('='); - h = fh_parse_file_handle (); + h = fh_parse (FH_REF_FILE); if (!h) return CMD_FAILURE; - d = sfm_read_dictionary (h, &inf); - fh_close_handle (h); - if (!d) + reader = sfm_open_reader (h, &d, &info); + if (!reader) return CMD_FAILURE; + sfm_close_reader (reader); t = tab_create (2, 9, 0); tab_vline (t, TAL_1 | TAL_SPACING, 1, 0, 8); tab_text (t, 0, 0, TAB_LEFT, _("File:")); - tab_text (t, 1, 0, TAB_LEFT, fh_handle_filename (h)); + tab_text (t, 1, 0, TAB_LEFT, fh_get_filename (h)); tab_text (t, 0, 1, TAB_LEFT, _("Label:")); - tab_text (t, 1, 1, TAB_LEFT, - d->label ? d->label : _("No label.")); + { + const char *label = dict_get_label (d); + if (label == NULL) + label = _("No label."); + tab_text (t, 1, 1, TAB_LEFT, label); + } tab_text (t, 0, 2, TAB_LEFT, _("Created:")); tab_text (t, 1, 2, TAB_LEFT | TAT_PRINTF, "%s %s by %s", - inf.creation_date, inf.creation_time, inf.product); + info.creation_date, info.creation_time, info.product); tab_text (t, 0, 3, TAB_LEFT, _("Endian:")); - tab_text (t, 1, 3, TAB_LEFT, inf.bigendian ? _("Big.") : _("Little.")); + tab_text (t, 1, 3, TAB_LEFT, info.big_endian ? _("Big.") : _("Little.")); tab_text (t, 0, 4, TAB_LEFT, _("Variables:")); tab_text (t, 1, 4, TAB_LEFT | TAT_PRINTF, "%d", - d->nvar); + dict_get_var_cnt (d)); tab_text (t, 0, 5, TAB_LEFT, _("Cases:")); tab_text (t, 1, 5, TAB_LEFT | TAT_PRINTF, - inf.ncases == -1 ? _("Unknown") : "%d", inf.ncases); + info.case_cnt == -1 ? _("Unknown") : "%d", info.case_cnt); tab_text (t, 0, 6, TAB_LEFT, _("Type:")); tab_text (t, 1, 6, TAB_LEFT, _("System File.")); tab_text (t, 0, 7, TAB_LEFT, _("Weight:")); - tab_text (t, 1, 7, TAB_LEFT, - d->weight_var[0] ? d->weight_var : _("Not weighted.")); + { + struct variable *weight_var = dict_get_weight (d); + tab_text (t, 1, 7, TAB_LEFT, + weight_var != NULL ? weight_var->name : _("Not weighted.")); + } tab_text (t, 0, 8, TAB_LEFT, _("Mode:")); tab_text (t, 1, 8, TAB_LEFT | TAT_PRINTF, - _("Compression %s."), inf.compressed ? _("on") : _("off")); + _("Compression %s."), info.compressed ? _("on") : _("off")); tab_dim (t, tab_natural_dimensions); tab_submit (t); - nr = 1 + 2 * d->nvar; + nr = 1 + 2 * dict_get_var_cnt (d); + t = tab_create (4, nr, 1); tab_dim (t, sysfile_info_dim); tab_headers (t, 0, 0, 1, 0); @@ -130,28 +140,30 @@ cmd_sysfile_info (void) tab_joint_text (t, 1, 0, 2, 0, TAB_LEFT | TAT_TITLE, _("Description")); tab_text (t, 3, 0, TAB_LEFT | TAT_TITLE, _("Position")); tab_hline (t, TAL_2, 0, 3, 1); - for (r = 1, i = 0; i < d->nvar; i++) + for (r = 1, i = 0; i < dict_get_var_cnt (d); i++) { - int nvl = val_labs_count (d->var[i]->val_labs); + struct variable *v = dict_get_var (d, i); + const int nvl = val_labs_count (v->val_labs); if (r + 10 + nvl > nr) { - nr = max (nr * d->nvar / (i + 1), nr); + nr = max (nr * dict_get_var_cnt (d) / (i + 1), nr); nr += 10 + nvl; tab_realloc (t, 4, nr); } - r = describe_variable (d->var[i], t, r, AS_DICTIONARY); + r = describe_variable (v, t, r, AS_DICTIONARY); } + tab_box (t, TAL_1, TAL_1, -1, -1, 0, 0, 3, r); - tab_vline (t, TAL_1, 0, 0, r); tab_vline (t, TAL_1, 1, 0, r); tab_vline (t, TAL_1, 3, 0, r); + tab_resize (t, -1, r); tab_flags (t, SOMF_NO_TITLE); tab_submit (t); - free_dictionary (d); + dict_destroy (d); return lex_end_of_command (); } @@ -160,7 +172,7 @@ cmd_sysfile_info (void) static void display_macros (void); static void display_documents (void); -static void display_variables (struct variable **, int, int); +static void display_variables (struct variable **, size_t, int); static void display_vectors (int sorted); int @@ -170,11 +182,9 @@ cmd_display (void) int sorted; /* Variables to display. */ - int n; + size_t n; struct variable **vl; - lex_match_id ("DISPLAY"); - if (lex_match_id ("MACROS")) display_macros (); else if (lex_match_id ("DOCUMENTS")) @@ -184,13 +194,13 @@ cmd_display (void) som_blank_line (); if (!lex_force_match_id ("LABEL")) return CMD_FAILURE; - if (default_dict.label == NULL) + if (dict_get_label (default_dict) == NULL) tab_output_text (TAB_LEFT, _("The active file does not have a file label.")); else { tab_output_text (TAB_LEFT | TAT_TITLE, _("File label:")); - tab_output_text (TAB_LEFT | TAT_FIX, default_dict.label); + tab_output_text (TAB_LEFT | TAT_FIX, dict_get_label (default_dict)); } } else @@ -226,7 +236,7 @@ cmd_display (void) if (token != '.') { - if (!parse_variables (NULL, &vl, &n, PV_NONE)) + if (!parse_variables (default_dict, &vl, &n, PV_NONE)) { free (vl); return CMD_FAILURE; @@ -234,13 +244,13 @@ cmd_display (void) as = AS_DICTIONARY; } else - fill_all_vars (&vl, &n, FV_NONE); + dict_get_vars (default_dict, &vl, &n, 0); if (as == AS_SCRATCH) { - int i, m; + size_t i, m; for (i = 0, m = n; i < n; i++) - if (vl[i]->name[0] != '#') + if (dict_class_from_id (vl[i]->name) != DC_SCRATCH) { vl[i] = NULL; m--; @@ -256,7 +266,7 @@ cmd_display (void) } if (sorted) - sort (vl, n, sizeof *vl, compare_variables, NULL); + sort (vl, n, sizeof *vl, compare_var_names, NULL); display_variables (vl, n, as); @@ -276,24 +286,27 @@ display_macros (void) static void display_documents (void) { + const char *documents = dict_get_documents (default_dict); + som_blank_line (); - if (default_dict.n_documents == 0) + if (documents == NULL) tab_output_text (TAB_LEFT, _("The active file dictionary does not " - "contain any documents.")); + "contain any documents.")); else { + size_t n_lines = strlen (documents) / 80; char buf[81]; - int i; + size_t i; tab_output_text (TAB_LEFT | TAT_TITLE, _("Documents in the active file:")); som_blank_line (); buf[80] = 0; - for (i = 0; i < default_dict.n_documents; i++) + for (i = 0; i < n_lines; i++) { int len = 79; - memcpy (buf, &default_dict.documents[i * 80], 80); + memcpy (buf, &documents[i * 80], 80); while ((isspace ((unsigned char) buf[len]) || buf[len] == 0) && len > 0) len--; @@ -329,7 +342,7 @@ variables_dim (struct tab_table *t, struct outp_driver *d) } static void -display_variables (struct variable **vl, int n, int as) +display_variables (struct variable **vl, size_t n, int as) { struct variable **vp = vl; /* Variable pointer. */ struct tab_table *t; @@ -337,7 +350,7 @@ display_variables (struct variable **vl, int n, int as) int nr; /* Number of rows. */ int pc; /* `Position column' */ int r; /* Current row. */ - int i; + size_t i; _as = as; switch (as) @@ -358,11 +371,9 @@ display_variables (struct variable **vl, int n, int as) nr = n + 5; tab_hline (t, TAL_2, 0, nc - 1, 1); tab_text (t, 0, 0, TAB_LEFT | TAT_TITLE, _("Variable")); + pc = (as == AS_INDEX ? 1 : 3); if (as != AS_NAMES) - { - pc = (as == AS_INDEX ? 1 : 3); - tab_text (t, pc, 0, TAB_LEFT | TAT_TITLE, _("Position")); - } + tab_text (t, pc, 0, TAB_LEFT | TAT_TITLE, _("Position")); if (as == AS_DICTIONARY || as == AS_VARIABLES) tab_joint_text (t, 1, 0, 2, 0, TAB_LEFT | TAT_TITLE, _("Description")); else if (as == AS_LABELS) @@ -420,7 +431,7 @@ display_variables (struct variable **vl, int n, int as) /* Puts a description of variable V into table T starting at row R. The variable will be described in the format AS. Returns the next row available for use in the table. */ -int +static int describe_variable (struct variable *v, struct tab_table *t, int r, int as) { /* Put the name, var label, and position into the first row. */ @@ -453,63 +464,44 @@ describe_variable (struct variable *v, struct tab_table *t, int r, int as) } /* Missing values if any. */ - if (v->miss_type != MISSING_NONE) + if (!mv_is_empty (&v->miss)) { - char buf[80]; - char *cp = stpcpy (buf, _("Missing Values: ")); - - if (v->type == NUMERIC) - switch (v->miss_type) - { - case MISSING_1: - sprintf (cp, "%g", v->missing[0].f); - break; - case MISSING_2: - sprintf (cp, "%g; %g", v->missing[0].f, v->missing[1].f); - break; - case MISSING_3: - sprintf (cp, "%g; %g; %g", v->missing[0].f, - v->missing[1].f, v->missing[2].f); - break; - case MISSING_RANGE: - sprintf (cp, "%g THRU %g", v->missing[0].f, v->missing[1].f); - break; - case MISSING_LOW: - sprintf (cp, "LOWEST THRU %g", v->missing[0].f); - break; - case MISSING_HIGH: - sprintf (cp, "%g THRU HIGHEST", v->missing[0].f); - break; - case MISSING_RANGE_1: - sprintf (cp, "%g THRU %g; %g", - v->missing[0].f, v->missing[1].f, v->missing[2].f); - break; - case MISSING_LOW_1: - sprintf (cp, "LOWEST THRU %g; %g", - v->missing[0].f, v->missing[1].f); - break; - case MISSING_HIGH_1: - sprintf (cp, "%g THRU HIGHEST; %g", - v->missing[0].f, v->missing[1].f); - break; - default: - assert (0); - } - else - { - int i; - - for (i = 0; i < v->miss_type; i++) - { - if (i != 0) - cp = stpcpy (cp, "; "); - *cp++ = '"'; - memcpy (cp, v->missing[i].s, v->width); + char buf[128]; + char *cp; + struct missing_values mv; + int cnt = 0; + + cp = stpcpy (buf, _("Missing Values: ")); + mv_copy (&mv, &v->miss); + if (mv_has_range (&mv)) + { + double x, y; + mv_pop_range (&mv, &x, &y); + if (x == LOWEST) + cp += nsprintf (cp, "LOWEST THRU %g", y); + else if (y == HIGHEST) + cp += nsprintf (cp, "%g THRU HIGHEST", x); + else + cp += nsprintf (cp, "%g THRU %g", x, y); + cnt++; + } + while (mv_has_value (&mv)) + { + union value value; + mv_pop_value (&mv, &value); + if (cnt++ > 0) + cp += nsprintf (cp, "; "); + if (v->type == NUMERIC) + cp += nsprintf (cp, "%g", value.f); + else + { + *cp++ = '"'; + memcpy (cp, value.s, v->width); cp += v->width; *cp++ = '"'; - } - *cp = 0; - } + *cp = '\0'; + } + } tab_joint_text (t, 1, r, 2, r, TAB_LEFT, buf); r++; @@ -564,7 +556,7 @@ compare_vectors_by_name (const void *a_, const void *b_) struct vector *a = *pa; struct vector *b = *pb; - return strcmp (a->name, b->name); + return strcasecmp (a->name, b->name); } /* Display a list of vectors. If SORTED is nonzero then they are @@ -572,19 +564,21 @@ compare_vectors_by_name (const void *a_, const void *b_) static void display_vectors (int sorted) { - struct vector **vl; + const struct vector **vl; int i; struct tab_table *t; - + size_t nvec; + + nvec = dict_get_vector_cnt (default_dict); if (nvec == 0) { msg (SW, _("No vectors defined.")); return; } - vl = xmalloc (sizeof *vl * nvec); + vl = xnmalloc (nvec, sizeof *vl); for (i = 0; i < nvec; i++) - vl[i] = &vec[i]; + vl[i] = dict_get_vector (default_dict, i); if (sorted) qsort (vl, nvec, sizeof *vl, compare_vectors_by_name); @@ -601,3 +595,14 @@ display_vectors (int sorted) free (vl); } + + + + + + + + + + +