X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flist.q;h=f595dc0c26fabf3f305c606593f4074090728891;hb=d7b5d9144738a5a8989d45a01f4e458a78b68c0b;hp=0ab9188955cdc91bbf9c94b811bfd008ffcd5ebd;hpb=06f9ee45954e5e71fa7f6262dbf37defa1dbf996;p=pspp diff --git a/src/list.q b/src/list.q index 0ab9188955..f595dc0c26 100644 --- a/src/list.q +++ b/src/list.q @@ -14,8 +14,8 @@ 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 "error.h" @@ -25,18 +25,25 @@ #include "case.h" #include "command.h" #include "devind.h" +#include "dictionary.h" #include "lexer.h" #include "error.h" #include "magic.h" #include "misc.h" #include "htmlP.h" #include "output.h" +#include "size_max.h" #include "som.h" #include "tab.h" #include "var.h" #include "vfm.h" #include "format.h" +#include "gettext.h" +#define _(msgid) gettext (msgid) + +/* (headers) */ + #include "debug-print.h" /* (specification) @@ -54,8 +61,8 @@ struct list_ext { int type; /* 0=Values and labels fit across the page. */ - int n_vertical; /* Number of labels to list vertically. */ - int header_rows; /* Number of header rows. */ + size_t n_vertical; /* Number of labels to list vertically. */ + size_t header_rows; /* Number of header rows. */ char **header; /* The header itself. */ }; @@ -69,8 +76,8 @@ static int case_idx; static char *line_buf; /* TTY-style output functions. */ -static int n_lines_remaining (struct outp_driver *d); -static int n_chars_width (struct outp_driver *d); +static unsigned n_lines_remaining (struct outp_driver *d); +static unsigned n_chars_width (struct outp_driver *d); static void write_line (struct outp_driver *d, char *s); /* Other functions. */ @@ -82,7 +89,7 @@ static void write_all_headers (void *); /* Returns the number of text lines that can fit on the remainder of the page. */ -static inline int +static inline unsigned n_lines_remaining (struct outp_driver *d) { int diff; @@ -93,7 +100,7 @@ n_lines_remaining (struct outp_driver *d) /* Returns the number of fixed-width character that can fit across the page. */ -static inline int +static inline unsigned n_chars_width (struct outp_driver *d) { return d->width / d->fixed_width; @@ -175,7 +182,7 @@ cmd_list (void) { if (dict_get_weight (default_dict) != NULL) { - int i; + size_t i; for (i = 0; i < cmd.n_variables; i++) if (cmd.v_variables[i] == dict_get_weight (default_dict)) @@ -184,9 +191,8 @@ cmd_list (void) { /* Add the weight variable to the end of the variable list. */ cmd.n_variables++; - cmd.v_variables = xrealloc (cmd.v_variables, - (cmd.n_variables - * sizeof *cmd.v_variables)); + cmd.v_variables = xnrealloc (cmd.v_variables, cmd.n_variables, + sizeof *cmd.v_variables); cmd.v_variables[cmd.n_variables - 1] = dict_get_weight (default_dict); } @@ -202,14 +208,14 @@ cmd_list (void) strcpy (casenum_var.name, "Case#"); casenum_var.type = NUMERIC; casenum_var.fv = -1; - casenum_var.print.type = FMT_F; - casenum_var.print.w = (cmd.last == LONG_MAX ? 5 : intlog10 (cmd.last)); - casenum_var.print.d = 0; + casenum_var.print = make_output_format (FMT_F, + (cmd.last == LONG_MAX + ? 5 : intlog10 (cmd.last)), 0); /* Add the weight variable at the beginning of the variable list. */ cmd.n_variables++; - cmd.v_variables = xrealloc (cmd.v_variables, - cmd.n_variables * sizeof *cmd.v_variables); + cmd.v_variables = xnrealloc (cmd.v_variables, + cmd.n_variables, sizeof *cmd.v_variables); memmove (&cmd.v_variables[1], &cmd.v_variables[0], (cmd.n_variables - 1) * sizeof *cmd.v_variables); cmd.v_variables[0] = &casenum_var; @@ -255,7 +261,7 @@ write_all_headers (void *aux UNUSED) fputs ("\n \n", x->file.file); { - int i; + size_t i; for (i = 0; i < cmd.n_variables; i++) fprintf (x->file.file, " \n", @@ -292,10 +298,11 @@ write_header (struct outp_driver *d) /* Design the header. */ if (!prc->header) { - int i, x; - + size_t i; + size_t x; + /* Allocate, initialize header. */ - prc->header = xmalloc (sizeof (char *) * prc->header_rows); + prc->header = xnmalloc (prc->header_rows, sizeof *prc->header); { int w = n_chars_width (d); for (i = 0; i < prc->header_rows; i++) @@ -309,11 +316,11 @@ write_header (struct outp_driver *d) for (i = x = 0; i < prc->n_vertical; i++) { struct variable *v = cmd.v_variables[i]; - int j; + size_t j; memset (&prc->header[prc->header_rows - 1][x], '-', v->print.w); x += v->print.w - 1; - for (j = 0; j < (int) strlen (v->name); j++) + for (j = 0; j < strlen (v->name); j++) prc->header[strlen (v->name) - j - 1][x] = v->name[j]; x += 2; } @@ -345,13 +352,14 @@ write_header (struct outp_driver *d) } /* Write out the header, in back-to-front order except for the last line. */ - { - int i; - - for (i = prc->header_rows - 2; i >= 0; i--) - write_line (d, prc->header[i]); - write_line (d, prc->header[prc->header_rows - 1]); - } + if (prc->header_rows >= 2) + { + size_t i; + + for (i = prc->header_rows - 1; i-- != 0; ) + write_line (d, prc->header[i]); + } + write_line (d, prc->header[prc->header_rows - 1]); } @@ -365,7 +373,7 @@ clean_up (void) if (d->class->special == 0) { struct list_ext *prc = d->prc; - int i; + size_t i; if (prc->header) { @@ -513,10 +521,11 @@ determine_layout (void) for (d = outp_drivers (NULL); d; d = outp_drivers (d)) { - int column; /* Current column. */ + size_t column; /* Current column. */ int width; /* Accumulated width. */ + int height; /* Height of vertical names. */ int max_width; /* Page width. */ - + struct list_ext *prc; if (d->class == &html_class) @@ -555,19 +564,24 @@ determine_layout (void) } /* Try layout #2. */ - for (width = cmd.n_variables - 1, column = 0; + for (width = cmd.n_variables - 1, height = 0, column = 0; column < cmd.n_variables && width <= max_width; - column++) - width += cmd.v_variables[column]->print.w; + column++) + { + struct variable *v = cmd.v_variables[column]; + width += v->print.w; + if (strlen (v->name) > height) + height = strlen (v->name); + } /* If it fit then we need to determine how many labels can be written horizontally. */ - if (width <= max_width) + if (width <= max_width && height <= SHORT_NAME_LEN) { #ifndef NDEBUG - prc->n_vertical = -1; + prc->n_vertical = SIZE_MAX; #endif - for (column = cmd.n_variables - 1; column >= 0; column--) + for (column = cmd.n_variables; column-- != 0; ) { struct variable *v = cmd.v_variables[column]; int trial_width = (width - v->print.w @@ -580,7 +594,7 @@ determine_layout (void) } width = trial_width; } - assert(prc->n_vertical != -1); + assert (prc->n_vertical != SIZE_MAX); prc->n_vertical = cmd.n_variables; /* Finally determine the length of the headers. */ @@ -588,7 +602,7 @@ determine_layout (void) column < prc->n_vertical; column++) prc->header_rows = max (prc->header_rows, - (int) strlen (cmd.v_variables[column]->name)); + strlen (cmd.v_variables[column]->name)); prc->header_rows++; d->class->text_set_font_by_name (d, "FIXED");
%s