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