[BACK]Return to doc2tex.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot / docs

Annotation of OpenXM_contrib/gnuplot/docs/doc2tex.c, Revision 1.1.1.1

1.1       maekawa     1: /*
                      2:  * $Id: doc2tex.c,v 1.21 1998/06/18 14:59:12 ddenholm Exp $
                      3:  *
                      4:  */
                      5:
                      6: /* GNUPLOT - doc2tex.c */
                      7:
                      8: /*[
                      9:  * Copyright 1986 - 1993, 1998   Thomas Williams, Colin Kelley
                     10:  *
                     11:  * Permission to use, copy, and distribute this software and its
                     12:  * documentation for any purpose with or without fee is hereby granted,
                     13:  * provided that the above copyright notice appear in all copies and
                     14:  * that both that copyright notice and this permission notice appear
                     15:  * in supporting documentation.
                     16:  *
                     17:  * Permission to modify the software is granted, but not the right to
                     18:  * distribute the complete modified source code.  Modifications are to
                     19:  * be distributed as patches to the released version.  Permission to
                     20:  * distribute binaries produced by compiling modified sources is granted,
                     21:  * provided you
                     22:  *   1. distribute the corresponding source modifications from the
                     23:  *    released version in the form of a patch file along with the binaries,
                     24:  *   2. add special version identification to distinguish your version
                     25:  *    in addition to the base release version number,
                     26:  *   3. provide your name and address as the primary contact for the
                     27:  *    support of your modified version, and
                     28:  *   4. retain our contact information in regard to use of the base
                     29:  *    software.
                     30:  * Permission to distribute the released version of the source code along
                     31:  * with corresponding source modifications in the form of a patch file is
                     32:  * granted with same provisions 2 through 4 for binary distributions.
                     33:  *
                     34:  * This software is provided "as is" without express or implied warranty
                     35:  * to the extent permitted by applicable law.
                     36: ]*/
                     37:
                     38: /*
                     39:  * doc2tex.c  -- program to convert Gnuplot .DOC format to LaTeX document
                     40:  * Also will work for VMS .HLP files.
                     41:  * Modified by Russell Lang from hlp2ms.c by Thomas Williams
                     42:  * Extended by David Kotz to support quotes ("), backquotes, tables.
                     43:  * Extended by Jens Emmerich to handle '_', '---', paired single
                     44:  * quotes. Changed "-handling. Added pre/post-verbatim hooks.
                     45:  *
                     46:  *
                     47:  * usage:  doc2tex [file.doc [file.tex]]
                     48:  *
                     49:  *   where file.doc is a Gnuplot .DOC file, and file.tex will be an
                     50:  *     article document suitable for printing with LaTeX.
                     51:  *
                     52:  * typical usage for GNUPLOT:
                     53:  *
                     54:  *   doc2tex gnuplot.doc gnuplot.tex
                     55:  *   latex gnuplot.tex ; latex gnuplot.tex
                     56:  */
                     57:
                     58: #ifdef HAVE_CONFIG_H
                     59: # include "config.h"
                     60: #endif
                     61:
                     62: #include "ansichek.h"
                     63: #include "stdfn.h"
                     64: #include "doc2x.h"
                     65:
                     66: void init __PROTO((FILE *));
                     67: void convert __PROTO((FILE *, FILE *));
                     68: void process_line __PROTO((char *, FILE *));
                     69: void section __PROTO((char *, FILE *));
                     70: void puttex __PROTO((char *, FILE *));
                     71: void finish __PROTO((FILE *));
                     72:
                     73: static boolean intable = FALSE;
                     74: static boolean verb = FALSE;
                     75:
                     76: int main(argc, argv)
                     77: int argc;
                     78: char **argv;
                     79: {
                     80:     FILE *infile;
                     81:     FILE *outfile;
                     82:
                     83:     infile = stdin;
                     84:     outfile = stdout;
                     85:
                     86:     if (argc > 3) {
                     87:        fprintf(stderr, "Usage: %s [infile [outfile]]\n", argv[0]);
                     88:        exit(EXIT_FAILURE);
                     89:     }
                     90:     if (argc >= 2) {
                     91:        if ((infile = fopen(argv[1], "r")) == (FILE *) NULL) {
                     92:            fprintf(stderr, "%s: Can't open %s for reading\n",
                     93:                    argv[0], argv[1]);
                     94:            exit(EXIT_FAILURE);
                     95:        }
                     96:     }
                     97:     if (argc == 3) {
                     98:        if ((outfile = fopen(argv[2], "w")) == (FILE *) NULL) {
                     99:            fprintf(stderr, "%s: Can't open %s for writing\n",
                    100:                    argv[0], argv[2]);
                    101:            exit(EXIT_FAILURE);
                    102:        }
                    103:     }
                    104:     init(outfile);
                    105:     convert(infile, outfile);
                    106:     finish(outfile);
                    107:     exit(EXIT_SUCCESS);
                    108: }
                    109:
                    110:
                    111: void init(b)
                    112: FILE *b;
                    113: {
                    114:     (void) fputs("\\input{titlepag.tex}\n", b);
                    115: }
                    116:
                    117:
                    118: void convert(a, b)
                    119: FILE *a, *b;
                    120: {
                    121:     static char line[MAX_LINE_LEN+1];
                    122:
                    123:     while (get_line(line, sizeof(line), a))
                    124:        process_line(line, b);
                    125:
                    126: }
                    127:
                    128: void process_line(line, b)
                    129: char *line;
                    130: FILE *b;
                    131: {
                    132:     switch (line[0]) {         /* control character */
                    133:     case '?':{                 /* interactive help entry */
                    134:            break;              /* ignore */
                    135:        }
                    136:     case '@':{                 /* start/end table */
                    137:            if (intable) {
                    138:                (void) fputs("\\hline\n\\end{tabular}\n", b);
                    139:                (void) fputs("\\end{center}\n", b);
                    140:                intable = FALSE;
                    141:            } else {
                    142:                if (verb) {
                    143:                    (void) fputs("\\end{verbatim}\n", b);
                    144:                    (void) fputs("\\postverbatim\n", b);
                    145:                    verb = FALSE;
                    146:                }
                    147:                (void) fputs("\n\\begin{center}\n", b);
                    148:                /* moved to gnuplot.doc by RCC
                    149:                   (void) fputs("\\begin{tabular}{|ccl|} \\hline\n", b);
                    150:                 */
                    151:                intable = TRUE;
                    152:            }
                    153:            /* ignore rest of line */
                    154:            break;
                    155:        }
                    156:     case '#':{                 /* latex table entry */
                    157:            if (intable)
                    158:                (void) fputs(line + 1, b);      /* copy directly */
                    159:            else {
                    160:                fprintf(stderr, "warning: # line found outside of table\n");
                    161:                fprintf(stderr, "%s\n", line + 1);
                    162:            }
                    163:
                    164:            break;
                    165:        }
                    166:     case '^':{                 /* external link escape */
                    167:            break;              /* ignore */
                    168:        }
                    169:     case '%':{                 /* troff table entry */
                    170:            break;              /* ignore */
                    171:        }
                    172:     case '\n':                 /* empty text line */
                    173:     case ' ':{                 /* normal text line */
                    174:            if (intable)
                    175:                break;          /* ignore while in table */
                    176:            if (line[1] == ' ') {
                    177:                /* verbatim mode */
                    178:                if (!verb) {
                    179:                    (void) fputs("\\preverbatim\n", b);
                    180:                    (void) fputs("\\begin{verbatim}\n", b);
                    181:                    verb = TRUE;
                    182:                }
                    183:                (void) fputs(line + 2, b);
                    184:            } else {
                    185:                if (verb) {
                    186:                    (void) fputs("\\end{verbatim}\n", b);
                    187:                    (void) fputs("\\postverbatim\n", b);
                    188:                    verb = FALSE;
                    189:                }
                    190:                if (line[0] == '\n')
                    191:                    puttex(line, b);    /* handle totally blank line */
                    192:                else
                    193:                    puttex(line + 1, b);
                    194:            }
                    195:            break;
                    196:        }
                    197:     default:{
                    198:            if (isdigit((int) line[0])) {       /* start of section */
                    199:                if (!intable)   /* ignore while in table */
                    200:                    section(line, b);
                    201:            } else
                    202:                fprintf(stderr, "unknown control code '%c' in column 1\n",
                    203:                        line[0]);
                    204:            break;
                    205:        }
                    206:     }
                    207: }
                    208:
                    209: /* process a line with a digit control char */
                    210: /* starts a new [sub]section */
                    211:
                    212: void section(line, b)
                    213: char *line;
                    214: FILE *b;
                    215: {
                    216:     static char string[MAX_LINE_LEN+1];
                    217:     int sh_i;
                    218:
                    219:     if (verb) {
                    220:        (void) fputs("\\end{verbatim}\n", b);
                    221:        (void) fputs("\\postverbatim\n", b);
                    222:        verb = FALSE;
                    223:     }
                    224:     (void) sscanf(line, "%d %[^\n]s", &sh_i, string);
                    225:     switch (sh_i) {
                    226:     case 1:
                    227:        (void) fprintf(b, "\\part{");
                    228:        break;
                    229:     case 2:
                    230:        (void) fprintf(b, "\\section{");
                    231:        break;
                    232:     case 3:
                    233:        (void) fprintf(b, "\\subsection{");
                    234:        break;
                    235:     case 4:
                    236:        (void) fprintf(b, "\\subsubsection{");
                    237:        break;
                    238:     case 5:
                    239:        (void) fprintf(b, "\\subsubsubsection{");
                    240:        break;
                    241:     default:
                    242:     case 6:
                    243:        (void) fprintf(b, "\\paragraph{");
                    244:        break;
                    245:     }
                    246:     if (islower((int) string[0]))
                    247:        string[0] = toupper(string[0]);
                    248:     puttex(string, b);
                    249:     (void) fprintf(b, "}\n");
                    250: }
                    251:
                    252: /* put text in string str to file while buffering special TeX characters */
                    253: void puttex(str, file)
                    254: FILE *file;
                    255: register char *str;
                    256: {
                    257:     register char ch;
                    258:     static boolean inquote = FALSE;
                    259:     int i;
                    260:
                    261:     while ((ch = *str++) != NUL) {
                    262:        switch (ch) {
                    263:        case '#':
                    264:        case '$':
                    265:        case '%':
                    266:        case '&':
                    267:        case '{':
                    268:        case '}':
                    269:            (void) fputc('\\', file);
                    270:            (void) fputc(ch, file);
                    271:            break;
                    272:        case '\\':
                    273:            (void) fputs("$\\backslash$", file);
                    274:            break;
                    275:        case '~':
                    276:            (void) fputs("\\~{\\ }", file);
                    277:            break;
                    278:        case '^':
                    279:            (void) fputs("\\verb+^+", file);
                    280:            break;
                    281:        case '>':
                    282:        case '<':
                    283:        case '|':
                    284:            (void) fputc('$', file);
                    285:            (void) fputc(ch, file);
                    286:            (void) fputc('$', file);
                    287:            break;
                    288:        case '"':
                    289:            (void) fputs("{\\tt\"}", file);
                    290:            break;
                    291:        case '\'':
                    292:            if (*str == '\'') {
                    293:                (void) fputs("{'\\,'}", file);
                    294:                str++;
                    295:            } else {
                    296:                (void) fputc(ch, file);
                    297:            }
                    298:            break;
                    299:        case '-':
                    300:            if ((*str == '-') && (*(str + 1) == '-')) {
                    301:                (void) fputs(" --- ", file);
                    302:                str += 2;
                    303:            } else {
                    304:                (void) fputc(ch, file);
                    305:            }
                    306:            break;
                    307:        case '`':               /* backquotes mean boldface */
                    308:            if (inquote) {
                    309:                (void) fputs("}", file);
                    310:                inquote = FALSE;
                    311:            } else {
                    312:                (void) fputs("{\\bf ", file);
                    313:                inquote = TRUE;
                    314:            }
                    315:            break;
                    316:        case '_':               /* emphasised text ? */
                    317:            for (i = 0; isalpha((int) (*(str + i))); i++);
                    318:            if ((i > 0) && (*(str + i) == '_') &&
                    319:                           isspace((int) (*(str + i + 1)))) {
                    320:                (void) fputs("{\\em ", file);
                    321:                for (; *str != '_'; str++) {
                    322:                    (void) fputc(*str, file);
                    323:                }
                    324:                str++;
                    325:                (void) fputs("\\/}", file);
                    326:            } else {
                    327:                (void) fputs("{\\tt\\_}", file);
                    328:            }
                    329:            break;
                    330:        default:
                    331:            (void) fputc(ch, file);
                    332:            break;
                    333:        }
                    334:     }
                    335: }
                    336:
                    337:
                    338: void finish(b)
                    339: FILE *b;
                    340: {
                    341:     (void) fputs("\\end{document}\n", b);
                    342: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>