X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Flist.q;h=c2f3cd61e3e95b3bae92cd6cab2e5bceb6cbe358;hb=db5df54124af56dc1dfce71f839d78da2b49e346;hp=3480efb2efb533f1d7e7d3b64964bdab65eb70ba;hpb=4fdeb2145d081ff1b84e3f6c99f9d1c048c0d64a;p=pspp
diff --git a/src/list.q b/src/list.q
index 3480efb2ef..c2f3cd61e3 100644
--- a/src/list.q
+++ b/src/list.q
@@ -24,7 +24,6 @@
#include "alloc.h"
#include "case.h"
#include "command.h"
-#include "devind.h"
#include "dictionary.h"
#include "lexer.h"
#include "error.h"
@@ -32,11 +31,16 @@
#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"
@@ -56,8 +60,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. */
};
@@ -71,8 +75,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. */
@@ -84,7 +88,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;
@@ -95,7 +99,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;
@@ -177,7 +181,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))
@@ -186,9 +190,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);
}
@@ -204,14 +207,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;
@@ -257,7 +260,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, " %s | \n",
@@ -266,10 +269,6 @@ write_all_headers (void *aux UNUSED)
fputs ("
\n", x->file.file);
}
- else if (d->class == &devind_class)
- {
- /* FIXME */
- }
else
assert (0);
}
@@ -294,10 +293,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++)
@@ -311,11 +311,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;
}
@@ -347,13 +347,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]);
}
@@ -367,7 +368,7 @@ clean_up (void)
if (d->class->special == 0)
{
struct list_ext *prc = d->prc;
- int i;
+ size_t i;
if (prc->header)
{
@@ -388,10 +389,6 @@ clean_up (void)
fputs ("
\n", x->file.file);
}
}
- else if (d->class == &devind_class)
- {
- /* FIXME */
- }
else
assert (0);
@@ -515,20 +512,15 @@ 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)
continue;
- else if (d->class == &devind_class)
- {
- /* FIXME */
- tab_output_text (TAT_NONE, "(devind not supported on LIST yet)");
- continue;
- }
assert (d->class->special == 0);
@@ -557,19 +549,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
@@ -582,7 +579,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. */
@@ -590,7 +587,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");
@@ -713,10 +710,6 @@ list_cases (struct ccase *c, void *aux UNUSED)
fputs (" \n", x->file.file);
}
- else if (d->class == &devind_class)
- {
- /* FIXME */
- }
else
assert (0);