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

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

1.1     ! maekawa     1: #ifndef lint
        !             2: static char *RCSid = "$Id: doc2ipf.c,v 1.20 1998/04/14 00:16:59 drd Exp $";
        !             3: #endif
        !             4:
        !             5: /* GNUPLOT - doc2ipf.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:  * doc2ipf.c  -- program to convert Gnuplot .DOC format to OS/2
        !            39:  * ipfc  (.inf/.hlp) format.
        !            40:  *
        !            41:  * Modified by Roger Fearick from doc2rtf by M Castro
        !            42:  *
        !            43:  * usage:  doc2ipf gnuplot.doc gnuplot.itl
        !            44:  *
        !            45:  */
        !            46:
        !            47: /* note that tables must begin in at least the second column to */
        !            48: /* be formatted correctly and tabs are forbidden */
        !            49:
        !            50: #ifdef HAVE_CONFIG_H
        !            51: # include "config.h"
        !            52: #endif
        !            53:
        !            54: #include "ansichek.h"
        !            55: #include "stdfn.h"
        !            56:
        !            57: #define MAX_LINE_LEN 1023
        !            58:
        !            59: #include "doc2x.h"
        !            60: #include "xref.h"
        !            61:
        !            62: #define MAX_COL 6
        !            63:
        !            64: /* From xref.c */
        !            65: extern void *xmalloc __PROTO((size_t));
        !            66:
        !            67: void convert __PROTO((FILE *, FILE *));
        !            68: void process_line __PROTO((char *, FILE *));
        !            69:
        !            70: /* malloc's are not being checked ! */
        !            71:
        !            72: struct TABENTRY {              /* may have MAX_COL column tables */
        !            73:     struct TABENTRY *next;
        !            74:     char col[MAX_COL][256];
        !            75: };
        !            76:
        !            77: struct TABENTRY table = { NULL };
        !            78: struct TABENTRY *tableins = &table;
        !            79: int tablecols = 0;
        !            80: int tablewidth[MAX_COL] = {0, 0, 0, 0, 0, 0};  /* there must be the correct */
        !            81: int tablelines = 0;            /* number of zeroes here */
        !            82:
        !            83: static boolean debug = FALSE;
        !            84:
        !            85:
        !            86: int main(argc, argv)
        !            87: int argc;
        !            88: char **argv;
        !            89: {
        !            90:     FILE *infile;
        !            91:     FILE *outfile;
        !            92:     if (argc == 4 && argv[3][0] == '-' && argv[3][1] == 'd')
        !            93:        debug = TRUE;
        !            94:
        !            95:     if (argc != 3 && !debug) {
        !            96:        fprintf(stderr, "Usage: %s infile outfile\n", argv[0]);
        !            97:        exit(EXIT_FAILURE);
        !            98:     }
        !            99:     if ((infile = fopen(argv[1], "r")) == (FILE *) NULL) {
        !           100:        fprintf(stderr, "%s: Can't open %s for reading\n",
        !           101:                argv[0], argv[1]);
        !           102:        exit(EXIT_FAILURE);
        !           103:     }
        !           104:     if ((outfile = fopen(argv[2], "w")) == (FILE *) NULL) {
        !           105:        fprintf(stderr, "%s: Can't open %s for writing\n",
        !           106:                argv[0], argv[2]);
        !           107:        fclose(infile);
        !           108:        exit(EXIT_FAILURE);
        !           109:     }
        !           110:     parse(infile);
        !           111:     convert(infile, outfile);
        !           112:     exit(EXIT_SUCCESS);
        !           113: }
        !           114:
        !           115: void convert(a, b)
        !           116: FILE *a, *b;
        !           117: {
        !           118:     static char line[MAX_LINE_LEN+1];
        !           119:
        !           120:     /* generate ipf header */
        !           121:     fprintf(b, ":userdoc.\n:prolog.\n");
        !           122:     fprintf(b, ":title.GNUPLOT\n");
        !           123:     fprintf(b, ":docprof toc=12345.\n:eprolog.\n");
        !           124:
        !           125:     /* process each line of the file */
        !           126:     while (get_line(line, sizeof(line), a)) {
        !           127:        process_line(line, b);
        !           128:     }
        !           129:
        !           130:     /* close final page and generate trailer */
        !           131:     fprintf(b, "\n:euserdoc.\n");
        !           132:
        !           133:     list_free();
        !           134: }
        !           135:
        !           136: void process_line(line, b)
        !           137: char *line;
        !           138: FILE *b;
        !           139: {
        !           140:     static int line_count = 0;
        !           141:     static char line2[MAX_LINE_LEN+1];
        !           142:     static int last_line;
        !           143:     char hyplink1[64];
        !           144:     char *pt, *tablerow;
        !           145:     int i;
        !           146:     int j;
        !           147:     static int startpage = 1;
        !           148:     char str[MAX_LINE_LEN+1];
        !           149:     char topic[MAX_LINE_LEN+1];
        !           150:     int k, l;
        !           151:     static int tabl = 0;
        !           152:     static int para = 0;
        !           153:     static int inquote = FALSE;
        !           154:     static int inref = FALSE;
        !           155:     static int intable = FALSE;
        !           156:     static int intablebut = FALSE;
        !           157:     static int introffheader = FALSE;
        !           158:     static char tablechar = '@';
        !           159:     static FILE *bo = NULL, *bt = NULL;
        !           160:     static char tabledelim[4] = "%@\n";
        !           161:     static int nblanks = 0;
        !           162:     struct LIST *klist;
        !           163:
        !           164:     line_count++;
        !           165:
        !           166:     if (introffheader)
        !           167:        fprintf(stderr, "%s\n", line);
        !           168:     if (bo == NULL)
        !           169:        bo = b;
        !           170:     i = 0;
        !           171:     j = 0;
        !           172:     nblanks = 0;
        !           173:     while (line[nblanks] == ' ')
        !           174:        ++nblanks;
        !           175:     while (line[i] != NUL) {
        !           176:        if (introffheader) {
        !           177:            if (line[i] != '\n')
        !           178:                line2[j] = line[i];
        !           179:            else
        !           180:                line2[j] = NUL;
        !           181:        } else
        !           182:            switch (line[i]) {
        !           183:            case '$':
        !           184:                if (intable && (tablechar != '$') && (line[0] == '%')) {
        !           185:                    ++i;
        !           186:                    if (line[i + 1] == '$' || line[i] == 'x' || line[i] == '|') {
        !           187:                        while (line[i] != '$')
        !           188:                            line2[j++] = line[i++];
        !           189:                        --j;
        !           190:                    } else {
        !           191:                        while (line[i] != '$')
        !           192:                            i++;
        !           193:                        if (line[i + 1] == ',')
        !           194:                            i++;
        !           195:                        if (line[i + 1] == ' ')
        !           196:                            i++;
        !           197:                        line2[j] = line[++i];
        !           198:                    }
        !           199:                } else
        !           200:                    line2[j] = line[i];
        !           201:                break;
        !           202:            case ':':
        !           203:                strcpy(&line2[j], "&colon.");
        !           204:                j += strlen("&colon.") - 1;
        !           205:                break;
        !           206:
        !           207:            case '&':
        !           208:                /* real hack to solve \&_ in postscript doc tables */
        !           209:                /* (which are a special case hack anyway. */
        !           210:                if (j > 0 && line2[j - 1] == '\\') {
        !           211:                    j -= 2;
        !           212:                    break;
        !           213:                }
        !           214:                strcpy(&line2[j], "&amp.");
        !           215:                j += strlen("&amp.") - 1;
        !           216:                break;
        !           217:
        !           218:            case '\r':
        !           219:            case '\n':
        !           220:                break;
        !           221:            case '`':           /* backquotes mean boldface or link */
        !           222:                if (nblanks > 7) {
        !           223:                    line2[j] = line[i];
        !           224:                    break;
        !           225:                }
        !           226:                if ((!inref) && (!inquote)) {
        !           227:                    k = i + 1;  /* index into current string */
        !           228:                    l = 0;      /* index into topic string */
        !           229:                    while ((line[k] != '`') && (line[k] != 0)) {
        !           230:                        topic[l] = line[k];
        !           231:                        k++;
        !           232:                        l++;
        !           233:                    }
        !           234:                    topic[l] = 0;
        !           235:                    klist = lookup(topic);
        !           236:                    if (klist != NULL && (k = klist->line) > 0) {
        !           237:                        sprintf(hyplink1, ":link reftype=hd res=%d.", k);
        !           238:                        strcpy(line2 + j, hyplink1);
        !           239:                        j += strlen(hyplink1) - 1;
        !           240:
        !           241:                        inref = k;
        !           242:                    } else {
        !           243:                        if (debug)
        !           244:                            fprintf(stderr, "Can't make link for \042%s\042 on line %d\n", topic, line_count);
        !           245:                        strcpy(line2 + j, ":hp2.");
        !           246:                        j += 4;
        !           247:                        inquote = TRUE;
        !           248:                    }
        !           249:                } else {
        !           250:                    if (inquote && inref)
        !           251:                        fprintf(stderr, "Warning: Reference Quote conflict line %d\n", line_count);
        !           252:                    if (inquote) {
        !           253:                        strcpy(line2 + j, ":ehp2.");
        !           254:                        j += 5;
        !           255:                        inquote = FALSE;
        !           256:                    }
        !           257:                    if (inref) {
        !           258:                        /* must be inref */
        !           259:                        strcpy(line2 + j, ":elink.");
        !           260:                        j += 6;
        !           261:                        inref = FALSE;
        !           262:                    }
        !           263:                }
        !           264:                break;
        !           265:            default:
        !           266:                line2[j] = line[i];
        !           267:            }
        !           268:        i++;
        !           269:        j++;
        !           270:        if ((j >= sizeof(line2))) {
        !           271:            fprintf(stderr, "MAX_LINE_LEN exceeded\n");
        !           272:            if (inref || inquote)
        !           273:                fprintf(stderr, "Possible missing link character (`) near above line number\n");
        !           274:            abort();
        !           275:        }
        !           276:        line2[j] = NUL;
        !           277:     }
        !           278:
        !           279:     i = 1;
        !           280:
        !           281:     switch (line[0]) {         /* control character */
        !           282:     case '?':{                 /* interactive help entry */
        !           283:            if (intable)
        !           284:                intablebut = TRUE;
        !           285:            break;
        !           286:        }
        !           287:     case '@':{                 /* start/end table */
        !           288:            intable = !intable;
        !           289:            if (intable) {
        !           290:                tablechar = '@';
        !           291:                introffheader = FALSE;
        !           292:                tablelines = 0;
        !           293:                tablecols = 0;
        !           294:                tableins = &table;
        !           295:                for (j = 0; j < MAX_COL; j++)
        !           296:                    tablewidth[j] = 0;
        !           297:            } else {            /* dump table */
        !           298:                int header = 0;
        !           299:                intablebut = FALSE;
        !           300:                tableins = &table;
        !           301:                fprintf(b, ":table cols=\'");
        !           302:                for (j = 0; j < MAX_COL; j++)
        !           303:                    if (tablewidth[j] > 0)
        !           304:                        fprintf(b, " %d", tablewidth[j]);
        !           305:                fprintf(b, "\'.\n");
        !           306:                tableins = tableins->next;
        !           307:                if (tableins->next != NULL)
        !           308:                    header = (tableins->next->col[0][0] == '_');
        !           309:                if (header)
        !           310:                    tableins->next = tableins->next->next;
        !           311:                while (tableins != NULL) {
        !           312:                    fprintf(b, ":row.\n");
        !           313:                    for (j = 0; j < tablecols; j++)
        !           314:                        if (header)
        !           315:                            fprintf(b, ":c.:hp9.%s:ehp9.\n", tableins->col[j]);
        !           316:                        else
        !           317:                            fprintf(b, ":c.%s\n", tableins->col[j]);
        !           318:                    tableins = tableins->next;
        !           319:                    header = 0;
        !           320:                }
        !           321:                fprintf(b, ":etable.\n");
        !           322:                if (bt != NULL) {
        !           323:                    rewind(bt);
        !           324:                    while (get_line(str, sizeof(str), bt))
        !           325:                        fputs(str, b);
        !           326:                    fclose(bt);
        !           327:                    remove("doc2ipf.tmp");
        !           328:                    bt = NULL;
        !           329:                    bo = b;
        !           330:                }
        !           331:            }
        !           332:            break;
        !           333:        }
        !           334:     case '#':{                 /* latex table entry */
        !           335:            break;              /* ignore */
        !           336:        }
        !           337:     case '%':{                 /* troff table entry */
        !           338:            if (intable) {
        !           339:                if (introffheader) {
        !           340:                    fprintf(stderr, ">%s\n", line2);
        !           341:                    fprintf(stderr, "tablechar: %c\n", tablechar);
        !           342:                    if (line2[1] == '.')
        !           343:                        break;
        !           344:                    pt = strchr(line2, '(');
        !           345:                    if (pt != NULL)
        !           346:                        tablechar = *(pt + 1);
        !           347:                    fprintf(stderr, "tablechar: %c\n", tablechar);
        !           348:                    pt = strchr(line2 + 2, '.');
        !           349:                    if (pt != NULL)
        !           350:                        introffheader = FALSE;
        !           351:                    break;
        !           352:                }
        !           353:                if (line[1] == '.') {   /* ignore troff commands */
        !           354:                    introffheader = TRUE;
        !           355:                    break;
        !           356:                }
        !           357:                tablerow = line2;
        !           358:                tableins->next = xmalloc(sizeof(struct TABENTRY));
        !           359:                tableins = tableins->next;
        !           360:                tableins->next = NULL;
        !           361:                j = 0;
        !           362:                tabledelim[1] = tablechar;
        !           363:                line2[0] = tablechar;
        !           364:                while ((pt = strtok(tablerow, tabledelim + 1)) != NULL) {
        !           365:                    if (*pt != NUL) {   /* ignore null columns */
        !           366:                        /* this fails on format line */
        !           367:                        assert(j < MAX_COL);
        !           368:                        strcpy(tableins->col[j], pt);
        !           369:                        k = strlen(pt);
        !           370:                        if (k > tablewidth[j])
        !           371:                            tablewidth[j] = k;
        !           372:                        ++j;
        !           373:                        tablerow = NULL;
        !           374:                        if (j > tablecols)
        !           375:                            tablecols = j;
        !           376:                    }
        !           377:                }
        !           378:                while (j < MAX_COL)
        !           379:                    tableins->col[j++][0] = NUL;
        !           380:            }
        !           381:            break;              /* ignore */
        !           382:        }
        !           383:     case '\n':                 /* empty text line */
        !           384:        para = 0;
        !           385:        tabl = 0;
        !           386:        fprintf(bo, ":p.");
        !           387:        break;
        !           388:     case ' ':{                 /* normal text line */
        !           389:            if (intable && !intablebut)
        !           390:                break;
        !           391:            if (intablebut) {   /* indexed items in  table, copy
        !           392:                                   to file after table by saving in
        !           393:                                   a temp file meantime */
        !           394:                if (bt == NULL) {
        !           395:                    fflush(bo);
        !           396:                    bt = fopen("doc2ipf.tmp", "w+");
        !           397:                    if (bt == NULL)
        !           398:                        fprintf(stderr, "cant open temp\n");
        !           399:                    else
        !           400:                        bo = bt;
        !           401:                }
        !           402:            }
        !           403:            if (intablebut && (bt == NULL))
        !           404:                break;
        !           405:            if ((line2[1] == 0) || (line2[1] == '\n')) {
        !           406:                fprintf(bo, ":p.");
        !           407:                para = 0;
        !           408:            }
        !           409:            if (line2[1] == ' ') {
        !           410:                if (!tabl)
        !           411:                    fprintf(bo, ":p.");
        !           412:                fprintf(bo, "%s", &line2[1]);
        !           413:                fprintf(bo, "\n.br\n");
        !           414:                tabl = 1;
        !           415:                para = 0;
        !           416:            } else {
        !           417:                if (!para) {
        !           418:                    para = 1;   /* not in para so start one */
        !           419:                    tabl = 0;
        !           420:                }
        !           421:                fprintf(bo, "%s \n", &line2[1]);
        !           422:            }
        !           423:            fflush(bo);
        !           424:            break;
        !           425:        }
        !           426:     case '^':
        !           427:        break;                  /* ignore */
        !           428:     default:{
        !           429:            if (isdigit((int)line[0])) {        /* start of section */
        !           430:                if (intable) {
        !           431:                    intablebut = TRUE;
        !           432:                    if (bt == NULL) {
        !           433:                        fflush(bo);
        !           434:                        bt = fopen("doc2ipf.tmp", "w+");
        !           435:                        if (bt == NULL)
        !           436:                            fprintf(stderr, "cant open temp\n");
        !           437:                        else
        !           438:                            bo = bt;
        !           439:                    }
        !           440:                }
        !           441:                if (startpage)  /* use new level 0 item */
        !           442:                    refs(0, bo, NULL, NULL, NULL);
        !           443:                else
        !           444:                    refs(last_line, bo, NULL, NULL, NULL);
        !           445:                para = 0;       /* not in a paragraph */
        !           446:                tabl = 0;
        !           447:                last_line = line_count;
        !           448:                startpage = 0;
        !           449:                fprintf(stderr, "%d: %s\n", line_count, &line2[1]);
        !           450:                klist = lookup(&line2[2]);
        !           451:                if (klist != NULL)
        !           452:                    k = klist->line;
        !           453:                /*if( k<0 ) fprintf(bo,":h%c.", line[0]=='1'?line[0]:line[0]-1);
        !           454:                   else */
        !           455:                fprintf(bo, ":h%c res=%d.", line[0], line_count);
        !           456:                fprintf(bo, &(line2[1]));       /* title */
        !           457:                fprintf(bo, "\n:p.");
        !           458:            } else
        !           459:                fprintf(stderr, "unknown control code '%c' in column 1, line %d\n",
        !           460:                        line[0], line_count);
        !           461:        }
        !           462:        break;
        !           463:     }
        !           464: }

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