X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Ftable.c;h=5686e2bf18dd128d4d3d11bdc2572a5e48da5053;hb=2cf38ce51a9f34961d68a75e0b312a591b5c9abf;hp=a7dc4817f0f946a46fc73ce0f2713490810bbc5b;hpb=5beffdda43634370653661d5a0f5e3c75aa28747;p=pspp-builds.git diff --git a/src/output/table.c b/src/output/table.c index a7dc4817..5686e2bf 100644 --- a/src/output/table.c +++ b/src/output/table.c @@ -1,49 +1,53 @@ -/* PSPP - computes sample statistics. - Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. - Written by Ben Pfaff . +/* PSPP - a program for statistical analysis. + 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 the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. + 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. 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., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + along with this program. If not, see . */ #include + #include "table.h" + #include #include #include #include -#include + +#include "output.h" +#include "manager.h" + +#include +#include +#include #include #include -#include -#include #include -#include "minmax.h" -#include "output.h" #include -#include "manager.h" -#include + +#include + +#include "minmax.h" +#include "xalloc.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. */ static enum outp_font -options_to_font (unsigned options) +options_to_font (unsigned options) { return (options & TAB_FIX ? OUTP_FIXED : options & TAB_EMPH ? OUTP_EMPHASIS @@ -120,7 +124,7 @@ void tab_realloc (struct tab_table *t, int nc, int nr) { int ro, co; - + assert (t != NULL); ro = t->row_ofs; co = t->col_ofs; @@ -131,14 +135,14 @@ tab_realloc (struct tab_table *t, int nc, int nr) nc = t->nc; if (nr == -1) nr = t->nr; - + assert (nc == t->nc); - + 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 substring *new_cc; unsigned char *new_ct; int r; @@ -164,7 +168,7 @@ tab_realloc (struct tab_table *t, int nc, int nr) t->rh = pool_nrealloc (t->container, t->rh, nc, nr + 1); t->rv = pool_nrealloc (t->container, t->rv, nr, nc + 1); - + if (nr > t->nr) { memset (&t->rh[nc * (t->nr + 1)], TAL_0, (nr - t->nr) * nc); @@ -174,7 +178,7 @@ tab_realloc (struct tab_table *t, int nc, int nr) } memset (&t->ct[nc * t->nr], TAB_EMPTY, nc * (nr - t->nr)); - + t->nr = nr; t->nc = nc; @@ -269,7 +273,7 @@ tab_hline (struct tab_table * t, int style, int x1, int x2, int y) y += t->row_ofs; assert (y >= 0); - assert (y < t->nr); + assert (y <= t->nr); assert (x2 >= x1 ); assert (x1 >= 0 ); assert (x2 < t->nc); @@ -295,9 +299,9 @@ tab_box (struct tab_table *t, int f_h, int f_v, int i_h, int i_v, assert (t != NULL); #if DEBUGGING - if (x1 + t->col_ofs < 0 || x1 + t->col_ofs >= t->nc + if (x1 + t->col_ofs < 0 || x1 + t->col_ofs >= t->nc || x2 + t->col_ofs < 0 || x2 + t->col_ofs >= t->nc - || y1 + t->row_ofs < 0 || y1 + t->row_ofs >= t->nr + || y1 + t->row_ofs < 0 || y1 + t->row_ofs >= t->nr || y2 + t->row_ofs < 0 || y2 + t->row_ofs >= t->nr) { printf (_("bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) " @@ -345,7 +349,7 @@ tab_box (struct tab_table *t, int f_h, int f_v, int i_h, int i_v, if (i_h != -1) { int y; - + for (y = y1 + 1; y <= y2; y++) { int x; @@ -357,29 +361,17 @@ tab_box (struct tab_table *t, int f_h, int f_v, int i_h, int i_v, if (i_v != -1) { int x; - + for (x = x1 + 1; x <= x2; x++) { int y; - + for (y = y1; y <= y2; y++) t->rv[x + (t->cf + 1) * y] = i_v; } } } -/* 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) -{ - assert (table != NULL && text != NULL); - - 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 passed to printf(). */ void @@ -395,10 +387,11 @@ tab_title (struct tab_table *t, const char *title, ...) /* Set DIM_FUNC as the dimension function for table T. */ void -tab_dim (struct tab_table *t, tab_dim_func *dim_func) +tab_dim (struct tab_table *t, tab_dim_func *dim_func, void *aux) { assert (t != NULL && t->dim == NULL); t->dim = dim_func; + t->dim_aux = aux; } /* Returns the natural width of column C in table T for driver D, that @@ -419,7 +412,7 @@ tab_natural_width (struct tab_table *t, struct outp_driver *d, int c) struct outp_text text; unsigned char opt = t->ct[c + r * t->cf]; int w; - + if (opt & (TAB_JOIN | TAB_EMPTY)) continue; @@ -439,12 +432,12 @@ tab_natural_width (struct tab_table *t, struct outp_driver *d, int c) /* 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; + width = d->prop_em_width * 8; } - + { const int clamp = d->width - t->wrv[0] - t->wrv[t->nc]; - + if (width > clamp) width = clamp; } @@ -461,17 +454,16 @@ tab_natural_height (struct tab_table *t, struct outp_driver *d, int r) int height; assert (t != NULL && r >= 0 && r < t->nr); - + { int c; - + for (height = d->font_height, c = 0; c < t->nc; c++) { struct outp_text text; unsigned char opt = t->ct[c + r * t->cf]; int h; - assert (t->w[c] != NOT_INT); if (opt & (TAB_JOIN | TAB_EMPTY)) continue; @@ -493,15 +485,16 @@ tab_natural_height (struct tab_table *t, struct outp_driver *d, int r) /* Callback function to set all columns and rows to their natural dimensions. Not really meant to be called directly. */ void -tab_natural_dimensions (struct tab_table *t, struct outp_driver *d) +tab_natural_dimensions (struct tab_table *t, struct outp_driver *d, + void *aux UNUSED) { int i; assert (t != NULL); - + for (i = 0; i < t->nc; i++) t->w[i] = tab_natural_width (t, d, i); - + for (i = 0; i < t->nr; i++) t->h[i] = tab_natural_height (t, d, i); } @@ -535,37 +528,37 @@ tab_value (struct tab_table *table, int c, int r, unsigned char opt, contents = pool_alloc (table->container, 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 with NDEC decimal places. */ void -tab_float (struct tab_table *table, int c, int r, unsigned char opt, +tab_fixed (struct tab_table *table, int c, int r, unsigned char opt, double val, int w, int d) { char *contents; char buf[40], *cp; - + struct fmt_spec f; union value double_value; assert (table != NULL && w <= 40); - + assert (c >= 0); assert (c < table->nc); 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 || c + table->col_ofs >= table->nc || r + table->row_ofs >= table->nr) { - printf ("tab_float(): bad cell (%d+%d=%d,%d+%d=%d) in table size " + printf ("tab_fixed(): bad cell (%d+%d=%d,%d+%d=%d) in table size " "(%d,%d)\n", c, table->col_ofs, c + table->col_ofs, r, table->row_ofs, r + table->row_ofs, @@ -575,7 +568,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]) @@ -588,20 +581,68 @@ tab_float (struct tab_table *table, int c, int r, unsigned char opt, memcpy (contents, cp, f.w); } -/* Sets cell (C,R) in TABLE, with options OPT, to have text value - TEXT. */ +/* Sets cell (C,R) in TABLE, with options OPT, to have value VAL as + formatted by FMT. + If FMT is null, then the default print format will be used. +*/ void -tab_text (struct tab_table *table, int c, int r, unsigned opt, const char *text, ...) +tab_double (struct tab_table *table, int c, int r, unsigned char opt, + double val, const struct fmt_spec *fmt) { - va_list args; + int w; + char *contents; + char buf[40], *cp; + + union value double_value; + + assert (table != NULL); + + assert (c >= 0); + assert (c < table->nc); + assert (r >= 0); + assert (r < table->nr); + + if ( fmt == NULL) + fmt = settings_get_format (); + + fmt_check_output (fmt); + +#if DEBUGGING + if (c + table->col_ofs < 0 || r + table->row_ofs < 0 + || c + table->col_ofs >= table->nc + || r + table->row_ofs >= table->nr) + { + printf ("tab_double(): bad cell (%d+%d=%d,%d+%d=%d) in table size " + "(%d,%d)\n", + c, table->col_ofs, c + table->col_ofs, + r, table->row_ofs, r + table->row_ofs, + table->nc, table->nr); + return; + } +#endif + + double_value.f = val; + data_out (&double_value, fmt, buf); + + cp = buf; + while (isspace ((unsigned char) *cp) && cp < &buf[fmt->w]) + cp++; + w = fmt->w - (cp - buf); + + contents = pool_alloc (table->container, w); + table->cc[c + r * table->cf] = ss_buffer (contents, w); + table->ct[c + r * table->cf] = opt; + memcpy (contents, cp, w); +} - assert (table != NULL && text != NULL); - assert (c >= 0 ); - assert (r >= 0 ); +static void +do_tab_text (struct tab_table *table, int c, int r, unsigned opt, char *text) +{ + assert (c >= 0); + assert (r >= 0); assert (c < table->nc); assert (r < table->nr); - #if DEBUGGING if (c + table->col_ofs < 0 || r + table->row_ofs < 0 @@ -617,21 +658,38 @@ tab_text (struct tab_table *table, int c, int r, unsigned opt, const char *text, } #endif - va_start (args, text); - table->cc[c + r * table->cf] = text_format (table, opt, text, args); + table->cc[c + r * table->cf] = ss_cstr (text); table->ct[c + r * table->cf] = opt; - va_end (args); } -/* Joins cells (X1,X2)-(Y1,Y2) inclusive in TABLE, and sets them with - options OPT to have text value TEXT. */ +/* Sets cell (C,R) in TABLE, with options OPT, to have text value + TEXT. */ void -tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2, - unsigned opt, const char *text, ...) +tab_text (struct tab_table *table, int c, int r, unsigned opt, + const char *text) { - struct tab_joined_cell *j; + do_tab_text (table, c, r, opt, pool_strdup (table->container, text)); +} - assert (table != NULL && text != NULL); +/* Sets cell (C,R) in TABLE, with options OPT, to have text value + FORMAT, which is formatted as if passed to printf. */ +void +tab_text_format (struct tab_table *table, int c, int r, unsigned opt, + const char *format, ...) +{ + va_list args; + + va_start (args, format); + do_tab_text (table, c, r, opt, + pool_vasprintf (table->container, format, args)); + va_end (args); +} + +static void +do_tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2, + unsigned opt, char *text) +{ + struct tab_joined_cell *j; assert (x1 + table->col_ofs >= 0); assert (y1 + table->row_ofs >= 0); @@ -658,60 +716,78 @@ tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2, #endif tab_box (table, -1, -1, TAL_0, TAL_0, x1, y1, x2, y2); - + j = pool_alloc (table->container, sizeof *j); j->hit = 0; j->x1 = x1 + table->col_ofs; j->y1 = y1 + table->row_ofs; j->x2 = ++x2 + table->col_ofs; j->y2 = ++y2 + table->row_ofs; - - { - va_list args; - - va_start (args, text); - j->contents = text_format (table, opt, text, args); - va_end (args); - } - + j->contents = ss_cstr (text); + opt |= TAB_JOIN; - + { 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); int y; - + for (y = y1; y < y2; y++) { int x; - + for (x = x1; x < x2; x++) { *cc++ = ss_buffer ((char *) j, 0); *ct++ = opt; } - + cc += ofs; ct += ofs; } } } +/* Joins cells (X1,X2)-(Y1,Y2) inclusive in TABLE, and sets them with + options OPT to have text value TEXT. */ +void +tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2, + unsigned opt, const char *text) +{ + do_tab_joint_text (table, x1, y1, x2, y2, opt, + pool_strdup (table->container, text)); +} + +/* Joins cells (X1,X2)-(Y1,Y2) inclusive in TABLE, and sets them + with options OPT to have text value FORMAT, which is formatted + as if passed to printf. */ +void +tab_joint_text_format (struct tab_table *table, int x1, int y1, int x2, int y2, + unsigned opt, const char *format, ...) +{ + va_list args; + + va_start (args, format); + do_tab_joint_text (table, x1, y1, x2, y2, opt, + pool_vasprintf (table->container, format, args)); + va_end (args); +} + /* 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 substring *string) { assert (table != NULL && string != NULL); - + #if DEBUGGING if (c + table->col_ofs < 0 || r + table->row_ofs < 0 || c + table->col_ofs >= table->nc || r + table->row_ofs >= table->nr) { - printf ("tab_float(): bad cell (%d+%d=%d,%d+%d=%d) in table size " + printf ("tab_raw(): bad cell (%d+%d=%d,%d+%d=%d) in table size " "(%d,%d)\n", c, table->col_ofs, c + table->col_ofs, r, table->row_ofs, r + table->row_ofs, @@ -729,7 +805,7 @@ tab_raw (struct tab_table *table, int c, int r, unsigned opt, /* Sets the widths of all the columns and heights of all the rows in table T for driver D. */ static void -nowrap_dim (struct tab_table *t, struct outp_driver *d) +nowrap_dim (struct tab_table *t, struct outp_driver *d, void *aux UNUSED) { t->w[0] = tab_natural_width (t, d, 0); t->h[0] = d->font_height; @@ -738,36 +814,47 @@ nowrap_dim (struct tab_table *t, struct outp_driver *d) /* Sets the widths of all the columns and heights of all the rows in table T for driver D. */ static void -wrap_dim (struct tab_table *t, struct outp_driver *d) +wrap_dim (struct tab_table *t, struct outp_driver *d, void *aux UNUSED) { t->w[0] = tab_natural_width (t, d, 0); t->h[0] = tab_natural_height (t, d, 0); } -/* Outputs text BUF as a table with a single cell having cell options +static void +do_tab_output_text (struct tab_table *t, int options, char *text) +{ + do_tab_text (t, 0, 0, options, text); + tab_flags (t, SOMF_NO_TITLE | SOMF_NO_SPACING); + tab_dim (t, options & TAT_NOWRAP ? nowrap_dim : wrap_dim, NULL); + tab_submit (t); +} + +/* Outputs TEXT as a table with a single cell having cell options OPTIONS, which is a combination of the TAB_* and TAT_* - constants. */ + constants. */ void -tab_output_text (int options, const char *buf, ...) +tab_output_text (int options, const char *text) { - struct tab_table *t = tab_create (1, 1, 0); - char *tmp_buf = NULL; + struct tab_table *table = tab_create (1, 1, 0); + do_tab_output_text (table, options, pool_strdup (table->container, text)); +} - if (options & TAT_PRINTF) - { - va_list args; - - va_start (args, buf); - buf = tmp_buf = xvasprintf (buf, args); - va_end (args); - } - - tab_text (t, 0, 0, options & ~TAT_PRINTF, buf); - tab_flags (t, SOMF_NO_TITLE | SOMF_NO_SPACING); - tab_dim (t, options & TAT_NOWRAP ? nowrap_dim : wrap_dim); - tab_submit (t); - - free (tmp_buf); +/* Outputs FORMAT as a table with a single cell having cell + options OPTIONS, which is a combination of the TAB_* and TAT_* + constants. FORMAT is formatted as if it was passed through + printf. */ +void +tab_output_text_format (int options, const char *format, ...) +{ + struct tab_table *table; + va_list args; + + table = tab_create (1, 1, 0); + + va_start (args, format); + do_tab_output_text (table, options, + pool_vasprintf (table->container, format, args)); + va_end (args); } /* Set table flags to FLAGS. */ @@ -838,7 +925,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 @@ -849,7 +936,7 @@ tabi_table (struct som_entity *table) t = table->ext; tab_offset (t, 0, 0); - + 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); @@ -860,9 +947,9 @@ tabi_table (struct som_entity *table) /* Returns the line style to use for spacing purposes for a rule of the given TYPE. */ static enum outp_line_style -rule_to_spacing_type (unsigned char type) +rule_to_spacing_type (unsigned char type) { - switch (type) + switch (type) { case TAL_0: return OUTP_L_NONE; @@ -882,28 +969,28 @@ tabi_driver (struct outp_driver *driver) { int c, r; int i; - + assert (driver != NULL); d = driver; - + /* Figure out sizes of rules. */ - for (r = 0; r <= t->nr; r++) + for (r = 0; r <= t->nr; r++) { int width = 0; - for (c = 0; c < t->nc; c++) + for (c = 0; c < t->nc; c++) { unsigned char rh = t->rh[c + r * t->cf]; int w = driver->horiz_line_width[rule_to_spacing_type (rh)]; if (w > width) - width = w; + width = w; } - t->hrh[r] = width; + t->hrh[r] = width; } - for (c = 0; c <= t->nc; c++) + for (c = 0; c <= t->nc; c++) { int width = 0; - for (r = 0; r < t->nr; r++) + for (r = 0; r < t->nr; r++) { unsigned char *rv = &t->rv[c + r * (t->cf + 1)]; int w; @@ -913,7 +1000,7 @@ tabi_driver (struct outp_driver *driver) if (w > width) width = w; } - t->wrv[c] = width; + t->wrv[c] = width; } #if DEBUGGING @@ -924,7 +1011,7 @@ tabi_driver (struct outp_driver *driver) #endif assert (t->dim != NULL); - t->dim (t, d); + t->dim (t, d, t->dim_aux); #if DEBUGGING { @@ -939,7 +1026,7 @@ tabi_driver (struct outp_driver *driver) } assert (t->h[i] > 0); } - + for (i = 0; i < t->nc; i++) { if (t->w[i] == -1) @@ -951,7 +1038,7 @@ tabi_driver (struct outp_driver *driver) } } #endif - + /* Add up header sizes. */ for (i = 0, t->wl = t->wrv[0]; i < t->l; i++) t->wl += t->w[i] + t->wrv[i + 1]; @@ -961,7 +1048,7 @@ tabi_driver (struct outp_driver *driver) t->wr += t->w[i] + t->wrv[i + 1]; for (i = t->nr - t->b, t->hb = t->hrh[i]; i < t->nr; i++) t->hb += t->h[i] + t->hrh[i + 1]; - + /* Title. */ if (!(t->flags & SOMF_NO_TITLE)) t->ht += d->font_height; @@ -986,16 +1073,16 @@ static void tabi_area (int *horiz, int *vert) { assert (horiz != NULL && vert != NULL); - + { int w, c; - + for (c = t->l + 1, w = t->wl + t->wr + t->w[t->l]; c < t->nc - t->r; c++) w += t->w[c] + t->wrv[c]; *horiz = w; } - + { int h, r; for (r = t->t + 1, h = t->ht + t->hb + t->h[t->t]; @@ -1039,7 +1126,7 @@ tabi_cumulate (int cumtype, int start, int *end, int max, int *actual) int *d; int *r; int total; - + assert (end != NULL && (cumtype == SOM_ROWS || cumtype == SOM_COLUMNS)); if (cumtype == SOM_ROWS) { @@ -1057,7 +1144,7 @@ tabi_cumulate (int cumtype, int start, int *end, int max, int *actual) r = &t->wrv[start + 1]; total = t->wl + t->wr; } - + total += *d++; if (total > max) { @@ -1067,14 +1154,14 @@ tabi_cumulate (int cumtype, int start, int *end, int max, int *actual) *actual = 0; return; } - + { int x; - + for (x = start + 1; x < n; x++) { int amt = *d++ + *r++; - + total += amt; if (total > max) { @@ -1085,7 +1172,7 @@ tabi_cumulate (int cumtype, int start, int *end, int max, int *actual) if (end) *end = x; - + if (actual) *actual = total; } @@ -1102,7 +1189,7 @@ tabi_flags (unsigned *flags) /* Returns true if the table will fit in the given page WIDTH, false otherwise. */ static bool -tabi_fits_width (int width) +tabi_fits_width (int width) { int i; @@ -1116,7 +1203,7 @@ tabi_fits_width (int width) /* Returns true if the table will fit in the given page LENGTH, false otherwise. */ static bool -tabi_fits_length (int length) +tabi_fits_length (int length) { int i; @@ -1149,7 +1236,7 @@ tabi_title (int x, int y) if (t->flags & SOMF_NO_TITLE) return; - + cp = spprintf (buf, "%d.%d", table_num, subtable_num); if (x && y) cp = spprintf (cp, "(%d:%d)", x, y); @@ -1165,7 +1252,7 @@ tabi_title (int x, int y) cp += length; } *cp = 0; - + { struct outp_text text; @@ -1191,13 +1278,13 @@ static int render_rows (int y, int c0, int c1, int r0, int r1) { int r; - for (r = r0; r < r1; r++) + for (r = r0; r < r1; r++) { int x = d->cp_x; x = render_strip (x, y, r, 0, t->l * 2 + 1, r0, r1); x = render_strip (x, y, r, c0 * 2 + 1, c1 * 2, r0, r1); x = render_strip (x, y, r, (t->nc - t->r) * 2, t->nc * 2 + 1, r0, r1); - y += (r & 1) ? t->h[r / 2] : t->hrh[r / 2]; + y += (r & 1) ? t->h[r / 2] : t->hrh[r / 2]; } return y; } @@ -1208,7 +1295,7 @@ static void tabi_render (int c0, int r0, int c1, int r1) { int y; - + tab_hit++; y = d->cp_y; @@ -1220,11 +1307,11 @@ 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, - + tabi_count, tabi_area, NULL, @@ -1237,7 +1324,7 @@ struct som_table_class tab_table_class = tabi_flags, tabi_fits_width, tabi_fits_length, - + NULL, NULL, tabi_set_headers, @@ -1249,7 +1336,7 @@ struct som_table_class tab_table_class = static enum outp_justification translate_justification (unsigned int opt) { - switch (opt & TAB_ALIGN_MASK) + switch (opt & TAB_ALIGN_MASK) { case TAB_RIGHT: return OUTP_RIGHT; @@ -1265,9 +1352,9 @@ translate_justification (unsigned int opt) /* Returns the line style to use for drawing a rule of the given TYPE. */ static enum outp_line_style -rule_to_draw_type (unsigned char type) +rule_to_draw_type (unsigned char type) { - switch (type) + switch (type) { case TAL_0: case TAL_GAP: @@ -1283,14 +1370,14 @@ rule_to_draw_type (unsigned char type) /* Returns the horizontal rule at the given column and row. */ static int -get_hrule (int c, int r) +get_hrule (int c, int r) { return t->rh[c + r * t->cf]; } /* Returns the vertical rule at the given column and row. */ static int -get_vrule (int c, int r) +get_vrule (int c, int r) { return t->rv[c + r * (t->cf + 1)]; } @@ -1353,7 +1440,7 @@ strip_width (int c1, int c2) int width = 0; int c; - for (c = c1; c < c2; c++) + for (c = c1; c < c2; c++) width += t->w[c] + t->wrv[c + 1]; if (c1 < c2) width -= t->wrv[c2]; @@ -1368,7 +1455,7 @@ strip_height (int r1, int r2) int height = 0; int r; - for (r = r1; r < r2; r++) + for (r = r1; r < r2; r++) height += t->h[r] + t->hrh[r + 1]; if (r1 < r2) height -= t->hrh[r2]; @@ -1384,7 +1471,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 substring *content = &t->cc[index]; - + if (!(type & TAB_JOIN)) { if (!(type & TAB_EMPTY)) @@ -1437,7 +1524,7 @@ render_strip (int x, int y, int r, int c0, int c1, int r0 UNUSED, int r1) int c; for (c = c0; c < c1; c++) - if (c & 1) + if (c & 1) { if (r & 1) render_cell (x, y, c / 2, r / 2, c1 / 2, r1); @@ -1453,14 +1540,14 @@ render_strip (int x, int y, int r, int c0, int c1, int r0 UNUSED, int r1) render_rule_intersection (x, y, c / 2, r / 2); x += t->wrv[c / 2]; } - + return x; } /* Sets COMMAND_NAME as the name of the current command, for embedding in output. */ void -tab_set_command_name (const char *command_name_) +tab_set_command_name (const char *command_name_) { free (command_name); command_name = command_name_ ? xstrdup (command_name_) : NULL;