X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Ftable.c;h=97a2793c55ea728c2cbe72cb6705469c8cf34f1c;hb=refs%2Fheads%2Fvariable-sets;hp=d0f145cad3528a094dc3548303efedefd1fd43b2;hpb=660d222c1c6e484e5887ac9920d095ea7aaa0e38;p=pspp diff --git a/src/output/table.c b/src/output/table.c index d0f145cad3..97a2793c55 100644 --- a/src/output/table.c +++ b/src/output/table.c @@ -201,8 +201,8 @@ font_style_dump (const struct font_style *f) cell_color_dump (&f->fg[0]); putchar ('/'); cell_color_dump (&f->bg[0]); - if (!cell_color_equal (&f->fg[0], &f->fg[1]) - || !cell_color_equal (&f->bg[0], &f->bg[1])) + if (!cell_color_equal (f->fg[0], f->fg[1]) + || !cell_color_equal (f->bg[0], f->bg[1])) { printf (" alt="); cell_color_dump (&f->fg[1]); @@ -224,10 +224,10 @@ font_style_equal (const struct font_style *a, const struct font_style *b) && a->italic == b->italic && a->underline == b->underline && a->markup == b->markup - && cell_color_equal (&a->fg[0], &b->fg[0]) - && cell_color_equal (&a->fg[1], &b->fg[1]) - && cell_color_equal (&a->bg[0], &b->bg[0]) - && cell_color_equal (&a->bg[1], &b->bg[1]) + && cell_color_equal (a->fg[0], b->fg[0]) + && cell_color_equal (a->fg[1], b->fg[1]) + && cell_color_equal (a->bg[0], b->bg[0]) + && cell_color_equal (a->bg[1], b->bg[1]) && !strcmp (a->typeface ? a->typeface : "", b->typeface ? b->typeface : "") && a->size == b->size); @@ -245,9 +245,6 @@ cell_style_dump (const struct cell_style *c) c->margin[TABLE_VERT][0], c->margin[TABLE_VERT][1]); } - -static const bool debugging = true; - /* Creates and returns a new table with NC columns and NR rows and initially no header rows or columns. @@ -260,29 +257,18 @@ static const bool debugging = true; struct table * table_create (int nc, int nr, int hl, int hr, int ht, int hb) { - struct table *t; - - t = pool_create_container (struct table, container); - t->n[TABLE_HORZ] = nc; - t->n[TABLE_VERT] = nr; - t->h[TABLE_HORZ][0] = hl; - t->h[TABLE_HORZ][1] = hr; - t->h[TABLE_VERT][0] = ht; - t->h[TABLE_VERT][1] = hb; - t->ref_cnt = 1; - - t->cc = pool_calloc (t->container, nr * nc, sizeof *t->cc); - t->cp = pool_calloc (t->container, nr * nc, sizeof *t->cp); - - t->rh = pool_nmalloc (t->container, nc, nr + 1); - memset (t->rh, TABLE_STROKE_NONE, nc * (nr + 1)); - - t->rv = pool_nmalloc (t->container, nr, nc + 1); - memset (t->rv, TABLE_STROKE_NONE, nr * (nc + 1)); - - memset (t->styles, 0, sizeof t->styles); - memset (t->rule_colors, 0, sizeof t->rule_colors); - + struct pool *pool = pool_create (); + struct table *t = pool_alloc (pool, sizeof *t); + *t = (struct table) { + .container = pool, + .n = { [H] = nc, [V] = nr }, + .h = { [H] = { hl, hr }, [V] = { ht, hb } }, + .ref_cnt = 1, + .cc = pool_calloc (pool, nr * nc, sizeof *t->cc), + .cp = pool_calloc (pool, nr * nc, sizeof *t->cp), + .rh = pool_calloc (pool, nc, nr + 1), + .rv = pool_calloc (pool, nr, nc + 1), + }; return t; } @@ -293,21 +279,13 @@ table_create (int nc, int nr, int hl, int hr, int ht, int hb) void table_vline (struct table *t, int style, int x, int y1, int y2) { - if (debugging) + if (x < 0 || x > t->n[H] || y1 < 0 || y1 > y2 || y2 >= t->n[V]) { - if (x < 0 || x > t->n[H] - || y1 < 0 || y1 >= t->n[V] - || y2 < 0 || y2 >= t->n[V]) - { - printf ("bad vline: x=%d y=(%d,%d) in table size (%d,%d)\n", - x, y1, y2, t->n[H], t->n[V]); - return; - } + printf ("bad vline: x=%d y=(%d,%d) in table size (%d,%d)\n", + x, y1, y2, t->n[H], t->n[V]); + abort (); } - assert (0 <= x && x <= t->n[H]); - assert (0 <= y1 && y1 <= y2 && y2 <= t->n[V]); - for (int y = y1; y <= y2; y++) t->rv[x + (t->n[H] + 1) * y] = style; } @@ -317,21 +295,13 @@ table_vline (struct table *t, int style, int x, int y1, int y2) void table_hline (struct table *t, int style, int x1, int x2, int y) { - if (debugging) + if (y < 0 || y > t->n[V] || x1 < 0 || x1 > x2 || x2 >= t->n[H]) { - if (y < 0 || y > t->n[V] - || x1 < 0 || x1 >= t->n[H] - || x2 < 0 || x2 >= t->n[H]) - { - printf ("bad hline: x=(%d,%d) y=%d in table size (%d,%d)\n", - x1, x2, y, t->n[H], t->n[V]); - return; - } + printf ("bad hline: x=(%d,%d) y=%d in table size (%d,%d)\n", + x1, x2, y, t->n[H], t->n[V]); + abort (); } - assert (0 <= y && y <= t->n[V]); - assert (0 <= x1 && x1 <= x2 && x2 < t->n[H]); - for (int x = x1; x <= x2; x++) t->rh[x + t->n[H] * y] = style; } @@ -346,6 +316,25 @@ table_put (struct table *table, int x1, int y1, int x2, int y2, assert (0 <= x1 && x1 <= x2 && x2 < table->n[H]); assert (0 <= y1 && y1 <= y2 && y2 < table->n[V]); + const bool debugging = false; + if (debugging) + { + printf ("put "); + if (x1 == x2) + printf ("%d", x1); + else + printf ("%d-%d", x1, x2); + printf (","); + if (y1 == y2) + printf ("%d", y1); + else + printf ("%d-%d", y1, y2); + + char *value_s = value ? pivot_value_to_string (value, NULL) : NULL; + printf (": \"%s\"\n", value_s ? value_s : ""); + free (value_s); + } + if (x1 == x2 && y1 == y2) { table->cc[x1 + y1 * table->n[H]] = CONST_CAST (struct pivot_value *, value); @@ -449,8 +438,9 @@ table_get_cell (const struct table *t, int x, int y, struct table_cell *cell) assert (cell->cell_style); } -/* Returns one of the TAL_* enumeration constants (declared in output/table.h) - representing a rule running alongside one of the cells in TABLE. +/* Returns one of the TABLE_STROKE_* enumeration constants (declared in + output/table.h) representing a rule running alongside one of the cells in + TABLE. Suppose NC is the number of columns in TABLE and NR is the number of rows. Then, if AXIS is TABLE_HORZ, then 0 <= X <= NC and 0 <= Y < NR. If (X,Y) = @@ -486,18 +476,17 @@ table_get_cell (const struct table *t, int x, int y, struct table_cell *cell) the top of cell (0,0); if (X,Y) = (0,1), it is the horizontal rule between that cell and cell (0,1); and so on, up to (0,NR), which runs horizontally below cell (0,NR-1). */ -int -table_get_rule (const struct table *table, enum table_axis axis, int x, int y, - struct cell_color *color) +struct table_border_style +table_get_rule (const struct table *table, enum table_axis axis, int x, int y) { assert (x >= 0 && x < table->n[TABLE_HORZ] + (axis == TABLE_HORZ)); assert (y >= 0 && y < table->n[TABLE_VERT] + (axis == TABLE_VERT)); - uint8_t raw = (axis == TABLE_VERT - ? table->rh[x + table->n[H] * y] - : table->rv[x + (table->n[H] + 1) * y]); - struct cell_color *p = table->rule_colors[(raw & TAB_RULE_STYLE_MASK) - >> TAB_RULE_STYLE_SHIFT]; - *color = p ? *p : (struct cell_color) CELL_COLOR_BLACK; - return (raw & TAB_RULE_TYPE_MASK) >> TAB_RULE_TYPE_SHIFT; + size_t border_idx = (axis == TABLE_VERT + ? table->rh[x + table->n[H] * y] + : table->rv[x + (table->n[H] + 1) * y]); + return (border_idx < table->n_borders + ? table->borders[border_idx] + : (struct table_border_style) { TABLE_STROKE_NONE, + CELL_COLOR_BLACK }); }