X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Ftable.c;h=a6e9f66f80e8b4e90d1e57fc94aeb4bafe2f6c91;hb=164d1274fcb70c54897f2a03fc7c27152ed4821a;hp=eac8d90f186b9d2b7d13dfe628e1b34800183834;hpb=52b9fca3a729eaef7d13469029e4391aa033a659;p=pspp-builds.git diff --git a/src/output/table.c b/src/output/table.c index eac8d90f..a6e9f66f 100644 --- a/src/output/table.c +++ b/src/output/table.c @@ -1,6 +1,5 @@ /* PSPP - computes sample statistics. - Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. - Written by Ben Pfaff . + Copyright (C) 1997-9, 2000, 2006 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 @@ -18,26 +17,33 @@ 02110-1301, USA. */ #include + #include "table.h" + #include #include #include #include + +#include "output.h" +#include "manager.h" + +#include +#include +#include #include +#include #include -#include #include #include -#include "minmax.h" -#include "output.h" #include -#include "manager.h" -#include + +#include "minmax.h" #include "gettext.h" #define _(msgid) gettext (msgid) -struct som_table_class tab_table_class; +const struct som_table_class tab_table_class; static char *command_name; /* Returns the font to use for a cell with the given OPTIONS. */ @@ -58,7 +64,7 @@ tab_create (int nc, int nr, int reallocable UNUSED) t = pool_create_container (struct tab_table, container); t->col_style = TAB_COL_NONE; t->col_group = 0; - ls_null (&t->title); + t->title = NULL; t->flags = SOMF_NONE; t->nr = nr; t->nc = t->cf = nc; @@ -71,15 +77,9 @@ tab_create (int nc, int nr, int reallocable UNUSED) t->rh = pool_nmalloc (t->container, nc, nr + 1); memset (t->rh, 0, nc * (nr + 1)); - t->hrh = pool_nmalloc (t->container, nr + 1, sizeof *t->hrh); - memset (t->hrh, 0, sizeof *t->hrh * (nr + 1)); - t->rv = pool_nmalloc (t->container, nr, nc + 1); memset (t->rv, UCHAR_MAX, nr * (nc + 1)); - t->wrv = pool_nmalloc (t->container, nc + 1, sizeof *t->wrv); - memset (t->wrv, 0, sizeof *t->wrv * (nc + 1)); - t->dim = NULL; t->w = t->h = NULL; t->col_ofs = t->row_ofs = 0; @@ -92,6 +92,7 @@ void tab_destroy (struct tab_table *t) { assert (t != NULL); + free (t->title); pool_destroy (t->container); } @@ -140,10 +141,10 @@ tab_realloc (struct tab_table *t, int nc, int nr) if (nc > t->cf) { - int mr1 = min (nr, t->nr); - int mc1 = min (nc, t->nc); + int mr1 = MIN (nr, t->nr); + int mc1 = MIN (nc, t->nc); - struct fixed_string *new_cc; + struct substring *new_cc; unsigned char *new_ct; int r; @@ -311,7 +312,7 @@ tab_box (struct tab_table *t, int f_h, int f_v, int i_h, int i_v, x2, t->col_ofs, x2 + t->col_ofs, y2, t->row_ofs, y2 + t->row_ofs, t->nc, t->nr); - abort (); + NOT_REACHED (); } #endif @@ -372,23 +373,16 @@ tab_box (struct tab_table *t, int f_h, int f_v, int i_h, int i_v, } } -/* Formats text TEXT and arguments ARGS as indicated in OPT and sets - the resultant string into S in TABLE's pool. */ -static void -text_format (struct tab_table *table, int opt, const char *text, va_list args, - struct fixed_string *s) +/* Formats text TEXT and arguments ARGS as indicated in OPT in + TABLE's pool and returns the resultant string. */ +static struct substring +text_format (struct tab_table *table, int opt, const char *text, va_list args) { - char *tmp = NULL; - - assert (table != NULL && text != NULL && s != NULL); - - if (opt & TAT_PRINTF) - text = tmp = xvasprintf (text, args); + assert (table != NULL && text != NULL); - ls_create_buffer (s, text, strlen (text)); - pool_register (table->container, free, s->string); - - free (tmp); + return ss_cstr (opt & TAT_PRINTF + ? pool_vasprintf (table->container, text, args) + : pool_strdup (table->container, text)); } /* Set the title of table T to TITLE, which is formatted as if @@ -400,7 +394,7 @@ tab_title (struct tab_table *t, const char *title, ...) assert (t != NULL && title != NULL); va_start (args, title); - text_format (t, TAT_PRINTF, title, args, &t->title); + t->title = xvasprintf (title, args); va_end (args); } @@ -435,7 +429,6 @@ tab_natural_width (struct tab_table *t, struct outp_driver *d, int c) continue; text.string = t->cc[c + r * t->cf]; - assert (!ls_null_p (&text.string)); text.justification = OUTP_LEFT; text.font = options_to_font (opt); text.h = text.v = INT_MAX; @@ -448,10 +441,10 @@ tab_natural_width (struct tab_table *t, struct outp_driver *d, int c) if (width == 0) { - width = d->prop_em_width * 8; -#if DEBUGGING - printf ("warning: table column %d contains no data.\n", c); -#endif + /* FIXME: This is an ugly kluge to compensate for the fact + that we don't let joined cells contribute to column + widths. */ + width = d->prop_em_width * 8; } { @@ -488,7 +481,6 @@ tab_natural_height (struct tab_table *t, struct outp_driver *d, int r) continue; text.string = t->cc[c + r * t->cf]; - assert (!ls_null_p (&text.string)); text.justification = OUTP_LEFT; text.font = options_to_font (opt); text.h = t->w[c]; @@ -546,10 +538,10 @@ tab_value (struct tab_table *table, int c, int r, unsigned char opt, #endif contents = pool_alloc (table->container, f->w); - ls_init (&table->cc[c + r * table->cf], contents, f->w); + table->cc[c + r * table->cf] = ss_buffer (contents, f->w); table->ct[c + r * table->cf] = opt; - data_out (contents, f, v); + data_out (v, f, contents); } /* Sets cell (C,R) in TABLE, with options OPT, to have value VAL @@ -571,7 +563,7 @@ tab_float (struct tab_table *table, int c, int r, unsigned char opt, assert (r >= 0); assert (r < table->nr); - f = make_output_format (FMT_F, w, d); + f = fmt_for_output (FMT_F, w, d); #if DEBUGGING if (c + table->col_ofs < 0 || r + table->row_ofs < 0 @@ -588,7 +580,7 @@ tab_float (struct tab_table *table, int c, int r, unsigned char opt, #endif double_value.f = val; - data_out (buf, &f, &double_value); + data_out (&double_value, &f, buf); cp = buf; while (isspace ((unsigned char) *cp) && cp < &buf[w]) @@ -596,7 +588,7 @@ tab_float (struct tab_table *table, int c, int r, unsigned char opt, f.w = w - (cp - buf); contents = pool_alloc (table->container, f.w); - ls_init (&table->cc[c + r * table->cf], contents, f.w); + table->cc[c + r * table->cf] = ss_buffer (contents, f.w); table->ct[c + r * table->cf] = opt; memcpy (contents, cp, f.w); } @@ -631,7 +623,7 @@ tab_text (struct tab_table *table, int c, int r, unsigned opt, const char *text, #endif va_start (args, text); - text_format (table, opt, text, args, &table->cc[c + r * table->cf]); + table->cc[c + r * table->cf] = text_format (table, opt, text, args); table->ct[c + r * table->cf] = opt; va_end (args); } @@ -683,14 +675,14 @@ tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2, va_list args; va_start (args, text); - text_format (table, opt, text, args, &j->contents); + j->contents = text_format (table, opt, text, args); va_end (args); } opt |= TAB_JOIN; { - struct fixed_string *cc = &table->cc[x1 + y1 * table->cf]; + struct substring *cc = &table->cc[x1 + y1 * table->cf]; unsigned char *ct = &table->ct[x1 + y1 * table->cf]; const int ofs = table->cf - (x2 - x1); @@ -702,7 +694,7 @@ tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2, for (x = x1; x < x2; x++) { - ls_init (cc++, (char *) j, 0); + *cc++ = ss_buffer ((char *) j, 0); *ct++ = opt; } @@ -715,7 +707,7 @@ tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2, /* Sets cell (C,R) in TABLE, with options OPT, to contents STRING. */ void tab_raw (struct tab_table *table, int c, int r, unsigned opt, - struct fixed_string *string) + struct substring *string) { assert (table != NULL && string != NULL); @@ -816,15 +808,15 @@ tab_offset (struct tab_table *t, int col, int row) assert (t != NULL); #if DEBUGGING - if (row < -1 || row >= t->nr) + if (row < -1 || row > t->nr) { printf ("tab_offset(): row=%d in %d-row table\n", row, t->nr); - abort (); + NOT_REACHED (); } - if (col < -1 || col >= t->nc) + if (col < -1 || col > t->nc) { printf ("tab_offset(): col=%d in %d-column table\n", col, t->nc); - abort (); + NOT_REACHED (); } #endif @@ -851,7 +843,7 @@ tab_next_row (struct tab_table *t) static struct tab_table *t; static struct outp_driver *d; -int tab_hit; +static int tab_hit; /* Set the current table to TABLE. */ static void @@ -866,6 +858,8 @@ tabi_table (struct som_entity *table) assert (t->w == NULL && t->h == NULL); t->w = pool_nalloc (t->container, t->nc, sizeof *t->w); t->h = pool_nalloc (t->container, t->nr, sizeof *t->h); + t->hrh = pool_nmalloc (t->container, t->nr + 1, sizeof *t->hrh); + t->wrv = pool_nmalloc (t->container, t->nc + 1, sizeof *t->wrv); } /* Returns the line style to use for spacing purposes for a rule @@ -883,7 +877,7 @@ rule_to_spacing_type (unsigned char type) case TAL_2: return OUTP_L_DOUBLE; default: - abort (); + NOT_REACHED (); } } @@ -1169,10 +1163,11 @@ tabi_title (int x, int y) if (command_name != NULL) cp = spprintf (cp, " %s", command_name); cp = stpcpy (cp, ". "); - if (!ls_empty_p (&t->title)) + if (t->title != NULL) { - memcpy (cp, ls_c_str (&t->title), ls_length (&t->title)); - cp += ls_length (&t->title); + size_t length = strlen (t->title); + memcpy (cp, t->title, length); + cp += length; } *cp = 0; @@ -1181,7 +1176,7 @@ tabi_title (int x, int y) text.font = OUTP_PROPORTIONAL; text.justification = OUTP_LEFT; - ls_init (&text.string, buf, cp - buf); + text.string = ss_buffer (buf, cp - buf); text.h = d->width; text.v = d->font_height; text.x = 0; @@ -1230,7 +1225,7 @@ tabi_render (int c0, int r0, int c1, int r1) y = render_rows (y, c0, c1, (t->nr - t->b) * 2, t->nr * 2 + 1); } -struct som_table_class tab_table_class = +const struct som_table_class tab_table_class = { tabi_table, tabi_driver, @@ -1268,7 +1263,7 @@ translate_justification (unsigned int opt) case TAB_CENTER: return OUTP_CENTER; default: - abort (); + NOT_REACHED (); } } @@ -1287,7 +1282,7 @@ rule_to_draw_type (unsigned char type) case TAL_2: return OUTP_L_DOUBLE; default: - abort (); + NOT_REACHED (); } } @@ -1393,7 +1388,7 @@ render_cell (int x, int y, int c, int r, int c1, int r1) { const int index = c + (r * t->cf); unsigned char type = t->ct[index]; - struct fixed_string *content = &t->cc[index]; + struct substring *content = &t->cc[index]; if (!(type & TAB_JOIN)) { @@ -1413,7 +1408,7 @@ render_cell (int x, int y, int c, int r, int c1, int r1) else { struct tab_joined_cell *j - = (struct tab_joined_cell *) ls_c_str (content); + = (struct tab_joined_cell *) ss_data (*content); if (j->hit != tab_hit) {