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

Annotation of OpenXM_contrib/gnuplot/docs/xref.c, Revision 1.1.1.2

1.1       maekawa     1: /*
1.1.1.2 ! maekawa     2:  * $Id: xref.c,v 1.4 1998/10/19 13:19:18 lhecking Exp $
1.1       maekawa     3:  *
                      4:  */
                      5:
                      6: /* GNUPLOT - xref.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:  * this file is used by doc2ipf, doc2html, doc2rtf and doc2info
                     40:  *
                     41:  * MUST be included after termdoc.c (since termdoc.c redefines fgets() )
                     42:  *
                     43:  * it contains functions needed to handle xrefs, most of them from
                     44:  *     doc2rtf (most likely) by Maurice Castro
                     45:  *  or doc2ipf by Roger Fearick
                     46:  *  or doc2html by Russel Lang
                     47:  *
                     48:  * I have modified the functions a little to make them more flexible
                     49:  * (lookup returns list instead of list->line) or let them work with all
                     50:  * four programs (adding three parameters to refs).
                     51:  *
                     52:  * I switched the search order of lookup. Makes more sense to me
                     53:  *
                     54:  * Stefan Bodewig 1/29/1996
                     55:  */
                     56:
                     57: #ifdef HAVE_CONFIG_H
                     58: # include "config.h"
                     59: #endif
                     60:
                     61: #define DOCS_XREF_MAIN
                     62:
                     63: #include "ansichek.h"
                     64: #include "stdfn.h"
                     65: #include "doc2x.h"
                     66: #include "xref.h"
                     67:
                     68: struct LIST *list = NULL;
                     69: struct LIST *head = NULL;
                     70:
                     71: struct LIST *keylist = NULL;
                     72: struct LIST *keyhead = NULL;
                     73:
                     74: int maxlevel = 0;              /* how deep are the topics nested? */
                     75: int listitems = 0;             /* number of topics */
                     76:
                     77: /* for debugging (invoke from gdb !) */
                     78: void dump_list()
                     79: {
                     80:     struct LIST *element = head;
                     81:     while (element) {
                     82:        fprintf(stderr, "%p level %d, line %d, \"%s\"\n", element, element->level, element->line, element->string);
                     83:        element = element->next;
                     84:     }
                     85: }
                     86:
                     87:
                     88: #ifdef PROTOTYPES
                     89: void *xmalloc(size_t size)
                     90: {
                     91:     void *p = malloc(size);
                     92: #else
                     93: char *xmalloc(size)            /* think this is correct for K&R C */
                     94: unsigned int size;
                     95: {
                     96:     char *p = malloc(size);
                     97: #endif
                     98:     if (p)
                     99:        return p;
                    100:     fprintf(stderr, "Malloc failed\n");
                    101:     exit(1);
                    102:     return NULL;               /* HBB 980317: kill superfluous warnings */
                    103: }
                    104:
                    105: /* scan the file and build a list of line numbers where particular levels are */
                    106: void parse(a)
                    107: FILE *a;
                    108: {
                    109:     static char line[MAX_LINE_LEN+1];
                    110:     char *c;
                    111:     int lineno = 0;
                    112:     int lastline = 0;
                    113:
                    114:     /* insert a special level 0 listitem
                    115:      * this one is the starting point for the table of contents in the html version
                    116:      * and the Top-Node of the info version.
                    117:      *
                    118:      * Added this to support multiple level 1 items.     --SB
                    119:      */
                    120:     listitems = 1;
                    121:     head = (list = (struct LIST *) xmalloc(sizeof(struct LIST)));
                    122:     list->prev = NULL;
                    123:     list->line = 0;
                    124:     list->level = 0;
                    125:     /* I would prefer list->string = NULL, but don't know if free(NULL) is OK
                    126:      * with all supported plattforms. */
                    127:     list->string = (char *) xmalloc(1);
                    128:     list->next = NULL;
                    129:
                    130:     while (get_line(line, sizeof(line), a)) {
                    131:        lineno++;
                    132:        if (isdigit((int)line[0])) {    /* start of new section */
                    133:            listitems++;
                    134:
                    135:            if (list == NULL) { /* impossible with the new level 0 item */
                    136:                head = (list = (struct LIST *) xmalloc(sizeof(struct LIST)));
                    137:                list->prev = NULL;
                    138:            } else {
                    139:                list->next = (struct LIST *) xmalloc(sizeof(struct LIST));
                    140:                list->next->prev = list;
                    141:                list = list->next;
                    142:                list->next = NULL;
                    143:            }
                    144:
                    145:            list->line = lastline = lineno;
                    146:            list->level = line[0] - '0';
                    147:            list->string = (char *) xmalloc(strlen(line) + 1);
                    148:            c = strtok(&(line[1]), "\n");
                    149:            strcpy(list->string, c);
                    150:            list->next = NULL;
                    151:            if (list->level > maxlevel)
                    152:                maxlevel = list->level;
                    153:        }
                    154:        if (line[0] == '?') {   /* keywords */
                    155:            if (keylist == NULL) {
                    156:                keyhead = (keylist = (struct LIST *) xmalloc(sizeof(struct LIST)));
                    157:                keylist->prev = NULL;
                    158:            } else {
                    159:                keylist->next = (struct LIST *) xmalloc(sizeof(struct LIST));
                    160:                keylist->next->prev = keylist;
                    161:                keylist = keylist->next;
                    162:            }
                    163:
                    164:            keylist->line = lastline;
                    165:            keylist->level = list->level;
                    166:            c = strtok(&(line[1]), "\n");
                    167:            if (c == NULL || *c == '\0')
                    168:                c = list->string;
                    169:            keylist->string = (char *) malloc(strlen(c) + 1);
                    170:            strcpy(keylist->string, c);
                    171:            keylist->next = NULL;
                    172:        }
                    173:     }
                    174:     rewind(a);
                    175: }
                    176:
                    177: /* look up a topic in text reference */
                    178: /*
                    179:  * Original version from doc2rtf (|| ipf || html) scanned keylist before list.
                    180:  * This way we get a reference to `plot` for the topic `splot` instead
                    181:  * of one to `splot`. Switched the search order -SB.
                    182:  */
                    183: struct LIST *
                    184:  lookup(s)
                    185: char *s;
                    186: {
                    187:     char *c;
                    188:     char tokstr[MAX_LINE_LEN+1];
                    189:     char *match;
                    190:     int l;
                    191:
                    192:     strcpy(tokstr, s);
                    193:
                    194:     /* first try titles */
                    195:     match = strtok(tokstr, " \n\t");
                    196:     if (match == NULL) {
                    197:        fprintf(stderr, "Error in lookup(\"%s\")\n", s);
                    198:
                    199:        /* there should a line number, but it is local to parse()  */
                    200:        fprintf(stderr, "Possible missing link character (`) near above line number\n");
                    201:        exit(3);
                    202:     }
                    203:     l = 0;                     /* level */
                    204:
                    205:     list = head;
                    206:     while (list != NULL) {
                    207:        c = list->string;
                    208:        while (isspace((int)(*c)))
                    209:            c++;
                    210:        if (!strcmp(match, c)) {
                    211:            l = list->level;
                    212:            match = strtok(NULL, "\n\t ");
                    213:            if (match == NULL) {
                    214:                return (list);
                    215:            }
                    216:        }
                    217:        if (l > list->level)
                    218:            break;
                    219:        list = list->next;
                    220:     }
                    221:
                    222:     /* then try the ? keyword entries */
                    223:     keylist = keyhead;
                    224:     while (keylist != NULL) {
                    225:        c = keylist->string;
                    226:        while (isspace((int)(*c)))
                    227:            c++;
                    228:        if (!strcmp(s, c))
                    229:            return (keylist);
                    230:        keylist = keylist->next;
                    231:     }
                    232:
                    233:     return (NULL);
                    234: }
                    235:
                    236: /*
                    237:  * find title-entry for keyword-entry
                    238:  */
                    239: struct LIST *lkup_by_number(line)
                    240: int line;
                    241: {
                    242:     struct LIST *run = head;
                    243:
                    244:     while (run->next && run->next->line <= line)
                    245:        run = run->next;
                    246:
                    247:     if (run->next)
                    248:        return run;
                    249:     else
                    250:        return NULL;
                    251: }
                    252:
                    253: /*
                    254:  * free the whole list (I never trust the OS -SB)
                    255:  */
                    256: void list_free __PROTO((void))
                    257: {
                    258:     struct LIST *run;
                    259:
                    260:     for (run = head; run->next; run = run->next);
                    261:     for (run = run->prev; run; run = run->prev) {
                    262:        free(run->next->string);
                    263:        free(run->next);
                    264:     }
                    265:     free(head->string);
                    266:     free(head);
                    267:
                    268:     for (run = keyhead; run->next; run = run->next);
                    269:     for (run = run->prev; run; run = run->prev) {
                    270:        free(run->next->string);
                    271:        free(run->next);
                    272:     }
                    273:     free(keyhead->string);
                    274:     free(keyhead);
                    275: }
                    276:
                    277:
                    278: /* search through the list to find any references */
                    279: /*
                    280:  * writes a menu of all subtopics of the topic located at l
                    281:  * format must contain %s for the title of the subtopic and may contain
                    282:  * a %d for the line number of the subtopic (used by doc2html and doc2rtf
                    283:  * The whole menu is preceeded by start and gets the trailer end
                    284:  */
                    285: void refs(l, f, start, end, format)
                    286: int l;
                    287: FILE *f;
                    288: char *start, *end, *format;
                    289: {
                    290:     int curlevel, i;
                    291:     char *c;
                    292:     int inlist = FALSE;
                    293:
                    294:     /* find current line */
                    295:     list = head;
                    296:     while (list->line != l)
                    297:        list = list->next;
                    298:     curlevel = list->level;
                    299:     list = list->next;         /* look at next element before going on */
                    300:
                    301:     if (start != NULL && list != NULL) {       /* don't wrie start if there's no menue at all */
                    302:        inlist = TRUE;
                    303:        fprintf(f, "%s", start);
                    304:     }
                    305:     while (list != NULL) {
                    306:        /* we are onto the next topic so stop */
                    307:        if (list->level == curlevel)
                    308:            break;
                    309:        /* these are the next topics down the list */
                    310:        if (list->level == curlevel + 1) {
                    311:            c = list->string;
                    312:            while (isspace((int)(*c)))
                    313:                c++;            /* strip leading whitespace */
                    314:
                    315:            if (format != NULL) {
                    316:                for (i = 0; format[i] != '%' && format[i] != '\0'; i++);
                    317:                if (format[i] != '\0') {
                    318:                    if (format[i + 1] == 'd') {
                    319:                        /* line number has to be printed first */
                    320:                        fprintf(f, format, list->line, c);
                    321:                    }
                    322:                    else {
                    323:                        ++i;
                    324:                        for (; format[i] != '%' && format[i] != '\0'; i++);
                    325:                        if (format[i] != '\0')  /* line number is second */
                    326:                            fprintf(f, format, c, list->line);
                    327:                        else    /* no line number at all */
                    328:                            fprintf(f, format, c);
                    329:                    }
                    330:                }
                    331:            }
                    332:        }
                    333:        list = list->next;
                    334:     }
                    335:     if (inlist && end)         /* trailer */
                    336:        fprintf(f, "%s", end);
                    337: }

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