X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Ftab.c;h=d9872c7214e5d3d9015a92b1101eca3702e83f99;hb=d2b769f76cbbadede9bd68da7caecabd69235bfa;hp=f6b4886b1f4837327e830fb44cd0c14114878fe4;hpb=a5955409d3679873d3bd6a0056e2aef92fbb0258;p=pspp diff --git a/src/output/tab.c b/src/output/tab.c index f6b4886b1f..d9872c7214 100644 --- a/src/output/tab.c +++ b/src/output/tab.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2013, 2014 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 @@ -16,30 +16,30 @@ #include -#include +#include "output/tab.h" #include #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "error.h" -#include "minmax.h" -#include "xalloc.h" +#include "data/data-out.h" +#include "data/format.h" +#include "data/settings.h" +#include "data/value.h" +#include "data/variable.h" +#include "libpspp/assertion.h" +#include "libpspp/compiler.h" +#include "libpspp/i18n.h" +#include "libpspp/misc.h" +#include "libpspp/pool.h" +#include "output/driver.h" +#include "output/table-item.h" +#include "output/table-provider.h" +#include "output/text-item.h" + +#include "gl/minmax.h" +#include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -56,6 +56,15 @@ struct tab_joined_cell static const struct table_class tab_table_class; +struct fmt_spec ugly [n_RC] = + { + {FMT_F, 8, 0}, /* INTEGER */ + {FMT_F, 8, 3}, /* WEIGHT (ignored) */ + {FMT_F, 8, 3}, /* PVALUE */ + {FMT_F, 8, 3} /* OTHER (ignored) */ + }; + + /* Creates and returns a new table with NC columns and NR rows and initially no header rows or columns. The table's cells are initially empty. */ struct tab_table * @@ -78,13 +87,27 @@ tab_create (int nc, int nr) memset (t->rh, 0, nc * (nr + 1)); t->rv = pool_nmalloc (t->container, nr, nc + 1); + memset (t->fmtmap, 0, sizeof (*t->fmtmap) * n_RC); + memset (t->rv, TAL_GAP, nr * (nc + 1)); + t->fmtmap[RC_PVALUE] = ugly[RC_PVALUE]; + t->fmtmap[RC_INTEGER] = ugly[RC_INTEGER]; + t->fmtmap[RC_OTHER] = *settings_get_format (); + t->col_ofs = t->row_ofs = 0; return t; } + +void +tab_set_format (struct tab_table *t, enum result_class rc, const struct fmt_spec *fmt) +{ + t->fmtmap[rc] = *fmt; +} + + /* Sets the width and height of a table, in columns and rows, respectively. Use only to reduce the size of a table, since it does not change the amount of allocated memory. @@ -359,7 +382,7 @@ tab_box (struct tab_table *t, int f_h, int f_v, int i_h, int i_v, from V, displayed with format spec F. */ void tab_value (struct tab_table *table, int c, int r, unsigned char opt, - const union value *v, const struct dictionary *dict, + const union value *v, const struct variable *var, const struct fmt_spec *f) { char *contents; @@ -378,57 +401,21 @@ tab_value (struct tab_table *table, int c, int r, unsigned char opt, } #endif - contents = data_out_pool (v, dict_get_encoding (dict), f, table->container); + contents = data_out_stretchy (v, var_get_encoding (var), + f != NULL ? f : var_get_print_format (var), + table->container); table->cc[c + r * table->cf] = 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_fixed (struct tab_table *table, int c, int r, unsigned char opt, - double val, int w, int d) -{ - struct fmt_spec f; - union value double_value; - char *s; - - assert (c >= 0); - assert (c < tab_nc (table)); - assert (r >= 0); - assert (r < tab_nr (table)); - - 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 >= tab_nc (table) - || r + table->row_ofs >= tab_nr (table)) - { - 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, - tab_nc (table), tab_nr (table)); - return; - } -#endif - - double_value.f = val; - s = data_out_pool (&double_value, LEGACY_NATIVE, &f, table->container); - - table->cc[c + r * table->cf] = s + strspn (s, " "); - 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) + double val, const struct fmt_spec *fmt, enum result_class rc) { union value double_value ; char *s; @@ -438,9 +425,9 @@ tab_double (struct tab_table *table, int c, int r, unsigned char opt, assert (r >= 0); assert (r < tab_nr (table)); - if ( fmt == NULL) - fmt = settings_get_format (); - + if (fmt == NULL) + fmt = &table->fmtmap[rc]; + fmt_check_output (fmt); #if DEBUGGING @@ -458,7 +445,7 @@ tab_double (struct tab_table *table, int c, int r, unsigned char opt, #endif double_value.f = val; - s = data_out_pool (&double_value, LEGACY_NATIVE, fmt, table->container); + s = data_out_stretchy (&double_value, C_ENCODING, fmt, table->container); table->cc[c + r * table->cf] = s + strspn (s, " "); table->ct[c + r * table->cf] = opt; } @@ -709,6 +696,8 @@ static void tab_destroy (struct table *table) { struct tab_table *t = tab_cast (table); + free (t->title); + t->title = NULL; pool_destroy (t->container); } @@ -762,6 +751,6 @@ static const struct table_class tab_table_class = struct tab_table * tab_cast (const struct table *table) { - assert (table->class == &tab_table_class); + assert (table->klass == &tab_table_class); return UP_CAST (table, struct tab_table, table); }