[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     ! 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>