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

Annotation of OpenXM_contrib/gnuplot/docs/doc2ms.c, Revision 1.1

1.1     ! maekawa     1: #ifndef lint
        !             2: static char *RCSid = "$Id: doc2ms.c,v 1.19 1998/06/18 14:59:11 ddenholm Exp $";
        !             3: #endif
        !             4:
        !             5: /* GNUPLOT - doc2ms.c */
        !             6:
        !             7: /*[
        !             8:  * Copyright 1986 - 1993, 1998   Thomas Williams, Colin Kelley
        !             9:  *
        !            10:  * Permission to use, copy, and distribute this software and its
        !            11:  * documentation for any purpose with or without fee is hereby granted,
        !            12:  * provided that the above copyright notice appear in all copies and
        !            13:  * that both that copyright notice and this permission notice appear
        !            14:  * in supporting documentation.
        !            15:  *
        !            16:  * Permission to modify the software is granted, but not the right to
        !            17:  * distribute the complete modified source code.  Modifications are to
        !            18:  * be distributed as patches to the released version.  Permission to
        !            19:  * distribute binaries produced by compiling modified sources is granted,
        !            20:  * provided you
        !            21:  *   1. distribute the corresponding source modifications from the
        !            22:  *    released version in the form of a patch file along with the binaries,
        !            23:  *   2. add special version identification to distinguish your version
        !            24:  *    in addition to the base release version number,
        !            25:  *   3. provide your name and address as the primary contact for the
        !            26:  *    support of your modified version, and
        !            27:  *   4. retain our contact information in regard to use of the base
        !            28:  *    software.
        !            29:  * Permission to distribute the released version of the source code along
        !            30:  * with corresponding source modifications in the form of a patch file is
        !            31:  * granted with same provisions 2 through 4 for binary distributions.
        !            32:  *
        !            33:  * This software is provided "as is" without express or implied warranty
        !            34:  * to the extent permitted by applicable law.
        !            35: ]*/
        !            36:
        !            37: /*
        !            38:  * doc2ms.c  -- program to convert Gnuplot .DOC format to *roff -ms document
        !            39:  * From hlp2ms by Thomas Williams
        !            40:  *
        !            41:  * Modified by Russell Lang, 2nd October 1989
        !            42:  * to make vms help level 1 and 2 create the same ms section level.
        !            43:  *
        !            44:  * Modified to become doc2ms by David Kotz (David.Kotz@Dartmouth.edu) 12/89
        !            45:  * Added table and backquote support.
        !            46:  *
        !            47:  * usage:  doc2ms [file.doc [file.ms]]
        !            48:  *
        !            49:  *   where file.doc is a VMS .DOC file, and file.ms will be a [nt]roff
        !            50:  *     document suitable for printing with nroff -ms or troff -ms
        !            51:  *
        !            52:  * typical usage for GNUPLOT:
        !            53:  *
        !            54:  *   doc2ms gnuplot.doc | tbl | eqn | troff -ms
        !            55:  *
        !            56:  * or
        !            57:  *
        !            58:  *   doc2ms gnuplot.doc | groff -ms -et >gnuplot.ps
        !            59:  */
        !            60:
        !            61: #ifdef HAVE_CONFIG_H
        !            62: # include "config.h"
        !            63: #endif
        !            64:
        !            65: #include "ansichek.h"
        !            66: #include "stdfn.h"
        !            67: #include "doc2x.h"
        !            68:
        !            69: #define LINE_SKIP              3
        !            70:
        !            71: void init __PROTO((FILE *));
        !            72: void convert __PROTO((FILE *, FILE *));
        !            73: void process_line __PROTO((char *, FILE *));
        !            74: void section __PROTO((char *, FILE *));
        !            75: void putms __PROTO((char *, FILE *));
        !            76: void putms_verb __PROTO((char *, FILE *));
        !            77: void finish __PROTO((FILE *));
        !            78:
        !            79: static boolean intable = FALSE;
        !            80:
        !            81: int main(argc, argv)
        !            82: int argc;
        !            83: char **argv;
        !            84: {
        !            85:     FILE *infile;
        !            86:     FILE *outfile;
        !            87:     infile = stdin;
        !            88:     outfile = stdout;
        !            89:     if (argc > 3) {
        !            90:        fprintf(stderr, "Usage: %s [infile [outfile]]\n", argv[0]);
        !            91:        exit(EXIT_FAILURE);
        !            92:     }
        !            93:     if (argc >= 2) {
        !            94:        if ((infile = fopen(argv[1], "r")) == (FILE *) NULL) {
        !            95:            fprintf(stderr, "%s: Can't open %s for reading\n",
        !            96:                    argv[0], argv[1]);
        !            97:            exit(EXIT_FAILURE);
        !            98:        }
        !            99:     }
        !           100:     if (argc == 3) {
        !           101:        if ((outfile = fopen(argv[2], "w")) == (FILE *) NULL) {
        !           102:            fprintf(stderr, "%s: Can't open %s for writing\n",
        !           103:                    argv[0], argv[2]);
        !           104:            exit(EXIT_FAILURE);
        !           105:        }
        !           106:     }
        !           107:     init(outfile);
        !           108:     convert(infile, outfile);
        !           109:     finish(outfile);
        !           110:     exit(EXIT_SUCCESS);
        !           111: }
        !           112:
        !           113:
        !           114: void init(b)
        !           115: FILE *b;
        !           116: {
        !           117:     /* in nroff, increase line length by 8 and don't adjust lines */
        !           118:     (void) fputs(".if n \\{.nr LL +8m\n.na \\}\n\
        !           119: .nr PO +0.3i\n\
        !           120: .so titlepag.ms\n\
        !           121: .pn 1\n\
        !           122: .bp\n\
        !           123: .ta 1.5i 3.0i 4.5i 6.0i 7.5i\n\
        !           124: \\&\n.sp 3\n.PP\n", b);
        !           125:
        !           126:     /* following line commented out by rjl
        !           127:        (void) fputs(".so intro\n",b);
        !           128:      */
        !           129: }
        !           130:
        !           131:
        !           132: void convert(a, b)
        !           133: FILE *a, *b;
        !           134: {
        !           135:     static char line[MAX_LINE_LEN+1];
        !           136:
        !           137:     while (get_line(line, sizeof(line), a)) {
        !           138:        process_line(line, b);
        !           139:     }
        !           140: }
        !           141:
        !           142: void process_line(line, b)
        !           143: char *line;
        !           144: FILE *b;
        !           145: {
        !           146:     switch (line[0]) {         /* control character */
        !           147:     case '?':{                 /* interactive help entry */
        !           148:            break;              /* ignore */
        !           149:        }
        !           150:     case '@':{                 /* start/end table */
        !           151:            if (intable) {
        !           152:                (void) fputs(".TE\n.KE\n", b);
        !           153:                (void) fputs(".EQ\ndelim off\n.EN\n\n", b);
        !           154:                intable = FALSE;
        !           155:            } else {
        !           156:                (void) fputs("\n.EQ\ndelim $$\n.EN\n", b);
        !           157:                (void) fputs(".KS\n.TS\ncenter box tab (@) ;\n", b);
        !           158:                /* moved to gnuplot.doc by RCC
        !           159:                   (void) fputs("c c l .\n", b);
        !           160:                 */
        !           161:                intable = TRUE;
        !           162:            }
        !           163:            /* ignore rest of line */
        !           164:            break;
        !           165:        }
        !           166:     case '^':{                 /* html table entry */
        !           167:            break;              /* ignore */
        !           168:        }
        !           169:     case '#':{                 /* latex table entry */
        !           170:            break;              /* ignore */
        !           171:        }
        !           172:     case '%':{                 /* troff table entry */
        !           173:            if (intable)
        !           174:                (void) fputs(line + 1, b);      /* copy directly */
        !           175:            else
        !           176:                fprintf(stderr, "error: %% line found outside of table\n");
        !           177:            break;
        !           178:        }
        !           179:     case '\n':                 /* empty text line */
        !           180:     case ' ':{                 /* normal text line */
        !           181:            if (intable)
        !           182:                break;          /* ignore while in table */
        !           183:            switch (line[1]) {
        !           184:            case ' ':{
        !           185:                    /* verbatim mode */
        !           186:                    fputs(".br\n", b);
        !           187:                    putms_verb(line + 1, b);
        !           188:                    fputs(".br\n", b);
        !           189:                    break;
        !           190:                }
        !           191:            case '\'':{
        !           192:                    fputs("\\&", b);
        !           193:                    putms(line + 1, b);
        !           194:                    break;
        !           195:                }
        !           196:            case '.':{          /* hide leading . from ms */
        !           197:                    fputs("\\&", b);
        !           198:                    putms(line + 1, b);
        !           199:                    break;
        !           200:                }
        !           201:            default:{
        !           202:                    if (line[0] == '\n')
        !           203:                        putms(line, b);         /* handle totally blank line */
        !           204:                    else
        !           205:                        putms(line + 1, b);
        !           206:                    break;
        !           207:                }
        !           208:                break;
        !           209:            }
        !           210:            break;
        !           211:        }
        !           212:     default:{
        !           213:            if (isdigit((int)line[0])) {        /* start of section */
        !           214:                if (!intable)   /* ignore while in table */
        !           215:                    section(line, b);
        !           216:            } else
        !           217:                fprintf(stderr, "unknown control code '%c' in column 1\n",
        !           218:                        line[0]);
        !           219:            break;
        !           220:        }
        !           221:     }
        !           222: }
        !           223:
        !           224:
        !           225: /* process a line with a digit control char */
        !           226: /* starts a new [sub]section */
        !           227:
        !           228: void section(line, b)
        !           229: char *line;
        !           230: FILE *b;
        !           231: {
        !           232:     static char string[MAX_LINE_LEN+1];
        !           233:     int sh_i;
        !           234:     static int old = 1;
        !           235:
        !           236:
        !           237:     (void) sscanf(line, "%d %[^\n]s", &sh_i, string);
        !           238:
        !           239:     (void) fprintf(b, ".sp %d\n", (sh_i == 1) ? LINE_SKIP : LINE_SKIP - 1);
        !           240:
        !           241:     if (sh_i > old) {
        !           242:        do
        !           243:            if (old != 1)       /* this line added by rjl */
        !           244:                (void) fputs(".RS\n.IP\n", b);
        !           245:        while (++old < sh_i);
        !           246:     } else if (sh_i < old) {
        !           247:        do
        !           248:            if (sh_i != 1)      /* this line added by rjl */
        !           249:                (void) fputs(".RE\n.br\n", b);
        !           250:        while (--old > sh_i);
        !           251:     }
        !           252:     /* added by dfk to capitalize section headers */
        !           253:     if (islower((int)string[0]))
        !           254:        string[0] = toupper(string[0]);
        !           255:
        !           256:     /* next 3 lines added by rjl */
        !           257:     if (sh_i != 1)
        !           258:        (void) fprintf(b, ".NH %d\n%s\n.sp 1\n.LP\n", sh_i - 1, string);
        !           259:     else
        !           260:        (void) fprintf(b, ".NH %d\n%s\n.sp 1\n.LP\n", sh_i, string);
        !           261:     old = sh_i;
        !           262:
        !           263:     (void) fputs(".XS\n", b);
        !           264:     (void) fputs(string, b);
        !           265:     (void) fputs("\n.XE\n", b);
        !           266: }
        !           267:
        !           268: void putms(s, file)
        !           269: char *s;
        !           270: FILE *file;
        !           271: {
        !           272:     static boolean inquote = FALSE;
        !           273:
        !           274:     while (*s != NUL) {
        !           275:        switch (*s) {
        !           276:        case '`':{              /* backquote -> boldface */
        !           277:                if (inquote) {
        !           278:                    fputs("\\fR", file);
        !           279:                    inquote = FALSE;
        !           280:                } else {
        !           281:                    fputs("\\fB", file);
        !           282:                    inquote = TRUE;
        !           283:                }
        !           284:                break;
        !           285:            }
        !           286:        case '\\':{             /* backslash */
        !           287:                fputs("\\\\", file);
        !           288:                break;
        !           289:            }
        !           290:        case '\'':{             /* single quote */
        !           291:                fputs("\\&'", file);
        !           292:                break;
        !           293:            }
        !           294:        default:{
        !           295:                fputc(*s, file);
        !           296:                break;
        !           297:            }
        !           298:        }
        !           299:        s++;
        !           300:     }
        !           301: }
        !           302:
        !           303: /*
        !           304:  * convert a verbatim line to troff input style, i.e. convert "\" to "\\"
        !           305:  * (added by Alexander Lehmann 01/30/93)
        !           306:  */
        !           307:
        !           308: void putms_verb(s, file)
        !           309: char *s;
        !           310: FILE *file;
        !           311: {
        !           312:     while (*s != '\0') {
        !           313:        if (*s == '\\') {
        !           314:            fputc('\\', file);
        !           315:        }
        !           316:        fputc(*s, file);
        !           317:        s++;
        !           318:     }
        !           319: }
        !           320:
        !           321: void finish(b)                 /* spit out table of contents */
        !           322: FILE *b;
        !           323: {
        !           324:     (void) fputs(".pn 1\n", b);
        !           325:     (void) fputs(".ds RH %\n", b);
        !           326:     (void) fputs(".af % i\n", b);
        !           327:     (void) fputs(".bp\n.PX\n", b);
        !           328: }

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