X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tests%2Foutput%2Frender-test.c;h=0e07f87dc16f6ef8e3ce9ebf97196ca37c525127;hb=7c2b97b0c7172f4d6eb0b3022c56c0b61cb5f60f;hp=fbc0f208484d973f4170b053abd694d8761fca68;hpb=93ec42221da8b677420bf11435e0d24d0503601b;p=pspp diff --git a/tests/output/render-test.c b/tests/output/render-test.c index fbc0f20848..0e07f87dc1 100644 --- a/tests/output/render-test.c +++ b/tests/output/render-test.c @@ -22,12 +22,14 @@ #include #include +#include "data/file-handle-def.h" #include "libpspp/assertion.h" #include "libpspp/compiler.h" +#include "libpspp/i18n.h" #include "libpspp/string-map.h" #include "output/ascii.h" #include "output/driver.h" -#include "output/tab.h" +#include "output/table.h" #include "output/table-item.h" #include "gl/error.h" @@ -35,11 +37,9 @@ #include "gl/xalloc.h" #include "gl/xvasprintf.h" -/* --transpose: Transpose the table before outputting? */ -static int transpose; - /* --emphasis: ASCII driver emphasis option. */ -static char *emphasis; +static bool bold; +static bool underline; /* --box: ASCII driver box option. */ static char *box; @@ -56,6 +56,9 @@ static int render_stdout = true; /* --pdf: Also render PDF output. */ static int render_pdf; +/* --csv: Also render CSV output. */ +static int render_csv; + /* ASCII driver, for ASCII driver test mode. */ static struct output_driver *ascii_driver; @@ -64,7 +67,7 @@ static const char *output_base = "render"; static const char *parse_options (int argc, char **argv); static void usage (void) NO_RETURN; -static struct table *read_table (FILE *, struct table **tables, size_t n_tables); +static struct table *read_table (FILE *); static void draw (FILE *); int @@ -74,6 +77,8 @@ main (int argc, char **argv) FILE *input; set_program_name (argv[0]); + i18n_init (); + output_engine_push (); input_file_name = parse_options (argc, argv); if (!strcmp (input_file_name, "-")) @@ -99,7 +104,7 @@ main (int argc, char **argv) if (n_tables >= allocated_tables) tables = x2nrealloc (tables, &allocated_tables, sizeof *tables); - tables[n_tables] = read_table (input, tables, n_tables); + tables[n_tables] = read_table (input); n_tables++; ch = getc (input); @@ -109,9 +114,8 @@ main (int argc, char **argv) } table = tables[n_tables - 1]; - if (transpose) - table = table_transpose (table); - table_item_submit (table_item_create (table, NULL)); + table_item_submit (table_item_create (table, NULL, NULL, NULL)); + free (tables); } else draw (input); @@ -119,7 +123,8 @@ main (int argc, char **argv) if (input != stdin) fclose (input); - output_close (); + output_engine_pop (); + fh_done (); return 0; } @@ -135,17 +140,11 @@ configure_drivers (int width, int length, int min_break) string_map_insert (&options, "output-file", "-"); string_map_insert_nocopy (&options, xstrdup ("width"), xasprintf ("%d", width)); - string_map_insert_nocopy (&options, xstrdup ("length"), - xasprintf ("%d", length)); if (min_break >= 0) - { - string_map_insert_nocopy (&options, xstrdup ("min-hbreak"), - xasprintf ("%d", min_break)); - string_map_insert_nocopy (&options, xstrdup ("min-vbreak"), - xasprintf ("%d", min_break)); - } - if (emphasis != NULL) - string_map_insert (&options, "emphasis", emphasis); + string_map_insert_nocopy (&options, xstrdup ("min-hbreak"), + xasprintf ("%d", min_break)); + if (bold || underline) + string_map_insert (&options, "emphasis", "true"); if (box != NULL) string_map_insert (&options, "box", box); @@ -205,6 +204,18 @@ configure_drivers (int width, int length, int min_break) } #endif + /* Render to .csv. */ + if (render_csv) + { + string_map_clear (&options); + string_map_insert_nocopy (&options, xstrdup ("output-file"), + xasprintf ("%s.csv", output_base)); + driver = output_driver_create (&options); + if (driver == NULL) + exit (EXIT_FAILURE); + output_driver_register (driver); + } + /* Render to .odt. */ string_map_replace_nocopy (&options, xstrdup ("output-file"), xasprintf ("%s.odt", output_base)); @@ -238,13 +249,13 @@ parse_options (int argc, char **argv) {"width", required_argument, NULL, OPT_WIDTH}, {"length", required_argument, NULL, OPT_LENGTH}, {"min-break", required_argument, NULL, OPT_MIN_BREAK}, - {"transpose", no_argument, &transpose, 1}, {"emphasis", required_argument, NULL, OPT_EMPHASIS}, {"box", required_argument, NULL, OPT_BOX}, {"draw-mode", no_argument, &draw_mode, 1}, {"no-txt", no_argument, &render_txt, 0}, {"no-stdout", no_argument, &render_stdout, 0}, {"pdf", no_argument, &render_pdf, 1}, + {"csv", no_argument, &render_csv, 1}, {"output", required_argument, NULL, 'o'}, {"help", no_argument, NULL, OPT_HELP}, {NULL, 0, NULL, 0}, @@ -269,7 +280,23 @@ parse_options (int argc, char **argv) break; case OPT_EMPHASIS: - emphasis = optarg; + if (!strcmp (optarg, "bold")) + { + bold = true; + underline = false; + } + else if (!strcmp (optarg, "underline")) + { + bold = false; + underline = true; + } + else if (!strcmp (optarg, "none")) + { + bold = underline = false; + } + else + error (1, 0, "argument to --emphasis must be \"bold\" or " + "\"underline\" or \"none\""); break; case OPT_BOX: @@ -321,7 +348,7 @@ replace_newlines (char *p) { char *q; - for (q = p; *p != '\0'; ) + for (q = p; *p != '\0';) if (*p == '\\' && p[1] == 'n') { *q++ = '\n'; @@ -333,14 +360,15 @@ replace_newlines (char *p) } static struct table * -read_table (FILE *stream, struct table **tables, size_t n_tables) +read_table (FILE *stream) { - struct tab_table *tab; + struct table *tab; char buffer[1024]; int input[6]; int n_input = 0; int nr, nc, hl, hr, ht, hb; int r, c; + size_t n_footnotes = 0; if (fgets (buffer, sizeof buffer, stream) == NULL || (n_input = sscanf (buffer, "%d %d %d %d %d %d", @@ -355,15 +383,12 @@ read_table (FILE *stream, struct table **tables, size_t n_tables) ht = n_input >= 5 ? input[4] : 0; hb = n_input >= 6 ? input[5] : 0; - tab = tab_create (nc, nr); - tab_headers (tab, hl, hr, ht, hb); + tab = table_create (nc, nr, hl, hr, ht, hb); for (r = 0; r < nr; r++) for (c = 0; c < nc; c++) - if (tab_cell_is_empty (tab, c, r)) + if (table_cell_is_empty (tab, c, r)) { - unsigned int opt; char *new_line; - unsigned int i; char *text; int rs, cs; @@ -388,44 +413,49 @@ read_table (FILE *stream, struct table **tables, size_t n_tables) cs = 1; } - opt = 0; +#define S(H) { TABLE_AREA_STYLE_INITIALIZER__, .cell_style.halign = H } + static const struct table_area_style left_style + = S (TABLE_HALIGN_LEFT); + static const struct table_area_style right_style + = S (TABLE_HALIGN_RIGHT); + static const struct table_area_style center_style + = S (TABLE_HALIGN_CENTER); + + const struct table_area_style *style = &right_style; while (*text && strchr ("<>^,@()|", *text)) switch (*text++) { case '<': - tab_vline (tab, TAL_1, c, r, r + rs - 1); + table_vline (tab, TABLE_STROKE_SOLID, c, r, r + rs - 1); break; case '>': - tab_vline (tab, TAL_1, c + cs, r, r + rs - 1); + table_vline (tab, TABLE_STROKE_SOLID, c + cs, r, r + rs - 1); break; case '^': - tab_hline (tab, TAL_1, c, c + cs - 1, r); + table_hline (tab, TABLE_STROKE_SOLID, c, c + cs - 1, r); break; case ',': - tab_hline (tab, TAL_1, c, c + cs - 1, r + rs); + table_hline (tab, TABLE_STROKE_SOLID, c, c + cs - 1, r + rs); break; case '@': - tab_box (tab, TAL_1, TAL_1, -1, -1, c, r, - c + cs - 1, r + rs - 1); + table_box (tab, TABLE_STROKE_SOLID, TABLE_STROKE_SOLID, + -1, -1, c, r, c + cs - 1, r + rs - 1); break; case '(': - opt &= ~TAB_ALIGNMENT; - opt |= TAB_LEFT; + style = &left_style; break; case ')': - opt &= ~TAB_ALIGNMENT; - opt |= TAB_RIGHT; + style = &right_style; break; case '|': - opt &= ~TAB_ALIGNMENT; - opt |= TAB_CENTER; + style = ¢er_style; break; default: @@ -434,36 +464,29 @@ read_table (FILE *stream, struct table **tables, size_t n_tables) replace_newlines (text); - if (sscanf (text, "{%u}", &i) == 1) - { - struct table *table; - - if (i >= n_tables) - error (1, 0, "bad table number %u", i); - table = table_ref (tables[i]); - - text = strchr (text, '}') + 1; - while (*text) - switch (*text++) - { - case 's': - table = table_stomp (table); - break; - - case 't': - table = table_transpose (table); - break; - - default: - error (1, 0, "unexpected subtable modifier \"%c\"", *text); - } - tab_subtable (tab, c, r, c + cs - 1, r + rs - 1, opt, table); - } - else - tab_joint_text (tab, c, r, c + cs - 1, r + rs - 1, opt, text); + char *pos = text; + char *content; + int i; + + for (i = 0; (content = strsep (&pos, "#")) != NULL; i++) + if (!i) + { + table_joint_text (tab, c, r, c + cs - 1, r + rs - 1, 0, + content); + table_add_style (tab, c, r, style); + } + else + { + char marker[2] = { 'a' + n_footnotes, '\0' }; + struct footnote *f = table_create_footnote ( + tab, n_footnotes, content, marker, + table_area_style_clone (tab->container, &left_style)); + table_add_footnote (tab, c, r, f); + n_footnotes++; + } } - return &tab->table; + return tab; } static void @@ -484,10 +507,12 @@ draw (FILE *stream) continue; if (sscanf (buffer, "%d %d %d %[^\n]", &x, &y, &emph, text) == 4) - ascii_test_write (ascii_driver, text, x, y, emph ? TAB_EMPH : 0); + ascii_test_write (ascii_driver, text, x, y, emph ? bold : false, + emph ? underline : false); else if (sscanf (buffer, "set-length %d %d", &y, &length) == 2) ascii_test_set_length (ascii_driver, y, length); else error (1, 0, "line %d has invalid format", line); } + ascii_test_flush (ascii_driver); }