X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Ftab.c;h=435fa609ce06d4547f885f07aad3ad5c6e336e08;hb=01d6db8119ca4553d61841f2a9248712d4c6e0dc;hp=78bde01e5dcb1a36de59556dbd7af5140919b8ae;hpb=a8799bb1d22a001fe846733bc127b203e3c5894a;p=pspp diff --git a/src/output/tab.c b/src/output/tab.c index 78bde01e5d..435fa609ce 100644 --- a/src/output/tab.c +++ b/src/output/tab.c @@ -45,11 +45,8 @@ #define _(msgid) gettext (msgid) -#if DEBUGGING static const bool debugging = true; -#else -static const bool debugging = false; -#endif + /* Cell options. */ #define TAB_JOIN (1u << TAB_FIRST_AVAILABLE) @@ -66,7 +63,9 @@ struct tab_joined_cell u; size_t n_footnotes; - char **footnotes; + const struct footnote **footnotes; + + const struct cell_style *style; }; static const struct table_class tab_table_class; @@ -95,21 +94,22 @@ tab_create (int nc, int nr) t->caption = NULL; t->cf = nc; t->cc = pool_calloc (t->container, nr * nc, sizeof *t->cc); - t->ct = pool_malloc (t->container, nr * nc); - memset (t->ct, 0, nc * nr); + t->ct = pool_calloc (t->container, nr * nc, sizeof *t->ct); t->rh = pool_nmalloc (t->container, nc, nr + 1); - memset (t->rh, 0, nc * (nr + 1)); + memset (t->rh, TAL_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)); + memset (t->rv, TAL_0, nr * (nc + 1)); + memset (t->fmtmap, 0, sizeof (*t->fmtmap) * n_RC); t->fmtmap[RC_PVALUE] = ugly[RC_PVALUE]; t->fmtmap[RC_INTEGER] = ugly[RC_INTEGER]; t->fmtmap[RC_OTHER] = *settings_get_format (); + memset (t->styles, 0, sizeof t->styles); + memset (t->rule_colors, 0, sizeof t->rule_colors); + t->col_ofs = t->row_ofs = 0; return t; @@ -174,7 +174,7 @@ tab_realloc (struct tab_table *t, int nc, int nr) int mc1 = MIN (nc, tab_nc (t)); void **new_cc; - unsigned char *new_ct; + unsigned short *new_ct; int r; new_cc = pool_calloc (t->container, nr * nc, sizeof *new_cc); @@ -183,7 +183,8 @@ tab_realloc (struct tab_table *t, int nc, int nr) { memcpy (&new_cc[r * nc], &t->cc[r * tab_nc (t)], mc1 * sizeof *t->cc); - memcpy (&new_ct[r * nc], &t->ct[r * tab_nc (t)], mc1); + memcpy (&new_ct[r * nc], &t->ct[r * tab_nc (t)], + mc1 * sizeof *t->ct); memset (&new_ct[r * nc + tab_nc (t)], 0, nc - tab_nc (t)); } pool_free (t->container, t->cc); @@ -195,7 +196,7 @@ tab_realloc (struct tab_table *t, int nc, int nr) else if (nr != tab_nr (t)) { t->cc = pool_nrealloc (t->container, t->cc, nr * nc, sizeof *t->cc); - t->ct = pool_realloc (t->container, t->ct, nr * nc); + t->ct = pool_nrealloc (t->container, t->ct, nr * nc, sizeof *t->ct); t->rh = pool_nrealloc (t->container, t->rh, nc, nr + 1); t->rv = pool_nrealloc (t->container, t->rv, nr, nc + 1); @@ -204,12 +205,12 @@ tab_realloc (struct tab_table *t, int nc, int nr) { memset (&t->rh[nc * (tab_nr (t) + 1)], TAL_0, (nr - tab_nr (t)) * nc); - memset (&t->rv[(nc + 1) * tab_nr (t)], TAL_GAP, + memset (&t->rv[(nc + 1) * tab_nr (t)], TAL_0, (nr - tab_nr (t)) * (nc + 1)); } } - memset (&t->ct[nc * tab_nr (t)], 0, nc * (nr - tab_nr (t))); + memset (&t->ct[nc * tab_nr (t)], 0, nc * (nr - tab_nr (t)) * sizeof *t->ct); memset (&t->cc[nc * tab_nr (t)], 0, nc * (nr - tab_nr (t)) * sizeof *t->cc); table_set_nr (&t->table, nr); @@ -399,7 +400,7 @@ tab_box (struct tab_table *t, int f_h, int f_v, int i_h, int i_v, /* Sets cell (C,R) in TABLE, with options OPT, to have a value taken from V, displayed with format spec F. */ void -tab_value (struct tab_table *table, int c, int r, unsigned char opt, +tab_value (struct tab_table *table, int c, int r, unsigned short opt, const union value *v, const struct variable *var, const struct fmt_spec *f) { @@ -433,7 +434,7 @@ tab_value (struct tab_table *table, int c, int r, unsigned char opt, 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, +tab_double (struct tab_table *table, int c, int r, unsigned short opt, double val, const struct fmt_spec *fmt, enum result_class rc) { union value double_value; @@ -561,10 +562,11 @@ add_joined_cell (struct tab_table *table, int x1, int y1, int x2, int y2, j->d[TABLE_VERT][1] = ++y2 + table->row_ofs; j->n_footnotes = 0; j->footnotes = NULL; + j->style = NULL; { void **cc = &table->cc[x1 + y1 * table->cf]; - unsigned char *ct = &table->ct[x1 + y1 * table->cf]; + unsigned short *ct = &table->ct[x1 + y1 * table->cf]; const int ofs = table->cf - (x2 - x1); int y; @@ -594,7 +596,10 @@ tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2, unsigned opt, const char *text) { char *s = pool_strdup (table->container, text); - add_joined_cell (table, x1, y1, x2, y2, opt)->u.text = s; + if (x1 == x2 && y1 == y2) + do_tab_text (table, x1, y1, opt, s); + else + add_joined_cell (table, x1, y1, x2, y2, opt)->u.text = s; } /* Joins cells (X1,X2)-(Y1,Y2) inclusive in TABLE, and sets them @@ -614,13 +619,25 @@ tab_joint_text_format (struct tab_table *table, int x1, int y1, int x2, add_joined_cell (table, x1, y1, x2, y2, opt)->u.text = s; } +struct footnote * +tab_create_footnote (struct tab_table *table, size_t idx, const char *content, + const char *marker, struct cell_style *style) +{ + struct footnote *f = pool_alloc (table->container, sizeof *f); + f->idx = idx; + f->content = pool_strdup (table->container, content); + f->marker = pool_strdup (table->container, marker); + f->style = style; + return f; +} + void -tab_footnote (struct tab_table *table, int x, int y, const char *format, ...) +tab_add_footnote (struct tab_table *table, int x, int y, + const struct footnote *f) { int index = x + y * table->cf; - unsigned char opt = table->ct[index]; + unsigned short opt = table->ct[index]; struct tab_joined_cell *j; - va_list args; if (opt & TAB_JOIN) j = table->cc[index]; @@ -632,13 +649,31 @@ tab_footnote (struct tab_table *table, int x, int y, const char *format, ...) j->u.text = text ? text : xstrdup (""); } - j->footnotes = xrealloc (j->footnotes, - (j->n_footnotes + 1) * sizeof *j->footnotes); + j->footnotes = pool_realloc (table->container, j->footnotes, + (j->n_footnotes + 1) * sizeof *j->footnotes); - va_start (args, format); - j->footnotes[j->n_footnotes++] = - pool_vasprintf (table->container, format, args); - va_end (args); + j->footnotes[j->n_footnotes++] = f; +} + +void +tab_add_style (struct tab_table *table, int x, int y, + const struct cell_style *style) +{ + int index = x + y * table->cf; + unsigned short opt = table->ct[index]; + struct tab_joined_cell *j; + + if (opt & TAB_JOIN) + j = table->cc[index]; + else + { + char *text = table->cc[index]; + + j = add_joined_cell (table, x, y, x, y, table->ct[index]); + j->u.text = text ? text : xstrdup (""); + } + + j->style = style; } bool @@ -776,13 +811,18 @@ tab_get_cell (const struct table *table, int x, int y, { const struct tab_table *t = tab_cast (table); int index = x + y * t->cf; - unsigned char opt = t->ct[index]; + unsigned short opt = t->ct[index]; const void *cc = t->cc[index]; cell->inline_contents.options = opt; cell->inline_contents.n_footnotes = 0; cell->destructor = NULL; + int style_idx = (opt & TAB_STYLE_MASK) >> TAB_STYLE_SHIFT; + const struct cell_style *style = t->styles[style_idx]; + if (style) + cell->style = style; + if (opt & TAB_JOIN) { const struct tab_joined_cell *jc = cc; @@ -797,6 +837,9 @@ tab_get_cell (const struct table *table, int x, int y, cell->d[TABLE_HORZ][1] = jc->d[TABLE_HORZ][1]; cell->d[TABLE_VERT][0] = jc->d[TABLE_VERT][0]; cell->d[TABLE_VERT][1] = jc->d[TABLE_VERT][1]; + + if (jc->style) + cell->style = jc->style; } else { @@ -819,11 +862,17 @@ tab_get_cell (const struct table *table, int x, int y, } static int -tab_get_rule (const struct table *table, enum table_axis axis, int x, int y) +tab_get_rule (const struct table *table, enum table_axis axis, int x, int y, + struct cell_color *color) { const struct tab_table *t = tab_cast (table); - return (axis == TABLE_VERT - ? t->rh[x + t->cf * y] : t->rv[x + (t->cf + 1) * y]); + uint8_t raw = (axis == TABLE_VERT + ? t->rh[x + t->cf * y] : t->rv[x + (t->cf + 1) * y]); + struct cell_color *p = t->rule_colors[(raw & TAB_RULE_STYLE_MASK) + >> TAB_RULE_STYLE_SHIFT]; + if (p) + *color = *p; + return (raw & TAB_RULE_TYPE_MASK) >> TAB_RULE_TYPE_SHIFT; } static const struct table_class tab_table_class = {