X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Ftab.c;h=435fa609ce06d4547f885f07aad3ad5c6e336e08;hb=01d6db8119ca4553d61841f2a9248712d4c6e0dc;hp=dcd6fe29a2cc5590457dd937d67e73df84062892;hpb=395cd4395449dbdff7c9ba0d56ba14529063d350;p=pspp diff --git a/src/output/tab.c b/src/output/tab.c index dcd6fe29a2..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) @@ -67,6 +64,8 @@ struct tab_joined_cell size_t n_footnotes; const struct footnote **footnotes; + + const struct cell_style *style; }; static const struct table_class tab_table_class; @@ -95,8 +94,7 @@ 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, TAL_0, nc * (nr + 1)); @@ -109,6 +107,9 @@ tab_create (int nc, int nr) 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; @@ -173,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); @@ -182,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); @@ -194,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); @@ -208,7 +210,7 @@ tab_realloc (struct tab_table *t, int nc, int nr) } } - 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); @@ -398,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) { @@ -432,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; @@ -560,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; @@ -618,12 +621,13 @@ tab_joint_text_format (struct tab_table *table, int x1, int y1, int x2, struct footnote * tab_create_footnote (struct tab_table *table, size_t idx, const char *content, - const char *marker) + 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; } @@ -632,7 +636,7 @@ 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; if (opt & TAB_JOIN) @@ -651,6 +655,27 @@ tab_add_footnote (struct tab_table *table, int x, int y, 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 tab_cell_is_empty (const struct tab_table *table, int c, int r) { @@ -786,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; @@ -807,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 { @@ -829,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 = {