X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Ftable.c;h=a86f407d5f3aa18cab0bbc0376a7eb603de3ceb9;hb=f15c854d8500105766b2f5666bb62b983ff24f88;hp=8ba385121c123c0a66437edfbcb5029bcccee962;hpb=f5c108becd49d78f4898cab11352291f5689d24e;p=pspp-builds.git diff --git a/src/output/table.c b/src/output/table.c index 8ba38512..a86f407d 100644 --- a/src/output/table.c +++ b/src/output/table.c @@ -1,20 +1,18 @@ -/* PSPP - computes sample statistics. - Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc. +/* 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 @@ -31,14 +29,15 @@ #include #include #include -#include #include #include -#include #include #include +#include + #include "minmax.h" +#include "xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -400,10 +399,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 @@ -476,7 +476,6 @@ tab_natural_height (struct tab_table *t, struct outp_driver *d, int r) unsigned char opt = t->ct[c + r * t->cf]; int h; - assert (t->w[c] != NOT_INT); if (opt & (TAB_JOIN | TAB_EMPTY)) continue; @@ -498,7 +497,8 @@ 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; @@ -537,21 +537,19 @@ tab_value (struct tab_table *table, int c, int r, unsigned char opt, } #endif - 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; + contents = data_out_pool (v, f, table->container); - data_out (v, f, contents); + table->cc[c + r * table->cf] = ss_cstr (contents); + table->ct[c + r * table->cf] = opt; } /* 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; + char *s, *cp; struct fmt_spec f; union value double_value; @@ -570,7 +568,7 @@ tab_float (struct tab_table *table, int c, int r, unsigned char opt, || 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, @@ -580,19 +578,71 @@ tab_float (struct tab_table *table, int c, int r, unsigned char opt, #endif double_value.f = val; - data_out (&double_value, &f, buf); + s = data_out_pool (&double_value, &f, table->container); - cp = buf; - while (isspace ((unsigned char) *cp) && cp < &buf[w]) + cp = s; + while (isspace ((unsigned char) *cp) && cp < &s[w]) cp++; - f.w = w - (cp - buf); + f.w = w - (cp - s); + + table->cc[c + r * table->cf] = ss_buffer (cp, f.w); + table->ct[c + r * table->cf] = opt; +} + +/* 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_double (struct tab_table *table, int c, int r, unsigned char opt, + double val, const struct fmt_spec *fmt) +{ + int w; + char *s, *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 (); - contents = pool_alloc (table->container, f.w); - table->cc[c + r * table->cf] = ss_buffer (contents, f.w); + 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; + s = data_out_pool (&double_value, fmt, table->container); + + cp = s; + while (isspace ((unsigned char) *cp) && cp < s + fmt->w) + { + cp++; + } + w = fmt->w - (cp - s); + + table->cc[c + r * table->cf] = ss_buffer (cp, w); table->ct[c + r * table->cf] = opt; - memcpy (contents, cp, f.w); } + /* Sets cell (C,R) in TABLE, with options OPT, to have text value TEXT. */ void @@ -716,7 +766,7 @@ tab_raw (struct tab_table *table, int c, int r, unsigned opt, || 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, @@ -734,7 +784,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; @@ -743,7 +793,7 @@ 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); @@ -769,7 +819,7 @@ tab_output_text (int options, const char *buf, ...) 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_dim (t, options & TAT_NOWRAP ? nowrap_dim : wrap_dim, NULL); tab_submit (t); free (tmp_buf); @@ -929,7 +979,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 {