diff options
Diffstat (limited to 'gnu/usr.bin/texinfo/makeinfo/multi.c')
-rw-r--r-- | gnu/usr.bin/texinfo/makeinfo/multi.c | 192 |
1 files changed, 104 insertions, 88 deletions
diff --git a/gnu/usr.bin/texinfo/makeinfo/multi.c b/gnu/usr.bin/texinfo/makeinfo/multi.c index 273f1461013..ff6358cb6d3 100644 --- a/gnu/usr.bin/texinfo/makeinfo/multi.c +++ b/gnu/usr.bin/texinfo/makeinfo/multi.c @@ -1,7 +1,7 @@ -/* multi.c -- Multitable stuff for makeinfo. - $Id: multi.c,v 1.1 1996/12/15 21:39:29 downsj Exp $ +/* multi.c -- multitable stuff for makeinfo. + $Id: multi.c,v 1.2 1999/01/11 16:38:13 espie Exp $ - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996, 97 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,10 +17,10 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include <stdio.h> +#include "system.h" #include "makeinfo.h" -#define MAXCOLS 100 /* remove this limit later @@ */ +#define MAXCOLS 100 /* remove this limit later @@ */ /* @@ -38,7 +38,7 @@ * `select_output_environment' function switches from one output * environment to another. * - * Environment #0 (i.e. element #0 of the table) is the regular + * Environment #0 (i.e., element #0 of the table) is the regular * environment that is used when we're not formatting a multitable. * * Environment #N (where N = 1,2,3,...) is the env. for column #N of @@ -55,7 +55,7 @@ struct env int paragraph_is_open; int current_indent; int fill_column; -} envs[MAXCOLS]; /* the environment table */ +} envs[MAXCOLS]; /* the environment table */ /* index in environment table of currently selected environment */ static int current_env_no; @@ -67,6 +67,40 @@ static int last_column; to be drawn, separating rows and columns in the current multitable. */ static int hsep, vsep; +/* Output a row. Have to keep `output_position' up-to-date for each + character we output, or the tags table will be off, leading to + chopped-off output files and undefined nodes (because they're in the + wrong file, etc.). Perhaps it would be better to accumulate this + value somewhere and add it once at the end of the table, or return it + as the value, but this seems simplest. */ +static void +out_char (ch) + int ch; +{ + extern int output_position; + putc (ch, output_stream); + output_position++; +} + + +void +draw_horizontal_separator () +{ + int i, j, s; + + for (s = 0; s < envs[0].current_indent; s++) + out_char (' '); + if (vsep) + out_char ('+'); + for (i = 1; i <= last_column; i++) { + for (j = 0; j <= envs[i].fill_column; j++) + out_char ('-'); + if (vsep) + out_char ('+'); + } + out_char ('\n'); +} + void do_multitable () { @@ -116,7 +150,7 @@ setup_multitable_parameters () char *params = insertion_stack->item_function; int nchars; float columnfrac; - char command[200]; + char command[200]; /* naughty, should be no fixed limits */ int i = 1; /* We implement @hsep and @vsep even though TeX doesn't. @@ -129,22 +163,32 @@ setup_multitable_parameters () params++; if (*params == '@') { - sscanf (params, "%s%n", command, &nchars); + sscanf (params, "%200s", command); + nchars = strlen (command); params += nchars; if (strcmp (command, "@hsep") == 0) - hsep++; + hsep++; else if (strcmp (command, "@vsep") == 0) - vsep++; + vsep++; else if (strcmp (command, "@columnfractions") == 0) { - /* Clobber old environments and create new ones, - starting at #1. Environment #0 is the normal standard output, - so we don't mess with it. */ - for ( ; i <= MAXCOLS; i++) { - if (sscanf (params, "%f%n", &columnfrac, &nchars) < 1) - goto done; - params += nchars; - setup_output_environment (i, (int) (columnfrac * fill_column + .5)); - } + /* Clobber old environments and create new ones, starting at #1. + Environment #0 is the normal output, so don't mess with it. */ + for ( ; i <= MAXCOLS; i++) { + if (sscanf (params, "%f", &columnfrac) < 1) + goto done; + /* Unfortunately, can't use %n since some m68k-hp-bsd libc + doesn't support it. So skip whitespace (preceding the + number) and then non-whitespace (the number). */ + while (*params && (*params == ' ' || *params == '\t')) + params++; + /* Hmm, but what what @columnfractions 3foo. Well, I suppose + it's invalid input anyway. */ + while (*params && *params != ' ' && *params != '\t' + && *params != '\n' && *params != '@') + params++; + setup_output_environment (i, + (int) (columnfrac * (fill_column - current_indent) + .5)); + } } } else if (*params == '{') { @@ -154,18 +198,17 @@ setup_multitable_parameters () } /* This gives us two spaces between columns. Seems reasonable. Really should expand the text, though, so a template of - `@code{foo}' has a width of three, not ten. Also have to match - braces, then. */ + `@code{foo}' has a width of five, not ten. Also have to match + braces, then. How to take into account current_indent here? */ setup_output_environment (i++, params++ - start); } else { - warning ("ignoring stray text `%s' after @multitable", params); + warning (_("ignoring stray text `%s' after @multitable"), params); break; } } done: - flush_output (); inhibit_output_flushing (); @@ -227,12 +270,12 @@ select_output_environment (n) } /* advance to the next environment number */ -int +void nselect_next_environment () { if (current_env_no >= last_column) { - line_error ("Too many columns in multitable item (max %d)", last_column); - return 1; + line_error (_("Too many columns in multitable item (max %d)"), last_column); + return; } select_output_environment (current_env_no + 1); } @@ -240,12 +283,25 @@ nselect_next_environment () static void output_multitable_row (); +/* do anything needed at the beginning of processing a + multitable column. */ +void +init_column () +{ + /* don't indent 1st paragraph in the item */ + cm_noindent (); + + /* throw away possible whitespace after @item or @tab command */ + skip_whitespace (); +} + /* start a new item (row) of a multitable */ +int multitable_item () { if (!multitable_active) { /* impossible, I think. */ - error ("multitable item not in active multitable"); + error (_("multitable item not in active multitable")); exit (1); } if (current_env_no > 0) { @@ -254,7 +310,7 @@ multitable_item () /* start at column 1 */ select_output_environment (1); if (!output_paragraph) { - line_error ("Cannot select column #%d in multitable", current_env_no); + line_error (_("Cannot select column #%d in multitable"), current_env_no); exit (FATAL); } @@ -263,38 +319,10 @@ multitable_item () return 0; } -/* do anything needed at the beginning of processing a - multitable column. */ -init_column () -{ - /* don't indent 1st paragraph in the item */ - cm_noindent (); - - /* throw away possible whitespace after @item or @tab command */ - skip_whitespace (); -} - -/* Output a row. Have to keep `output_position' up-to-date for each - character we output, or the tags table will be off, leading to - chopped-off output files and undefined nodes (because they're in the - wrong file, etc.). Perhaps it would be better to accumulate this - value somewhere and add it once at the end of the table, or return it - as the value, but this seems simplest. */ - -static void -out_char (ch) - int ch; -{ - extern int output_position; - putc (ch, output_stream); - output_position++; -} - - static void output_multitable_row () { - int i, j, remaining; + int i, j, s, remaining; /* offset in the output paragraph of the next char needing to be output for that column. */ @@ -325,29 +353,34 @@ output_multitable_row () /* first, see if there is any work to do */ for (i = 1; i <= last_column; i++) { if (CHAR_ADDR (0) < envs[i].output_paragraph_offset) { - remaining = 1; - break; + remaining = 1; + break; } } if (!remaining) break; - + + for (s = 0; s < envs[0].current_indent; s++) + out_char (' '); + if (vsep) out_char ('|'); for (i = 1; i <= last_column; i++) { + for (s = 0; i < envs[i].current_indent; s++) + out_char (' '); for (j = 0; CHAR_ADDR (j) < envs[i].output_paragraph_offset; j++) { - if (CHAR_AT (j) == '\n') - break; - out_char (CHAR_AT (j)); + if (CHAR_AT (j) == '\n') + break; + out_char (CHAR_AT (j)); } - offset[i] += j + 1; /* skip last text plus skip the newline */ + offset[i] += j + 1; /* skip last text plus skip the newline */ for (; j <= envs[i].fill_column; j++) - out_char (' '); + out_char (' '); if (vsep) - out_char ('|'); /* draw column separator */ + out_char ('|'); /* draw column separator */ } - out_char ('\n'); /* end of line */ + out_char ('\n'); /* end of line */ } if (hsep) @@ -363,27 +396,12 @@ output_multitable_row () #undef CHAR_AT #undef CHAR_ADDR -int -draw_horizontal_separator () -{ - int i, j; - if (vsep) - out_char ('+'); - for (i = 1; i <= last_column; i++) { - for (j = 0; j <= envs[i].fill_column; j++) - out_char ('-'); - if (vsep) - out_char ('+'); - } - out_char ('\n'); -} - /* select a new column in current row of multitable */ void cm_tab () { if (!multitable_active) - error ("ignoring @tab outside of multitable"); + error (_("ignoring @tab outside of multitable")); nselect_next_environment (); init_column (); @@ -394,8 +412,6 @@ cm_tab () void end_multitable () { - int i; - output_multitable_row (); /* Multitables cannot be nested. Otherwise, we'd have to save the @@ -409,10 +425,10 @@ end_multitable () uninhibit_output_flushing (); #if 0 - printf ("** Multicolumn output from last row:\n"); + printf (_("** Multicolumn output from last row:\n")); for (i = 1; i <= last_column; i++) { select_output_environment (i); - printf ("* column #%d: output = %s\n", i, output_paragraph); + printf (_("* column #%d: output = %s\n"), i, output_paragraph); } #endif } |