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

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

1.1       maekawa     1: /*
                      2:  * $Id: doc2rtf.c,v 1.16 1998/04/14 00:17:00 drd Exp $
                      3:  *
                      4:  */
                      5:
                      6: /* GNUPLOT - doc2rtf.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:  * doc2rtf.c  -- program to convert Gnuplot .DOC format to MS windows
                     40:  * help (.rtf) format.
                     41:  *
                     42:  * This involves stripping all lines with a leading digit or
                     43:  * a leading @, #, or %.
                     44:  * Modified by Maurice Castro from doc2gih.c by Thomas Williams
                     45:  *
                     46:  * usage:  doc2rtf file.doc file.rtf [-d]
                     47:  *
                     48:  */
                     49:
                     50: /* note that tables must begin in at least the second column to */
                     51: /* be formatted correctly and tabs are forbidden */
                     52:
                     53: #ifdef HAVE_CONFIG_H
                     54: #include "config.h"
                     55: #endif
                     56:
                     57: #include "ansichek.h"
                     58: #include "stdfn.h"
                     59: #define MAX_LINE_LEN 1023
                     60: #include "doc2x.h"
                     61: #include "xref.h"
                     62:
                     63: static boolean debug = FALSE;
                     64:
                     65: void footnote __PROTO((int, char *, FILE *));
                     66: void convert __PROTO((FILE *, FILE *));
                     67: void process_line __PROTO((char *, FILE *));
                     68:
                     69: int main(argc, argv)
                     70: int argc;
                     71: char **argv;
                     72: {
                     73:     FILE *infile;
                     74:     FILE *outfile;
                     75:     if (argc == 4 && argv[3][0] == '-' && argv[3][1] == 'd')
                     76:        debug = TRUE;
                     77:
                     78:     if (argc != 3 && !debug) {
                     79:        fprintf(stderr, "Usage: %s infile outfile\n", argv[0]);
                     80:        exit(EXIT_FAILURE);
                     81:     }
                     82:     if ((infile = fopen(argv[1], "r")) == (FILE *) NULL) {
                     83:        fprintf(stderr, "%s: Can't open %s for reading\n",
                     84:                argv[0], argv[1]);
                     85:        exit(EXIT_FAILURE);
                     86:     }
                     87:     if ((outfile = fopen(argv[2], "w")) == (FILE *) NULL) {
                     88:        fprintf(stderr, "%s: Can't open %s for writing\n",
                     89:                argv[0], argv[2]);
                     90:        exit(EXIT_FAILURE);
                     91:     }
                     92:     parse(infile);
                     93:     convert(infile, outfile);
                     94:     exit(EXIT_SUCCESS);
                     95: }
                     96:
                     97: /* generate an RTF footnote with reference char c and text s */
                     98: void footnote(c, s, b)
                     99: int c;
                    100: char *s;
                    101: FILE *b;
                    102: {
                    103:     fprintf(b, "%c{\\footnote %c %s}\n", c, c, s);
                    104: }
                    105:
                    106: void convert(a, b)
                    107: FILE *a, *b;
                    108: {
                    109:     static char line[MAX_LINE_LEN+1];
                    110:
                    111:     /* generate rtf header */
                    112:     fprintf(b, "{\\rtf1\\ansi ");      /* vers 1 rtf, ansi char set */
                    113:     fprintf(b, "\\deff0");     /* default font font 0 */
                    114:     /* font table: font 0 proportional, font 1 fixed */
                    115:     fprintf(b, "{\\fonttbl{\\f0\\fswiss Arial;}{\\f1\\fmodern Courier New;}}\n");
                    116:
                    117:     /* process each line of the file */
                    118:     while (get_line(line, sizeof(line), a)) {
                    119:        process_line(line, b);
                    120:     }
                    121:
                    122:     /* close final page and generate trailer */
                    123:     fprintf(b, "}{\\plain \\page}\n");
                    124:     /* fprintf(b,"}\n"); *//* HBB: HACK ALERT: only without this, hc31 works */
                    125:     list_free();
                    126: }
                    127:
                    128: void process_line(line, b)
                    129: char *line;
                    130: FILE *b;
                    131: {
                    132:     static int line_count = 0;
                    133:     static char line2[MAX_LINE_LEN+1];
                    134:     static int last_line;
                    135:     int i;
                    136:     int j;
                    137:     static int startpage = 1;
                    138:     char str[MAX_LINE_LEN+1];
                    139:     char topic[MAX_LINE_LEN+1];
                    140:     int k, l;
                    141:     static int tabl = 0;
                    142:     static int para = 0;
                    143:     static int llpara = 0;
                    144:     static int inquote = FALSE;
                    145:     static int inref = FALSE;
                    146:     struct LIST *klist;
                    147:
                    148:     line_count++;
                    149:
                    150:     i = 0;
                    151:     j = 0;
                    152:     while (line[i] != NUL) {
                    153:        switch (line[i]) {
                    154:        case '\\':
                    155:        case '{':
                    156:        case '}':
                    157:            line2[j] = '\\';
                    158:            j++;
                    159:            line2[j] = line[i];
                    160:            break;
                    161:        case '\r':
                    162:        case '\n':
                    163:            break;
                    164:        case '`':               /* backquotes mean boldface or link */
                    165:            if (line[1] == ' ') /* tabular line */
                    166:                line2[j] = line[i];
                    167:            else if ((!inref) && (!inquote)) {
                    168:                k = i + 1;      /* index into current string */
                    169:                l = 0;          /* index into topic string */
                    170:                while ((line[k] != '`') && (line[k] != NUL))
                    171:                    topic[l++] = line[k++];
                    172:                topic[l] = NUL;
                    173:                klist = lookup(topic);
                    174:                if (klist && (k = klist->line) > 0 && (k != last_line)) {
                    175:                    line2[j++] = '{';
                    176:                    line2[j++] = '\\';
                    177:                    line2[j++] = 'u';
                    178:                    line2[j++] = 'l';
                    179:                    line2[j++] = 'd';
                    180:                    line2[j++] = 'b';
                    181:                    line2[j] = ' ';
                    182:                    inref = k;
                    183:                } else {
                    184:                    if (debug)
                    185:                        fprintf(stderr, "Can't make link for \042%s\042 on line %d\n", topic, line_count);
                    186:                    line2[j++] = '{';
                    187:                    line2[j++] = '\\';
                    188:                    line2[j++] = 'b';
                    189:                    line2[j] = ' ';
                    190:                    inquote = TRUE;
                    191:                }
                    192:            } else {
                    193:                if (inquote && inref)
                    194:                    fprintf(stderr, "Warning: Reference Quote conflict line %d\n", line_count);
                    195:                if (inquote) {
                    196:                    line2[j] = '}';
                    197:                    inquote = FALSE;
                    198:                }
                    199:                if (inref) {
                    200:                    /* must be inref */
                    201:                    sprintf(topic, "%d", inref);
                    202:                    line2[j++] = '}';
                    203:                    line2[j++] = '{';
                    204:                    line2[j++] = '\\';
                    205:                    line2[j++] = 'v';
                    206:                    line2[j++] = ' ';
                    207:                    line2[j++] = 'l';
                    208:                    line2[j++] = 'o';
                    209:                    line2[j++] = 'c';
                    210:                    k = 0;
                    211:                    while (topic[k] != NUL)
                    212:                        line2[j++] = topic[k++];
                    213:                    line2[j] = '}';
                    214:                    inref = 0;
                    215:                }
                    216:            }
                    217:            break;
                    218:        default:
                    219:            line2[j] = line[i];
                    220:        }
                    221:        i++;
                    222:        j++;
                    223:        line2[j] = NUL;
                    224:     }
                    225:
                    226:     i = 1;
                    227:
                    228:     switch (line[0]) {         /* control character */
                    229:     case '?':{                 /* interactive help entry */
                    230:            if ((line2[1] != NUL) && (line2[1] != ' '))
                    231:                footnote('K', &(line2[1]), b);
                    232:            break;
                    233:        }
                    234:     case '@':{                 /* start/end table */
                    235:            break;              /* ignore */
                    236:        }
                    237:     case '^':{                 /* html link escape */
                    238:            break;              /* ignore */
                    239:        }
                    240:     case '#':{                 /* latex table entry */
                    241:            break;              /* ignore */
                    242:        }
                    243:     case '%':{                 /* troff table entry */
                    244:            break;              /* ignore */
                    245:        }
                    246:     case '\n':                 /* empty text line */
                    247:        fprintf(b, "\\par\n");
                    248:        llpara = para;
                    249:        para = 0;
                    250:        tabl = 0;
                    251:        break;
                    252:     case ' ':{                 /* normal text line */
                    253:            if ((line2[1] == NUL) || (line2[1] == '\n')) {
                    254:                fprintf(b, "\\par\n");
                    255:                llpara = para;
                    256:                para = 0;
                    257:                tabl = 0;
                    258:            }
                    259:            if (line2[1] == ' ') {
                    260:                if (!tabl) {
                    261:                    fprintf(b, "\\par\n");
                    262:                }
                    263:                fprintf(b, "{\\pard \\plain \\f1\\fs20 ");
                    264:                fprintf(b, "%s", &line2[1]);
                    265:                fprintf(b, "}\\par\n");
                    266:                llpara = 0;
                    267:                para = 0;
                    268:                tabl = 1;
                    269:            } else {
                    270:                if (!para) {
                    271:                    if (llpara)
                    272:                        fprintf(b, "\\par\n");  /* blank line between paragraphs */
                    273:                    llpara = 0;
                    274:                    para = 1;   /* not in para so start one */
                    275:                    tabl = 0;
                    276:                    fprintf(b, "\\pard \\plain \\qj \\fs20 \\f0 ");
                    277:                }
                    278:                fprintf(b, "%s \n", &line2[1]);
                    279:            }
                    280:            break;
                    281:        }
                    282:     default:{
                    283:            if (isdigit((int)line[0])) {        /* start of section */
                    284:                if (startpage) {        /* use new level 0 item */
                    285:                    refs(0, b, "\\par", NULL, "\\par{\\uldb %s}{\\v loc%d}\n");
                    286:                    fprintf(b, "}{\\plain \\page}\n");
                    287:                } else {
                    288:                    refs(last_line, b, "\\par", NULL, "\\par{\\uldb %s}{\\v loc%d}\n");
                    289:                    fprintf(b, "}{\\plain \\page}\n");
                    290:                }
                    291:                para = 0;       /* not in a paragraph */
                    292:                tabl = 0;
                    293:                last_line = line_count;
                    294:                startpage = 0;
                    295:                fprintf(b, "{\n");
                    296:                sprintf(str, "browse:%05d", line_count);
                    297:                footnote('+', str, b);
                    298:                footnote('$', &(line2[1]), b);  /* title */
                    299:                fprintf(b, "{\\b \\fs24 %s}\\plain\\par\\par\n", &(line2[1]));
                    300:                /* output unique ID */
                    301:                sprintf(str, "loc%d", line_count);
                    302:                footnote('#', str, b);
                    303:            } else
                    304:                fprintf(stderr, "unknown control code '%c' in column 1, line %d\n",
                    305:                        line[0], line_count);
                    306:            break;
                    307:        }
                    308:     }
                    309: }

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