From: Ben Pfaff Date: Sat, 15 Dec 2018 18:43:47 +0000 (-0800) Subject: ascii: Get rid of the idea of pages. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a4052ac93c4dd248f664107e78b52597a839066;p=pspp ascii: Get rid of the idea of pages. In the era when I started writing this code, people still printed output on dot-matrix printers and fanfold paper. That's no longer a realistic use case: today, no one prints plain text output. It's just for viewing on a screen, and on a screen there is no need or desire to break tables up vertically into virtual "pages". --- diff --git a/NEWS b/NEWS index fd190d1eca..3263062cac 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,11 @@ See the end for copying conditions. Please send PSPP bug reports to bug-gnu-pspp@gnu.org. +Changes since 1.2.0: + + * Plain text output is no longer divided into pages, since it is now + rarely printed on paper. + Changes from 1.0.1 to 1.2.0: * New experimental command SAVE DATA COLLECTION to save MDD files. diff --git a/doc/invoking.texi b/doc/invoking.texi index bc53ae4dda..813e84e93b 100644 --- a/doc/invoking.texi +++ b/doc/invoking.texi @@ -320,36 +320,10 @@ where @var{RRRR}, @var{GGGG} and @var{BBBB} are 4 character hexadecimal representations of the red, green and blue components respectively. If charts are disabled, this option has no effect. - -@item @option{-O paginate=@var{boolean}} -If set, @pspp{} writes an ASCII formfeed the end of every page. Default: -@code{off}. - -@item @option{-O headers=@var{boolean}} -If enabled, @pspp{} prints two lines of header information giving title -and subtitle, page number, date and time, and @pspp{} version are printed -at the top of every page. These two lines are in addition to any top -margin requested. Default: @code{off}. - -@item @option{-O length=@var{line-count}} -Physical length of a page. Headers and margins are subtracted from -this value. You may specify the number of lines as a number, or for -screen output you may specify @code{auto} to track the height of the -terminal as it changes. Default: @code{66}. - @item @option{-O width=@var{character-count}} -Width of a page, in characters. Margins are subtracted from this -value. For screen output you may specify @code{auto} in place of a -number to track the width of the terminal as it changes. Default: -@code{79}. - -@item @option{-O top-margin=@var{top-margin-lines}} -Length of the top margin, in lines. @pspp{} subtracts this value from -the page length. Default: @code{0}. - -@item @option{-O bottom-margin=@var{bottom-margin-lines}} -Length of the bottom margin, in lines. @pspp{} subtracts this value from -the page length. Default: @code{0}. +Width of a page, in characters. For screen output you may specify +@code{auto} in place of a number to track the width of the terminal as +it changes. Default: @code{79}. @item @option{-O box=@{ascii|unicode@}} Sets the characters used for lines in tables. diff --git a/src/output/ascii.c b/src/output/ascii.c index f53feeaa91..c6a8ee51de 100644 --- a/src/output/ascii.c +++ b/src/output/ascii.c @@ -51,6 +51,7 @@ #include "gl/minmax.h" #include "gl/xalloc.h" +#include "gl/xsize.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -153,9 +154,6 @@ struct ascii_driver /* User parameters. */ bool append; /* Append if output file already exists? */ - bool headers; /* Print headers at top of page? */ - bool paginate; /* Insert formfeeds? */ - bool squeeze_blank_lines; /* Squeeze multiple blank lines into one? */ enum emphasis_style emphasis; /* How to emphasize text. */ char *chart_file_name; /* Name of files used for charts. */ @@ -166,12 +164,7 @@ struct ascii_driver #endif int width; /* Page width. */ - int length; /* Page length minus margins and header. */ bool auto_width; /* Use viewwidth as page width? */ - bool auto_length; /* Use viewlength as page width? */ - - int top_margin; /* Top margin in lines. */ - int bottom_margin; /* Bottom margin in lines. */ int min_break[TABLE_N_AXES]; /* Min cell size to break across pages. */ @@ -179,28 +172,21 @@ struct ascii_driver /* Internal state. */ char *command_name; - char *title; - char *subtitle; struct file_handle *handle; FILE *file; /* Output file. */ bool error; /* Output error? */ - int page_number; /* Current page number. */ struct u8_line *lines; /* Page content. */ int allocated_lines; /* Number of lines allocated. */ int chart_cnt; /* Number of charts so far. */ - int x, y; }; static const struct output_driver_class ascii_driver_class; static void ascii_submit (struct output_driver *, const struct output_item *); -static int vertical_margins (const struct ascii_driver *); - static bool update_page_size (struct ascii_driver *, bool issue_error); static int parse_page_size (struct driver_option *); -static void ascii_close_page (struct ascii_driver *); static bool ascii_open_page (struct ascii_driver *); static void ascii_draw_line (void *, int bb[TABLE_N_AXES][2], @@ -213,20 +199,6 @@ static void ascii_draw_cell (void *, const struct table_cell *, int footnote_idx, int bb[TABLE_N_AXES][2], int clip[TABLE_N_AXES][2]); -static void -reallocate_lines (struct ascii_driver *a) -{ - if (a->length > a->allocated_lines) - { - int i; - a->lines = xnrealloc (a->lines, a->length, sizeof *a->lines); - for (i = a->allocated_lines; i < a->length; i++) - u8_line_init (&a->lines[i]); - a->allocated_lines = a->length; - } -} - - static struct ascii_driver * ascii_driver_cast (struct output_driver *driver) { @@ -249,15 +221,11 @@ ascii_create (struct file_handle *fh, enum settings_output_devices device_type, int min_break[TABLE_N_AXES]; struct output_driver *d; struct ascii_driver *a; - int paper_length; a = xzalloc (sizeof *a); d = &a->driver; output_driver_init (&a->driver, &ascii_driver_class, fh_get_file_name (fh), device_type); a->append = parse_boolean (opt (d, o, "append", "false")); - a->headers = parse_boolean (opt (d, o, "headers", "false")); - a->paginate = parse_boolean (opt (d, o, "paginate", "false")); - a->squeeze_blank_lines = parse_boolean (opt (d, o, "squeeze", "true")); a->emphasis = parse_enum (opt (d, o, "emphasis", "none"), "bold", EMPH_BOLD, "underline", EMPH_UNDERLINE, @@ -267,19 +235,11 @@ ascii_create (struct file_handle *fh, enum settings_output_devices device_type, a->chart_file_name = parse_chart_file_name (opt (d, o, "charts", fh_get_file_name (fh))); a->handle = fh; - a->top_margin = parse_int (opt (d, o, "top-margin", "0"), 0, INT_MAX); - a->bottom_margin = parse_int (opt (d, o, "bottom-margin", "0"), 0, INT_MAX); - min_break[H] = parse_int (opt (d, o, "min-hbreak", "-1"), -1, INT_MAX); - min_break[V] = parse_int (opt (d, o, "min-vbreak", "-1"), -1, INT_MAX); a->width = parse_page_size (opt (d, o, "width", "79")); - paper_length = parse_page_size (opt (d, o, "length", "66")); a->auto_width = a->width < 0; - a->auto_length = paper_length < 0; - a->length = paper_length - vertical_margins (a); a->min_break[H] = min_break[H] >= 0 ? min_break[H] : a->width / 2; - a->min_break[V] = min_break[V] >= 0 ? min_break[V] : a->length / 2; #ifdef HAVE_CAIRO parse_color (d, o, "background-color", "#FFFFFFFFFFFF", &a->bg); parse_color (d, o, "foreground-color", "#000000000000", &a->fg); @@ -291,11 +251,8 @@ ascii_create (struct file_handle *fh, enum settings_output_devices device_type, a->box = box == BOX_ASCII ? ascii_box_chars : unicode_box_chars; a->command_name = NULL; - a->title = xstrdup (""); - a->subtitle = xstrdup (""); a->file = NULL; a->error = false; - a->page_number = 0; a->lines = NULL; a->allocated_lines = 0; a->chart_cnt = 1; @@ -339,15 +296,8 @@ parse_page_size (struct driver_option *option) return dim; } -static int -vertical_margins (const struct ascii_driver *a) -{ - return a->top_margin + a->bottom_margin + (a->headers ? 3 : 0); -} - -/* Re-calculates the page width and length based on settings, - margins, and, if "auto" is set, the size of the user's - terminal window or GUI output window. */ +/* Re-calculates the page width based on settings, margins, and, if "auto" is + set, the size of the user's terminal window or GUI output window. */ static bool update_page_size (struct ascii_driver *a, bool issue_error) { @@ -358,30 +308,20 @@ update_page_size (struct ascii_driver *a, bool issue_error) a->width = settings_get_viewwidth (); a->min_break[H] = a->width / 2; } - if (a->auto_length) - { - a->length = settings_get_viewlength () - vertical_margins (a); - a->min_break[V] = a->length / 2; - } - if (a->width < MIN_WIDTH || a->length < MIN_LENGTH) + if (a->width < MIN_WIDTH) { if (issue_error) msg (ME, - _("ascii: page excluding margins and headers " - "must be at least %d characters wide by %d lines long, but " - "as configured is only %d characters by %d lines"), - MIN_WIDTH, MIN_LENGTH, - a->width, a->length); + _("ascii: page must be at least %d characters wide, but " + "as configured is only %d characters"), + MIN_WIDTH, + a->width); if (a->width < MIN_WIDTH) a->width = MIN_WIDTH; - if (a->length < MIN_LENGTH) - a->length = MIN_LENGTH; return false; } - reallocate_lines (a); - return true; } @@ -391,15 +331,10 @@ ascii_destroy (struct output_driver *driver) struct ascii_driver *a = ascii_driver_cast (driver); int i; - if (a->y > 0) - ascii_close_page (a); - if (a->file != NULL) fn_close (a->handle, a->file); fh_unref (a->handle); free (a->command_name); - free (a->title); - free (a->subtitle); free (a->chart_file_name); for (i = 0; i < a->allocated_lines; i++) u8_line_destroy (&a->lines[i]); @@ -411,13 +346,23 @@ static void ascii_flush (struct output_driver *driver) { struct ascii_driver *a = ascii_driver_cast (driver); - if (a->y > 0) + if (a->file) + fflush (a->file); +} + +static void +ascii_output_lines (struct ascii_driver *a, size_t n_lines) +{ + for (size_t y = 0; y < n_lines; y++) { - ascii_close_page (a); + struct u8_line *line = &a->lines[y]; + + while (ds_chomp_byte (&line->s, ' ')) + continue; + fwrite (ds_data (&line->s), 1, ds_length (&line->s), a->file); + putc ('\n', a->file); - if (fn_close (a->handle, a->file) != 0) - msg_error (errno, _("ascii: closing output file `%s'"), fh_get_file_name (a->handle)); - a->file = NULL; + u8_line_clear (&a->lines[y]); } } @@ -438,7 +383,7 @@ ascii_output_table_item (struct ascii_driver *a, params.draw_cell = ascii_draw_cell; params.aux = a; params.size[H] = a->width; - params.size[V] = a->length; + params.size[V] = INT_MAX; params.font_size[H] = 1; params.font_size[V] = 1; for (i = 0; i < RENDER_N_LINES; i++) @@ -451,31 +396,17 @@ ascii_output_table_item (struct ascii_driver *a, params.min_break[i] = a->min_break[i]; params.supports_margins = false; - if (a->file == NULL && !ascii_open_page (a)) + if (a->file) + putc ('\n', a->file); + else if (!ascii_open_page (a)) return; p = render_pager_create (¶ms, table_item); - while (render_pager_has_next (p)) + for (int i = 0; render_pager_has_next (p); i++) { - int used; - - if (a->y > 0) - a->y++; - used = render_pager_draw_next (p, a->length - a->y); - if (used == 0) - { - /* Make sure that we're not in a loop where the table we're rendering - can't be broken to fit on a page. (The check on - render_pager_has_next() allows for objects that turn out to be - empty when we try to render them.) */ - assert (a->y > 0 || !render_pager_has_next (p)); - - ascii_close_page (a); - if (!ascii_open_page (a)) - break; - } - else - a->y += used; + if (i) + putc ('\n', a->file); + ascii_output_lines (a, render_pager_draw_next (p, INT_MAX)); } render_pager_destroy (p); } @@ -536,27 +467,15 @@ ascii_submit (struct output_driver *driver, switch (type) { case TEXT_ITEM_TITLE: - free (a->title); - a->title = xstrdup (text); - break; - case TEXT_ITEM_SUBTITLE: - free (a->subtitle); - a->subtitle = xstrdup (text); - break; - case TEXT_ITEM_COMMAND_OPEN: case TEXT_ITEM_COMMAND_CLOSE: break; case TEXT_ITEM_BLANK_LINE: - if (a->y > 0) - a->y++; break; case TEXT_ITEM_EJECT_PAGE: - if (a->y > 0) - ascii_close_page (a); break; default: @@ -608,11 +527,11 @@ ascii_draw_line (void *a_, int bb[TABLE_N_AXES][2], int x, y; /* Clip to the page. */ - x0 = MAX (bb[H][0] + a->x, 0); - y0 = MAX (bb[V][0] + a->y, 0); - x1 = MIN (bb[H][1] + a->x, a->width); - y1 = MIN (bb[V][1] + a->y, a->length); - if (x1 <= 0 || y1 <= 0 || x0 >= a->width || y0 >= a->length) + x0 = MAX (bb[H][0], 0); + y0 = MAX (bb[V][0], 0); + x1 = MIN (bb[H][1], a->width); + y1 = bb[V][1]; + if (x1 <= 0 || y1 <= 0 || x0 >= a->width) return; /* Draw. */ @@ -688,7 +607,16 @@ ascii_draw_cell (void *a_, const struct table_cell *cell, int footnote_idx, static char * ascii_reserve (struct ascii_driver *a, int y, int x0, int x1, int n) { - assert (y < a->allocated_lines); + if (y >= a->allocated_lines) + { + size_t new_alloc = MAX (25, a->allocated_lines); + while (new_alloc <= y) + new_alloc = xtimes (new_alloc, 2); + a->lines = xnrealloc (a->lines, new_alloc, sizeof *a->lines); + for (size_t i = a->allocated_lines; i < new_alloc; i++) + u8_line_init (&a->lines[i]); + a->allocated_lines = new_alloc; + } return u8_line_reserve (&a->lines[y], x0, x1, n); } @@ -697,13 +625,12 @@ text_draw (struct ascii_driver *a, unsigned int options, int bb[TABLE_N_AXES][2], int clip[TABLE_N_AXES][2], int y, const uint8_t *string, int n, size_t width) { - int x0 = MAX (0, clip[H][0] + a->x); - int y0 = MAX (0, clip[V][0] + a->y); - int x1 = MIN (a->width, clip[H][1] + a->x); - int y1 = MIN (a->length, clip[V][1] + a->y); + int x0 = MAX (0, clip[H][0]); + int y0 = MAX (0, clip[V][0]); + int x1 = MIN (a->width, clip[H][1]); + int y1 = clip[V][1]; int x; - y += a->y; if (y < y0 || y >= y1) return; @@ -721,7 +648,6 @@ text_draw (struct ascii_driver *a, unsigned int options, default: NOT_REACHED (); } - x += a->x; if (x >= x1) return; @@ -988,7 +914,6 @@ ascii_test_write (struct output_driver *driver, if (a->file == NULL && !ascii_open_page (a)) return; - a->y = 0; contents.options = options | TAB_LEFT; contents.text = CONST_CAST (char *, s); @@ -1001,11 +926,9 @@ ascii_test_write (struct output_driver *driver, bb[TABLE_HORZ][0] = x; bb[TABLE_HORZ][1] = a->width; bb[TABLE_VERT][0] = y; - bb[TABLE_VERT][1] = a->length; + bb[TABLE_VERT][1] = INT_MAX; ascii_layout_cell (a, &cell, 0, bb, bb, &width, &height); - - a->y = 1; } void @@ -1016,10 +939,23 @@ ascii_test_set_length (struct output_driver *driver, int y, int length) if (a->file == NULL && !ascii_open_page (a)) return; - if (y < 0 || y >= a->length) + if (y < 0) return; u8_line_set_length (&a->lines[y], length); } + +void +ascii_test_flush (struct output_driver *driver) +{ + struct ascii_driver *a = ascii_driver_cast (driver); + + for (size_t i = a->allocated_lines; i-- > 0; ) + if (a->lines[i].width) + { + ascii_output_lines (a, i + 1); + break; + } +} /* ascii_close_page () and support routines. */ @@ -1036,8 +972,6 @@ winch_handler (int signum UNUSED) static bool ascii_open_page (struct ascii_driver *a) { - int i; - if (a->error) return false; @@ -1057,7 +991,6 @@ ascii_open_page (struct ascii_driver *a) sigaction (SIGWINCH, &action, NULL); #endif a->auto_width = true; - a->auto_length = true; } } else @@ -1069,94 +1002,5 @@ ascii_open_page (struct ascii_driver *a) } } - a->page_number++; - - reallocate_lines (a); - - for (i = 0; i < a->length; i++) - u8_line_clear (&a->lines[i]); - return true; } - -static void -output_title_line (FILE *out, int width, const char *left, const char *right) -{ - struct string s = DS_EMPTY_INITIALIZER; - ds_put_byte_multiple (&s, ' ', width); - if (left != NULL) - { - size_t length = MIN (strlen (left), width); - memcpy (ds_end (&s) - width, left, length); - } - if (right != NULL) - { - size_t length = MIN (strlen (right), width); - memcpy (ds_end (&s) - length, right, length); - } - ds_put_byte (&s, '\n'); - fputs (ds_cstr (&s), out); - ds_destroy (&s); -} - -static void -ascii_close_page (struct ascii_driver *a) -{ - bool any_blank; - int i, y; - - a->y = 0; - if (a->file == NULL) - return; - - if (!a->top_margin && !a->bottom_margin && a->squeeze_blank_lines - && !a->paginate && a->page_number > 1) - putc ('\n', a->file); - - for (i = 0; i < a->top_margin; i++) - putc ('\n', a->file); - if (a->headers) - { - char *r1, *r2; - - r1 = xasprintf (_("%s - Page %d"), get_start_date (), a->page_number); - r2 = xasprintf ("%s - %s" , version, host_system); - - output_title_line (a->file, a->width, a->title, r1); - output_title_line (a->file, a->width, a->subtitle, r2); - putc ('\n', a->file); - - free (r1); - free (r2); - } - - any_blank = false; - for (y = 0; y < a->allocated_lines; y++) - { - struct u8_line *line = &a->lines[y]; - - if (a->squeeze_blank_lines && y > 0 && line->width == 0) - any_blank = true; - else - { - if (any_blank) - { - putc ('\n', a->file); - any_blank = false; - } - - while (ds_chomp_byte (&line->s, ' ')) - continue; - fwrite (ds_data (&line->s), 1, ds_length (&line->s), a->file); - putc ('\n', a->file); - } - } - if (!a->squeeze_blank_lines) - for (y = a->allocated_lines; y < a->length; y++) - putc ('\n', a->file); - - for (i = 0; i < a->bottom_margin; i++) - putc ('\n', a->file); - if (a->paginate) - putc ('\f', a->file); -} diff --git a/src/output/ascii.h b/src/output/ascii.h index bf68cafec7..eb4e4afec6 100644 --- a/src/output/ascii.h +++ b/src/output/ascii.h @@ -22,5 +22,6 @@ struct output_driver; void ascii_test_write (struct output_driver *, const char *s, int x, int y, unsigned int options); void ascii_test_set_length (struct output_driver *, int y, int length); +void ascii_test_flush (struct output_driver *); #endif /* ascii.h */ diff --git a/src/output/driver.c b/src/output/driver.c index 58e7850d4e..bb5aa3a8b9 100644 --- a/src/output/driver.c +++ b/src/output/driver.c @@ -139,9 +139,13 @@ flush_deferred_syntax (struct output_engine *e) { if (!ds_is_empty (&e->deferred_syntax)) { - char *syntax = ds_steal_cstr (&e->deferred_syntax); - output_submit__ (e, text_item_super ( - text_item_create_nocopy (TEXT_ITEM_SYNTAX, syntax))); + ds_trim (&e->deferred_syntax, ss_cstr ("\n")); + if (!ds_is_empty (&e->deferred_syntax)) + { + char *syntax = ds_steal_cstr (&e->deferred_syntax); + output_submit__ (e, text_item_super (text_item_create_nocopy ( + TEXT_ITEM_SYNTAX, syntax))); + } } } diff --git a/tests/output/ascii.at b/tests/output/ascii.at index dfdd4b6497..3f13ea8e8d 100644 --- a/tests/output/ascii.at +++ b/tests/output/ascii.at @@ -550,18 +550,18 @@ set-length 2 2 set-length 3 1 set-length 4 0 +0 5 0 あい 0 6 0 あい 0 7 0 あい 0 8 0 あい 0 9 0 あい 0 10 0 あい -0 11 0 あい -set-length 6 5 -set-length 7 4 -set-length 8 3 -set-length 9 2 -set-length 10 1 -set-length 11 0 +set-length 5 5 +set-length 6 4 +set-length 7 3 +set-length 8 2 +set-length 9 1 +set-length 10 0 ]) AT_CHECK([render-test --draw-mode input], [0], [dnl àéî diff --git a/tests/output/render-test.c b/tests/output/render-test.c index 2c68381331..03e4238e41 100644 --- a/tests/output/render-test.c +++ b/tests/output/render-test.c @@ -140,15 +140,9 @@ 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)); - } + string_map_insert_nocopy (&options, xstrdup ("min-hbreak"), + xasprintf ("%d", min_break)); if (emphasis != NULL) string_map_insert (&options, "emphasis", emphasis); if (box != NULL) @@ -490,4 +484,5 @@ draw (FILE *stream) else error (1, 0, "line %d has invalid format", line); } + ascii_test_flush (ascii_driver); } diff --git a/tests/output/render.at b/tests/output/render.at index 3a12da4c2c..d5e971757a 100644 --- a/tests/output/render.at +++ b/tests/output/render.at @@ -1293,8 +1293,6 @@ KL| | | | +-+--+ | 123| -| 456| - | 456| | 789| | | @@ -1367,1339 +1365,11 @@ KL| | | 123| | 456| | 789| - | | +----+ ]) AT_CLEANUP -AT_BANNER([output rendering -- vertical page breaks]) - -AT_SETUP([breaking column of many small cells]) -AT_KEYWORDS([render rendering]) -AT_CAPTURE_FILE([input]) -AT_DATA([input], [20 1 -m4_for([x], [1], [20], [1], [@x -])]) -AT_CHECK([render-test --length=10 input], [0], [dnl -+--+ -| 1| -+--+ -| 2| -+--+ -| 3| -+--+ -| 4| -+--+ - -+--+ -| 5| -+--+ -| 6| -+--+ -| 7| -+--+ -| 8| -+--+ - -+--+ -| 9| -+--+ -|10| -+--+ -|11| -+--+ -|12| -+--+ - -+--+ -|13| -+--+ -|14| -+--+ -|15| -+--+ -|16| -+--+ - -+--+ -|17| -+--+ -|18| -+--+ -|19| -+--+ -|20| -+--+ -]) -AT_CHECK([render-test -o mb0 --min-break=0 --length=10 input], [0], [dnl -+--+ -| 1| -+--+ -| 2| -+--+ -| 3| -+--+ -| 4| -+--+ - -+--+ -| 5| -+--+ -| 6| -+--+ -| 7| -+--+ -| 8| -+--+ - -+--+ -| 9| -+--+ -|10| -+--+ -|11| -+--+ -|12| -+--+ - -+--+ -|13| -+--+ -|14| -+--+ -|15| -+--+ -|16| -+--+ - -+--+ -|17| -+--+ -|18| -+--+ -|19| -+--+ -|20| -+--+ -]) -AT_CLEANUP - -AT_SETUP([breaking column of many small cells, with headers]) -AT_KEYWORDS([render rendering]) -AT_CAPTURE_FILE([input]) -AT_DATA([input], [17 1 0 0 1 1 -@a -m4_for([x], [1], [15], [1], [@x -])@b -]) -AT_CHECK([render-test --length=13 input], [0], [dnl -+--+ -| a| -+--+ -| 1| -+--+ -| 2| -+--+ -| 3| -+--+ -| 4| -+--+ -| b| -+--+ - -+--+ -| a| -+--+ -| 5| -+--+ -| 6| -+--+ -| 7| -+--+ -| 8| -+--+ -| b| -+--+ - -+--+ -| a| -+--+ -| 9| -+--+ -|10| -+--+ -|11| -+--+ -|12| -+--+ -| b| -+--+ - -+--+ -| a| -+--+ -|13| -+--+ -|14| -+--+ -|15| -+--+ -| b| -+--+ -]) -AT_CHECK([render-test -o mb0 --min-break=0 --length=13 input], [0], [dnl -+--+ -| a| -+--+ -| 1| -+--+ -| 2| -+--+ -| 3| -+--+ -| 4| -+--+ -| b| -+--+ - -+--+ -| a| -+--+ -| 5| -+--+ -| 6| -+--+ -| 7| -+--+ -| 8| -+--+ -| b| -+--+ - -+--+ -| a| -+--+ -| 9| -+--+ -|10| -+--+ -|11| -+--+ -|12| -+--+ -| b| -+--+ - -+--+ -| a| -+--+ -|13| -+--+ -|14| -+--+ -|15| -+--+ -| b| -+--+ -]) -AT_CLEANUP - -AT_SETUP([disabling too-big headers]) -AT_KEYWORDS([render rendering]) -AT_CAPTURE_FILE([input]) -AT_DATA([input], [17 1 0 0 1 1 -@a -m4_for([x], [1], [15], [1], [@x -])@b -]) -AT_DATA([expout], [dnl -+--+ -| a| -+--+ -| 1| -+--+ -| 2| -+--+ -| 3| -+--+ - -+--+ -| 4| -+--+ -| 5| -+--+ -| 6| -+--+ -| 7| -+--+ - -+--+ -| 8| -+--+ -| 9| -+--+ -|10| -+--+ -|11| -+--+ - -+--+ -|12| -+--+ -|13| -+--+ -|14| -+--+ -|15| -+--+ - -+--+ -| b| -+--+ -]) -AT_CHECK([render-test --length=10 input], [0], [expout]) -AT_CHECK([render-test -o mb0 --min-break=0 --length=10 input], [0], [expout]) -AT_CLEANUP - -AT_SETUP([breaking column of many medium-size cells]) -AT_KEYWORDS([render rendering]) -AT_CAPTURE_FILE([input]) -AT_DATA([input], [20 1 -m4_for([x], [1], [20], [1], [@top x\ncell x\nbottom x -])]) -AT_CHECK([render-test --length 10 input], [0], [dnl -+---------+ -| top 1| -| cell 1| -| bottom 1| -+---------+ -| top 2| -| cell 2| -| bottom 2| -+---------+ - -+---------+ -| top 3| -| cell 3| -| bottom 3| -+---------+ -| top 4| -| cell 4| -| bottom 4| -+---------+ - -+---------+ -| top 5| -| cell 5| -| bottom 5| -+---------+ -| top 6| -| cell 6| -| bottom 6| -+---------+ - -+---------+ -| top 7| -| cell 7| -| bottom 7| -+---------+ -| top 8| -| cell 8| -| bottom 8| -+---------+ - -+---------+ -| top 9| -| cell 9| -| bottom 9| -+---------+ -| top 10| -| cell 10| -|bottom 10| -+---------+ - -+---------+ -| top 11| -| cell 11| -|bottom 11| -+---------+ -| top 12| -| cell 12| -|bottom 12| -+---------+ - -+---------+ -| top 13| -| cell 13| -|bottom 13| -+---------+ -| top 14| -| cell 14| -|bottom 14| -+---------+ - -+---------+ -| top 15| -| cell 15| -|bottom 15| -+---------+ -| top 16| -| cell 16| -|bottom 16| -+---------+ - -+---------+ -| top 17| -| cell 17| -|bottom 17| -+---------+ -| top 18| -| cell 18| -|bottom 18| -+---------+ - -+---------+ -| top 19| -| cell 19| -|bottom 19| -+---------+ -| top 20| -| cell 20| -|bottom 20| -+---------+ -]) -AT_CHECK([render-test -o mb0 --min-break=0 --length 10 input], [0], [dnl -+---------+ -| top 1| -| cell 1| -| bottom 1| -+---------+ -| top 2| -| cell 2| -| bottom 2| -+---------+ -| top 3| - -| cell 3| -| bottom 3| -+---------+ -| top 4| -| cell 4| -| bottom 4| -+---------+ -| top 5| -| cell 5| - -| bottom 5| -+---------+ -| top 6| -| cell 6| -| bottom 6| -+---------+ -| top 7| -| cell 7| -| bottom 7| -+---------+ - -+---------+ -| top 8| -| cell 8| -| bottom 8| -+---------+ -| top 9| -| cell 9| -| bottom 9| -+---------+ -| top 10| - -| cell 10| -|bottom 10| -+---------+ -| top 11| -| cell 11| -|bottom 11| -+---------+ -| top 12| -| cell 12| - -|bottom 12| -+---------+ -| top 13| -| cell 13| -|bottom 13| -+---------+ -| top 14| -| cell 14| -|bottom 14| -+---------+ - -+---------+ -| top 15| -| cell 15| -|bottom 15| -+---------+ -| top 16| -| cell 16| -|bottom 16| -+---------+ -| top 17| - -| cell 17| -|bottom 17| -+---------+ -| top 18| -| cell 18| -|bottom 18| -+---------+ -| top 19| -| cell 19| - -|bottom 19| -+---------+ -| top 20| -| cell 20| -|bottom 20| -+---------+ -]) -AT_CLEANUP - -AT_SETUP([breaking 3 columns with many joined cells]) -AT_KEYWORDS([render rendering]) -AT_CAPTURE_FILE([input]) -# +--+--+ -# a| 1|11| -# +--+ab| -# b| 2|cd| -# |ab+--+ -# c|cd|12| -# +--+ab| -# d| 3|cd| -# |ab+--+ -# e|cd|13| -# +--+ab| -# f| 4|cd| -# |ab+--+ -# g|cd|14| -# +--+ab| -# h| 5|cd| -# |ab+--+ -# i|cd|15| -# +--+ab| -# j| 6|cd| -# |ab+--+ -# k|cd|16| -# +--+ab| -# l| 7|cd| -# |ab+--+ -# m|cd|17| -# +--+ab| -# n| 8|cd| -# |ab+--+ -# o|cd|18| -# +--+ab| -# p| 9|cd| -# |ab+--+ -# q|cd|19| -# +--+ab| -# r|10|cd| -# |ab+--+ -# s|cd|20| -# +--+--+ -AT_DATA([input], [3 19 -m4_foreach([x], [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s], [x -])@1 -m4_for([x], [2], [19], [1], [1*2 @x\nab\ncd -])@20 -]) -AT_DATA([expout], [dnl - +--+--+ -a| 1|11| - +--+ab| -b| 2|cd| - |ab+--+ - - |ab+--+ -c|cd|12| - +--+ab| -d| 3|cd| - |ab+--+ - - |ab+--+ -e|cd|13| - +--+ab| -f| 4|cd| - |ab+--+ - - |ab+--+ -g|cd|14| - +--+ab| -h| 5|cd| - |ab+--+ - - |ab+--+ -i|cd|15| - +--+ab| -j| 6|cd| - |ab+--+ - - |ab+--+ -k|cd|16| - +--+ab| -l| 7|cd| - |ab+--+ - - |ab+--+ -m|cd|17| - +--+ab| -n| 8|cd| - |ab+--+ - - |ab+--+ -o|cd|18| - +--+ab| -p| 9|cd| - |ab+--+ - - |ab+--+ -q|cd|19| - +--+ab| -r|10|cd| - |ab+--+ - - |ab+--+ -s|cd|20| - +--+--+ -]) -AT_CHECK([render-test --length=6 --transpose input], [0], [expout]) -AT_CHECK([render-test -o mb0 --min-break=0 --length=6 --transpose input], - [0], [expout]) -AT_CLEANUP - -AT_SETUP([vert break 6x6, joined rows and columns]) -AT_KEYWORDS([render rendering]) -AT_DATA([input], [WEAVE_6X6]) -AT_CHECK([render-test --length=6 input], [0], [dnl -+-+---+-+-+-+ -|a|bcd|e|f|i| -+-+-+-+-+g+-+ -|j|m|nop|h|q| -|k+-+---+-+r| - -|k+-+-+---+r| -|l|t|w|xyz|s| -+-+u+-+-+-+-+ -|A|v|B|E|FGH| -+-+-+C+-+---+ - -+---+C+-+-+-+ -|IJK|D|L|O|P| -+-+-+-+M+-+-+ -|Q|RST|N|U|V| -+-+---+-+-+-+ -]) -AT_CHECK([render-test -o mb0 --min-break=0 --length=6 input], [0], [dnl -+-+---+-+-+-+ -|a|bcd|e|f|i| -+-+-+-+-+g+-+ -|j|m|nop|h|q| -|k+-+---+-+r| - -|k+-+-+---+r| -|l|t|w|xyz|s| -+-+u+-+-+-+-+ -|A|v|B|E|FGH| -+-+-+C+-+---+ - -+---+C+-+-+-+ -|IJK|D|L|O|P| -+-+-+-+M+-+-+ -|Q|RST|N|U|V| -+-+---+-+-+-+ -]) -AT_CLEANUP - -AT_SETUP([breaking joined cells too tall for page]) -AT_KEYWORDS([render rendering]) -AT_DATA([input], [4 6 -1*6 @abc\ndef\nghi\njkl\nmno\npqr\nstu\nvwx\nyzA\nBCD\nEFG -1*3 @HIJ\nKLM\nOPQ\nRST\nUVW -1*3 @XYZ\n012\n345\n678\n90a -1*2 @bcd\nefg\nhij -1*2 @klm\nnop\nqrs -1*2 @tuv\nwxy\nzAB -@C -@D -@E -@F -@G -@H -]) -AT_CHECK([render-test --transpose --length=6 input], [0], [dnl -+---+---+---+-+ -|abc|HIJ|bcd|C| -|def|KLM|efg+-+ -|ghi|OPQ|hij|D| -|jkl|RST+---+-+ - -|jkl|RST+---+-+ -|mno|UVW|klm|E| -|pqr+---+nop+-+ -|stu|XYZ|qrs|F| -|vwx|012+---+-+ - -|vwx|012+---+-+ -|yzA|345|tuv|G| -|BCD|678|wxy+-+ -|EFG|90a|zAB|H| -+---+---+---+-+ -]) -AT_CHECK([render-test -o mb0 --min-break=0 --transpose --length=6 input], [0], [dnl -+---+---+---+-+ -|abc|HIJ|bcd|C| -|def|KLM|efg+-+ -|ghi|OPQ|hij|D| -|jkl|RST+---+-+ - -|jkl|RST+---+-+ -|mno|UVW|klm|E| -|pqr+---+nop+-+ -|stu|XYZ|qrs|F| -|vwx|012+---+-+ - -|vwx|012+---+-+ -|yzA|345|tuv|G| -|BCD|678|wxy+-+ -|EFG|90a|zAB|H| -+---+---+---+-+ -]) -AT_CLEANUP - -AT_SETUP([breaking cell too tall for page, no border]) -AT_KEYWORDS([render rendering]) -AT_CAPTURE_FILE([input]) -AT_DATA([input], [1 1 -abc defg hij klmn opq rstu vwx yz ABCDE FGH I JK LMNOP QR STU VWXYZ -]) -AT_CHECK([render-test --width=6 --length=6 input], [0], [dnl - abc - defg - hij - klmn - opq - rstu - -vwx yz - ABCDE - FGH I - JK - LMNOP -QR STU - - VWXYZ -]) -AT_CHECK([render-test -o mb0 --min-break=0 --width=6 --length=6 input], [0], [dnl - abc - defg - hij - klmn - opq - rstu - -vwx yz - ABCDE - FGH I - JK - LMNOP -QR STU - - VWXYZ -]) -AT_CLEANUP - -AT_SETUP([breaking cell too tall for page, with border]) -AT_KEYWORDS([render rendering]) -AT_CAPTURE_FILE([input]) -AT_DATA([input], [1 1 -@abc defg hij klmn opq rstu vwx yz ABCDE FGH I JK LMNOP QR STU VWXYZ -]) -AT_DATA([expout], [dnl -+-----+ -| abc| -| defg| -| hij| -| klmn| -| opq| - -| rstu| -| vwx| -| yz| -|ABCDE| -|FGH I| -| JK| - -|LMNOP| -| QR| -| STU| -|VWXYZ| -+-----+ -]) -AT_CHECK([render-test --width=7 --length=6 input], [0], [expout]) -AT_CHECK([render-test -o mb0 --min-break=0 --width=7 --length=6 input], - [0], [expout]) -AT_CLEANUP - -AT_BANNER([output rendering -- double page breaks]) - -AT_SETUP([double break 6x6, joined rows and columns]) -AT_KEYWORDS([render rendering]) -AT_DATA([input], [WEAVE_6X6]) -AT_CHECK([render-test --width=6 --length=6 input], [0], [dnl -+-+-- -|a|bc -+-+-+ -|j|m| -|k+-+ - -|k+-+ -|l|t| -+-+u| -|A|v| -+-+-+ - -+---+ -|IJK| -+-+-+ -|Q|RS -+-+-- - ---+-+ -cd|e| -+-+-+ -|nop| -+---+ - -+-+-- -|w|xy -+-+-+ -|B|E| -|C+-+ - -|C+-+ -|D|L| -+-+M| -ST|N| ---+-+ - -+-+-+ -|f|i| -|g+-+ -|h|q| -+-+r| - ---+r| -yz|s| -+-+-+ -|FGH| -+---+ - -+-+-+ -|O|P| -+-+-+ -|U|V| -+-+-+ -]) -AT_CHECK([render-test -o mb0 --min-break=0 --width=6 --length=6 input], [0], [dnl -+-+-- -|a|bc -+-+-+ -|j|m| -|k+-+ - -|k+-+ -|l|t| -+-+u| -|A|v| -+-+-+ - -+---+ -|IJK| -+-+-+ -|Q|RS -+-+-- - ---+-+ -cd|e| -+-+-+ -|nop| -+---+ - -+-+-- -|w|xy -+-+-+ -|B|E| -|C+-+ - -|C+-+ -|D|L| -+-+M| -ST|N| ---+-+ - -+-+-+ -|f|i| -|g+-+ -|h|q| -+-+r| - ---+r| -yz|s| -+-+-+ -|FGH| -+---+ - -+-+-+ -|O|P| -+-+-+ -|U|V| -+-+-+ -]) -AT_CLEANUP - -AT_SETUP([double break 8x8, with joins, left and right headers]) -AT_KEYWORDS([render rendering]) -AT_DATA([input], [WEAVE_8X8([1 1 0 0])]) -AT_CHECK([render-test input --width=14 --length=14], [0], [dnl -+-+-+-+-+-+-+ -|a|b|c|d|e|h| -+-+-+-+-+-+-+ -|i|jkl|m|n|t| -+-+-+-+-+-+-+ -|u|v|wxy|z|D| -+-+-+-+-+-+-+ -|E|F|I|JKL|P| -+-+G+-+---+-+ -|Q|H|R|UVW|Y| -+-+-+S+-+-+-+ -|Z|0|T|3|4|8| -+-+1+-+-+-+-+ - -+-+1+---+-+-+ -|9|2|abc|d|h| -+-+-+-+-+-+-+ -|i|j|k|l|m|p| -+-+-+-+-+-+-+ - -+-+--+-+-+ -|a| f|g|h| -+-+--+-+-+ -|i|op|q|t| -+-+--+r+-+ -|u| A|s|D| -+-+ B+-+-+ - -+-+ B+-+-+ -|E| C|M|P| -+-+--+N+-+ -|Q| X|O|Y| -+-+--+-+-+ -|Z|56|7|8| -+-+--+-+-+ -|9| efg|h| -+-+--+-+-+ -|i| n|o|p| -+-+--+-+-+ -]) -AT_CHECK([render-test -o mb0 --min-break=0 input --width=14 --length=14], [0], [dnl -+-+-+-+-+-+-+ -|a|b|c|d|e|h| -+-+-+-+-+-+-+ -|i|jkl|m|n|t| -+-+-+-+-+-+-+ -|u|v|wxy|z|D| -+-+-+-+-+-+-+ -|E|F|I|JKL|P| -+-+G+-+---+-+ -|Q|H|R|UVW|Y| -+-+-+S+-+-+-+ -|Z|0|T|3|4|8| -+-+1+-+-+-+-+ - -+-+1+---+-+-+ -|9|2|abc|d|h| -+-+-+-+-+-+-+ -|i|j|k|l|m|p| -+-+-+-+-+-+-+ - -+-+--+-+-+ -|a| f|g|h| -+-+--+-+-+ -|i|op|q|t| -+-+--+r+-+ -|u| A|s|D| -+-+ B+-+-+ - -+-+ B+-+-+ -|E| C|M|P| -+-+--+N+-+ -|Q| X|O|Y| -+-+--+-+-+ -|Z|56|7|8| -+-+--+-+-+ -|9| efg|h| -+-+--+-+-+ -|i| n|o|p| -+-+--+-+-+ -]) -AT_CLEANUP - -AT_SETUP([double break 8x8, with joins, top and bottom headers]) -AT_KEYWORDS([render rendering]) -AT_DATA([input], [WEAVE_8X8([0 0 1 1])]) -AT_CHECK([render-test input --width=14 --length=14], [0], [dnl -+-+-+-+-+-+-+ -|a|b|c|d|e|f| -+-+-+-+-+-+-+ -|i|jkl|m|nop| -+-+-+-+-+-+-+ -|u|v|wxy|z|A| -+-+-+-+-+-+B| -|E|F|I|JKL|C| -+-+G+-+---+-+ -|Q|H|R|UVW|X| -+-+-+-+-+-+-+ -|i|j|k|l|m|n| -+-+-+-+-+-+-+ - -+-+-+-+-+-+-+ -|a|b|c|d|e|f| -+-+-+-+-+-+-+ -|Z|0|S|3|456| -| |1|T| | | -+-+2+-+-+-+-+ -|9| |abc|d|ef -+-+-+-+-+-+-+ -|i|j|k|l|m|n| -+-+-+-+-+-+-+ - -+-+-+ -|g|h| -+-+-+ -|q|t| -|r+-+ -|s|D| -+-+-+ -|M|P| -|N+-+ -|O|Y| -+-+-+ -|o|p| -+-+-+ - -+-+-+ -|g|h| -+-+-+ -|7|8| -| | | -+-+-+ -fg|h| -+-+-+ -|o|p| -+-+-+ -]) -AT_CHECK([render-test -o mb0 --min-break=0 input --width=14 --length=14], [0], [dnl -+-+-+-+-+-+-+ -|a|b|c|d|e|f| -+-+-+-+-+-+-+ -|i|jkl|m|nop| -+-+-+-+-+-+-+ -|u|v|wxy|z|A| -+-+-+-+-+-+B| -|E|F|I|JKL|C| -+-+G+-+---+-+ -|Q|H|R|UVW|X| -+-+-+-+-+-+-+ -|i|j|k|l|m|n| -+-+-+-+-+-+-+ - -+-+-+-+-+-+-+ -|a|b|c|d|e|f| -+-+-+-+-+-+-+ -|Z|0|S|3|456| -| |1|T| | | -+-+2+-+-+-+-+ -|9| |abc|d|ef -+-+-+-+-+-+-+ -|i|j|k|l|m|n| -+-+-+-+-+-+-+ - -+-+-+ -|g|h| -+-+-+ -|q|t| -|r+-+ -|s|D| -+-+-+ -|M|P| -|N+-+ -|O|Y| -+-+-+ -|o|p| -+-+-+ - -+-+-+ -|g|h| -+-+-+ -|7|8| -| | | -+-+-+ -fg|h| -+-+-+ -|o|p| -+-+-+ -]) -AT_CLEANUP - -AT_SETUP([double break 8x8, with joins, all headers]) -AT_KEYWORDS([render rendering]) -AT_DATA([input], [WEAVE_8X8([1 1 1 1])]) -AT_CHECK([render-test input --width=14 --length=14], [0], [dnl -+-+-+-+-+-+-+ -|a|b|c|d|e|h| -+-+-+-+-+-+-+ -|i|jkl|m|n|t| -+-+-+-+-+-+-+ -|u|v|wxy|z|D| -+-+-+-+-+-+-+ -|E|F|I|JKL|P| -+-+G+-+---+-+ -|Q|H|R|UVW|Y| -+-+-+-+-+-+-+ -|i|j|k|l|m|p| -+-+-+-+-+-+-+ - -+-+-+-+-+-+-+ -|a|b|c|d|e|h| -+-+-+-+-+-+-+ -|Z|0|S|3|4|8| -| |1|T| | | | -+-+2+-+-+-+-+ -|9| |abc|d|h| -+-+-+-+-+-+-+ -|i|j|k|l|m|p| -+-+-+-+-+-+-+ - -+-+--+-+-+ -|a| f|g|h| -+-+--+-+-+ -|i|op|q|t| -+-+--+r+-+ -|u| A|s|D| -+-+ B+-+-+ -|E| C|M|P| -+-+--+N+-+ -|Q| X|O|Y| -+-+--+-+-+ -|i| n|o|p| -+-+--+-+-+ - -+-+--+-+-+ -|a| f|g|h| -+-+--+-+-+ -|Z|56|7|8| -| | | | | -+-+--+-+-+ -|9| efg|h| -+-+--+-+-+ -|i| n|o|p| -+-+--+-+-+ -]) -AT_CHECK([render-test -o mb0 --min-break=0 input --width=14 --length=14], [0], [dnl -+-+-+-+-+-+-+ -|a|b|c|d|e|h| -+-+-+-+-+-+-+ -|i|jkl|m|n|t| -+-+-+-+-+-+-+ -|u|v|wxy|z|D| -+-+-+-+-+-+-+ -|E|F|I|JKL|P| -+-+G+-+---+-+ -|Q|H|R|UVW|Y| -+-+-+-+-+-+-+ -|i|j|k|l|m|p| -+-+-+-+-+-+-+ - -+-+-+-+-+-+-+ -|a|b|c|d|e|h| -+-+-+-+-+-+-+ -|Z|0|S|3|4|8| -| |1|T| | | | -+-+2+-+-+-+-+ -|9| |abc|d|h| -+-+-+-+-+-+-+ -|i|j|k|l|m|p| -+-+-+-+-+-+-+ - -+-+--+-+-+ -|a| f|g|h| -+-+--+-+-+ -|i|op|q|t| -+-+--+r+-+ -|u| A|s|D| -+-+ B+-+-+ -|E| C|M|P| -+-+--+N+-+ -|Q| X|O|Y| -+-+--+-+-+ -|i| n|o|p| -+-+--+-+-+ - -+-+--+-+-+ -|a| f|g|h| -+-+--+-+-+ -|Z|56|7|8| -| | | | | -+-+--+-+-+ -|9| efg|h| -+-+--+-+-+ -|i| n|o|p| -+-+--+-+-+ -]) -AT_CLEANUP - -AT_SETUP([double break joined cells too big for page]) -AT_KEYWORDS([render rendering]) -AT_DATA([input], [7 7 -@a -@b -@c -@d -@e -@f -@g -@h -6*6 @The MISSING subcommand determines the handling of missing variables. If INCLUDE is set, then user‑missing values are included in the calculations. If NOINCLUDE is set, which is the default, user‑missing values are excluded. -@i -@j -@k -@l -@m -]) -AT_CHECK([render-test --width=15 --length=15 input], [0], [dnl -+-+--+--+---+ -|a| b| c| d| -+-+--+--+---+ -|h| The -| | su -+-+ determ -|i| han -| |missing va -| |If INCLUDE -+-+ then user -|j| va -| | include -| | calculati -+-+ NOINCLUDE - -+-+ NOINCLUDE -|k| whic -| | -| | user -+-+ va -|l| e -| | -| | -+-+ -|m| -| | -+-+---------- - -+--+--+--+ -| e| f| g| -+--+--+--+ -e MISSING| -ubcommand| -mines the| -ndling of| -ariables.| -E is set,| -r‑missing| -alues are| -ed in the| -ions. If| -E is set,| - -E is set,| -ch is the| - default,| -r‑missing| -alues are| -excluded.| - | - | - | - | - | ----------+ -]) -AT_CHECK([render-test -o mb0 --min-break=0 --width=15 --length=15 input], [0], [dnl -+-+--+--+---+- -|a| b| c| d| -+-+--+--+---+- -|h| The -| | sub -+-+ determi -|i| hand -| |missing var -| |If INCLUDE -+-+ then user‑ -|j| val -| | included -| | calculatio -+-+ NOINCLUDE -|k| which - -| | d -| | user‑ -+-+ val -|l| ex -| | -| | -+-+ -|m| -| | -+-+----------- - --+--+--+ -e| f| g| --+--+--+ -MISSING| - -command| -nes the| -ling of| -iables.| -is set,| -missing| -ues are| - in the| -ns. If| -is set,| - is the| -efault,| -missing| -ues are| -cluded.| - - | - | - | - | - | --------+ -]) -AT_CLEANUP - AT_BANNER([output rendering -- problematic procedures]) dnl LIST used to put columns right up next to each other without any