[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

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>