Annotation of 43BSD/contrib/mkmf/src/depend.c, revision 1.1

1.1     ! root        1: /* $Header: depend.c,v 1.14 86/05/15 09:01:04 lepreau Exp $ */
        !             2: 
        !             3: /*
        !             4:  * Author: Peter J. Nicklin
        !             5:  */
        !             6: #include <ctype.h>
        !             7: #include <stdio.h>
        !             8: #include "Mkmf.h"
        !             9: #include "dlist.h"
        !            10: #include "hash.h"
        !            11: #include "macro.h"
        !            12: #include "null.h"
        !            13: #include "path.h"
        !            14: #include "slist.h"
        !            15: #include "system.h"
        !            16: #include "yesno.h"
        !            17: 
        !            18: #define USRINCLUDE             "/usr/include/"
        !            19: #define CURINCLUDE             "./"
        !            20: #define TOLOWER(c)             (isupper(c) ? tolower(c) : (c))
        !            21: #define SKIPWHITESPACE(c, f) while ((c = getc(f))==' ' || c=='\t'); ungetc(c,f);
        !            22: 
        !            23: /*
        !            24:  * Include file state
        !            25:  */
        !            26: #define NOTFOUND               0       /* not found anywhere */
        !            27: #define EXTERNAL               1       /* not found in current directory */
        !            28: #define INTERNAL               2       /* found in current directory */
        !            29: #define FROMRULE               3       /* derived from tranformation rule */
        !            30: 
        !            31: /*
        !            32:  * Include files are stored in hash tables by direct chaining (See
        !            33:  * p. 134 in `The C Programming Language' by Kernighan and Ritchie).
        !            34:  * Included include files are also added to a singly-linked list
        !            35:  * attached to the hash table entry for the include file.
        !            36:  */
        !            37: static HASH *C_INCLUDETABLE = NULL;    /* C include file hash table */
        !            38: static HASH *F_INCLUDETABLE = NULL;    /* Fortran include file hash table */
        !            39: static HASH *P_INCLUDETABLE = NULL;    /* Pascal include file hash table */
        !            40: /*
        !            41:  * Additional include directories are specified via the -I compiler
        !            42:  * command line option. These directories are stored in singly-linked lists.
        !            43:  * We also assume that the last look-up directory is "/usr/include".
        !            44:  */
        !            45: static SLIST *C_INCDIR;                        /* C include directories */
        !            46: static SLIST *F_INCDIR;                        /* Fortran include directories */
        !            47: static SLIST *P_INCDIR;                        /* Pascal include directories */
        !            48: 
        !            49: SLIST *EXTLIST;                                /* external header file name list */
        !            50: 
        !            51: extern char *PGN;                      /* program name */
        !            52: 
        !            53: /*
        !            54:  * addincdir() adds directories containing include files to the
        !            55:  * appropriate singly-linked list. The pathnames to the directories
        !            56:  * are derived from makefile macro definitions.
        !            57:  */
        !            58: void
        !            59: addincdir()
        !            60: {
        !            61:        extern HASH *MDEFTABLE;         /* macro definition table */
        !            62:        char *slappend();               /* append to singly-linked list */
        !            63:        HASHBLK *htb;                   /* hash table entry block */
        !            64:        HASHBLK *htlookup();            /* find hash table entry */
        !            65:        int cleanup();                  /* remove temporary makefile and exit */
        !            66:        void getI();                    /* get include directory pathnames */
        !            67: 
        !            68:        /* C files */
        !            69:        if ((htb = htlookup(MCFLAGS, MDEFTABLE)) != NULL)
        !            70:                getI(htb->h_key, htb->h_def, C_INCDIR);
        !            71:        if (slappend(USRINCLUDE, C_INCDIR) == NULL)
        !            72:                cleanup();
        !            73:        
        !            74:        /* Fortran files */
        !            75:        if ((htb = htlookup(MFFLAGS, MDEFTABLE)) != NULL)
        !            76:                getI(htb->h_key, htb->h_def, F_INCDIR);
        !            77:        if (slappend(USRINCLUDE, F_INCDIR) == NULL)
        !            78:                cleanup();
        !            79: 
        !            80:        /* Pascal files */
        !            81:        if ((htb = htlookup(MPFLAGS, MDEFTABLE)) != NULL)
        !            82:                getI(htb->h_key, htb->h_def, P_INCDIR);
        !            83:        if (slappend(USRINCLUDE, P_INCDIR) == NULL)
        !            84:                cleanup();
        !            85: }
        !            86: 
        !            87: 
        !            88: 
        !            89: /*
        !            90:  * findinclude() tries to find the pathname of an include file. Returns
        !            91:  * integer INTERNAL if found in the current directory, EXTERNAL if found
        !            92:  * somewhere else, FROMRULE if derived from a transformation rule,
        !            93:  * otherwise NOTFOUND. The pathname is copied into incpath.
        !            94:  */
        !            95: #define LOCALDIR(f)    (index(f, _PSC) == NULL)
        !            96: #define INCLUDETYPE(f) ((index(f, _PSC) == NULL) ? INTERNAL : EXTERNAL)
        !            97: 
        !            98: findinclude(incpath, incname, lastname, type)
        !            99:        char *incpath;                  /* pathname receiving buffer */
        !           100:        register char *incname;         /* include file name */
        !           101:        char *lastname;                 /* file that includes incname */
        !           102:        int type;                       /* file type */
        !           103: {
        !           104:        register char *pp;              /* include file path pointer */
        !           105:        char *index();                  /* find occurrence of character */
        !           106:        char *optpath();                /* optimize pathname */
        !           107:        char *pathcat();                /* pathname concatenation */
        !           108:        char *pathhead();               /* remove pathname tail */
        !           109:        char *strcpy();                 /* string copy */
        !           110:        char *strpcpy();                /* string copy and update pointer */
        !           111:        int lookuprule();               /* look up transformation rules */
        !           112:        SLBLK *slb;                     /* singly-linked list block */
        !           113:        SLIST *slist;                   /* include directory list pointer */
        !           114: 
        !           115:        /*
        !           116:         * look in /usr/include only
        !           117:         */
        !           118:        if (*incname == '<')
        !           119:                {
        !           120:                pp = strpcpy(incpath, USRINCLUDE);
        !           121:                for (incname++; *incname != '>'; incname++, pp++)
        !           122:                        *pp = *incname;
        !           123:                *pp = '\0';
        !           124:                return(FILEXIST(incpath) ? EXTERNAL : NOTFOUND);
        !           125:                }
        !           126: 
        !           127:        /*
        !           128:         * look for an absolute include file name
        !           129:         */
        !           130:        if (*incname == '/')
        !           131:                {
        !           132:                strcpy(incpath, incname);
        !           133:                return(FILEXIST(incpath) ? EXTERNAL : NOTFOUND);
        !           134:                }
        !           135: 
        !           136:        /*
        !           137:         * look in current include directory to see if the file exists,
        !           138:         * or can be generated by a transformation rule in the current
        !           139:         * working directory.
        !           140:         */
        !           141:        if (LOCALDIR(lastname))
        !           142:                {
        !           143:                if (LOCALDIR(incname))
        !           144:                        {
        !           145:                        if (lookuprule(incname, incpath) == YES)
        !           146:                                return(FROMRULE);
        !           147:                        }
        !           148:                strcpy(incpath, incname);
        !           149:                if (FILEXIST(incpath))
        !           150:                        return(INCLUDETYPE(incpath));
        !           151:                }
        !           152:        else    {
        !           153:                strcpy(incpath, lastname);
        !           154:                pathcat(incpath, pathhead(incpath), incname);
        !           155:                optpath(incpath);
        !           156:                if (FILEXIST(incpath))
        !           157:                        return(INCLUDETYPE(incpath));
        !           158:                }
        !           159: 
        !           160:        /*
        !           161:         * search directory list
        !           162:         */
        !           163:        switch (type)
        !           164:                {
        !           165:                case INCLUDE_C:
        !           166:                        slist = C_INCDIR;
        !           167:                        break;
        !           168:                case INCLUDE_FORTRAN:
        !           169:                        slist = F_INCDIR;
        !           170:                        break;
        !           171:                case INCLUDE_PASCAL:
        !           172:                        slist = P_INCDIR;
        !           173:                        break;
        !           174:                }
        !           175:        for (slb = slist->head; slb != NULL; slb = slb->next)
        !           176:                {
        !           177:                pp = strpcpy(incpath, slb->key);
        !           178:                strcpy(pp, incname);
        !           179:                optpath(incpath);
        !           180:                if (FILEXIST(incpath))
        !           181:                        return(INCLUDETYPE(incpath));
        !           182:                }
        !           183:        return(NOTFOUND);
        !           184: }
        !           185: 
        !           186: 
        !           187: 
        !           188: /*
        !           189:  * getI() appends include directories found via the -I compiler option to
        !           190:  * a singly linked list.
        !           191:  */
        !           192: void
        !           193: getI(mnam, mdef, slist)
        !           194:        char *mnam;                     /* compiler options macro name */
        !           195:        char *mdef;                     /* compiler options macro definition */
        !           196:        SLIST *slist;                   /* singly-linked list */
        !           197: {
        !           198:        char *gettoken();               /* get next token */
        !           199:        char incpath[PATHSIZE];         /* include directory pathname buffer */
        !           200:        char *slappend();               /* append to singly-linked list */
        !           201:        char *strcat();                 /* string concatenation */
        !           202:        int cleanup();                  /* remove temporary makefile and exit */
        !           203: 
        !           204:        while ((mdef = gettoken(incpath, mdef)) != NULL)
        !           205:                if (incpath[0] == '-' && incpath[1] == 'I')
        !           206:                        if (incpath[2] == '\0') /* -I dir option */
        !           207:                                {
        !           208:                                if ((mdef = gettoken(incpath, mdef)) != NULL)
        !           209:                                        {
        !           210:                                        strcat(incpath, PATHSEP);
        !           211:                                        if (slappend(incpath, slist) == NULL)
        !           212:                                                cleanup();
        !           213:                                        }
        !           214:                                else    {
        !           215:                                        warn2("missing include directory in %s %s",
        !           216:                                               mnam, "macro definition");
        !           217:                                        break;
        !           218:                                        }
        !           219:                                }
        !           220:                        else    {               /* -Idir option */
        !           221:                                strcat(incpath+2, PATHSEP);
        !           222:                                if (slappend(incpath+2, slist) == NULL)
        !           223:                                        cleanup();
        !           224:                                }
        !           225: }
        !           226: 
        !           227: 
        !           228: 
        !           229: /*
        !           230:  * getinclude() fetchs an include file name from a line of source code.
        !           231:  * /usr/include '<' and '>' delimiters remain with the filename to
        !           232:  * distinguish it from an include file in a local directory. Returns
        !           233:  * NO if syntax error, otherwise YES.
        !           234:  */
        !           235: getinclude(incname, curname, lineno, ifp)
        !           236:        char *curname;                  /* current file name */
        !           237:        char *incname;                  /* include file name receiving buffer */
        !           238:        int lineno;                     /* current line number */
        !           239:        register FILE *ifp;             /* input stream */
        !           240: {
        !           241:        register char *ip;              /* include file name buffer pointer */
        !           242:        register int c;                 /* current character */
        !           243: 
        !           244:        SKIPWHITESPACE(c, ifp);
        !           245:        for (ip = incname; (c = getc(ifp)) != EOF; ip++)
        !           246:                {
        !           247:                *ip = c;
        !           248:                if (c == '\n' || c == '\t' || c == ' ' || c == ';'  || c == ',')
        !           249:                        {
        !           250:                        ungetc(c, ifp);
        !           251:                        break;
        !           252:                        }
        !           253:                }
        !           254:        *ip = '\0';
        !           255:        if ((*incname == '<'  && ip[-1] != '>')  ||
        !           256:            (*incname == '\"' && ip[-1] != '\"') ||
        !           257:            (*incname == '\'' && ip[-1] != '\'') ||
        !           258:            (*incname == '('  && ip[-1] != ')'))
        !           259:                {
        !           260:                fprintf(stderr,
        !           261:                        "%s: \"%s\", line %d: bad include syntax for %s\n",
        !           262:                        PGN, curname, lineno, incname);
        !           263:                return(NO);
        !           264:                }
        !           265:        if (*incname == '\"' || *incname == '\'' || *incname == '(')
        !           266:                {
        !           267:                ip[-1] = '\0';
        !           268:                ip = incname + 1;
        !           269:                while (*incname++ = *ip++)
        !           270:                        continue;
        !           271:                }
        !           272:        return(YES);
        !           273: }
        !           274: 
        !           275: 
        !           276: 
        !           277: /*
        !           278:  * inclink() stores a pointer to a hash table block (which contains
        !           279:  * include file information) somewhere. Returns a pointer to the somewhere,
        !           280:  * or calls cleanup() if out of memory.
        !           281:  */
        !           282: INCBLK *
        !           283: inclink(htb)
        !           284:        HASHBLK *htb;                   /* hash table block pointer to save */
        !           285: {
        !           286:        char *malloc();                 /* memory allocator */
        !           287:        INCBLK *iblk;                   /* pointer to new include chain block */
        !           288:        int cleanup();                  /* remove temporary makefile and exit */
        !           289: 
        !           290:        if ((iblk = (INCBLK *) malloc(sizeof(INCBLK))) == NULL)
        !           291:                {
        !           292:                warn("out of memory");
        !           293:                cleanup();
        !           294:                }
        !           295:        iblk->i_loop = NO;
        !           296:        iblk->i_hblk = htb;
        !           297:        iblk->i_next = NULL;
        !           298:        return(iblk);
        !           299: }
        !           300: 
        !           301: 
        !           302: 
        !           303: /*
        !           304:  * instalinclude() adds an include file name to the appropriate include
        !           305:  * file hash table. Returns a pointer to the hash table block, or calls
        !           306:  * cleanup() if out of memory.
        !           307:  */
        !           308: HASHBLK *
        !           309: instalinclude(incname, incpath, type)
        !           310:        char *incname;                  /* name of include file */
        !           311:        char *incpath;                  /* path to include file */
        !           312:        int type;                       /* type of source file */
        !           313: {
        !           314:        HASH *htinit();                 /* initialize hash table */
        !           315:        HASHBLK *htb = NULL;            /* hash table block */
        !           316:        HASHBLK *htinstall();           /* install hash table entry */
        !           317:        int cleanup();                  /* remove temporary makefile and exit */
        !           318:        int ilen;                       /* include path length */
        !           319:        int strlen();                   /* string length */
        !           320: 
        !           321:        ilen = strlen(incpath);
        !           322:        switch (type)
        !           323:                {
        !           324:                case INCLUDE_C:
        !           325:                        if (C_INCLUDETABLE == NULL)
        !           326:                                {
        !           327:                                C_INCLUDETABLE = htinit(INCLUDETABLESIZE);
        !           328:                                }
        !           329:                        htb = htinstall(incname, incpath, ilen, C_INCLUDETABLE);
        !           330:                        break;
        !           331:                case INCLUDE_FORTRAN:
        !           332:                        if (F_INCLUDETABLE == NULL)
        !           333:                                {
        !           334:                                F_INCLUDETABLE = htinit(INCLUDETABLESIZE);
        !           335:                                }
        !           336:                        htb = htinstall(incname, incpath, ilen, F_INCLUDETABLE);
        !           337:                        break;
        !           338:                case INCLUDE_PASCAL:
        !           339:                        if (P_INCLUDETABLE == NULL)
        !           340:                                {
        !           341:                                P_INCLUDETABLE = htinit(INCLUDETABLESIZE);
        !           342:                                }
        !           343:                        htb = htinstall(incname, incpath, ilen, P_INCLUDETABLE);
        !           344:                        break;
        !           345:                }
        !           346:        if (htb == NULL)
        !           347:                cleanup();
        !           348:        return(htb);
        !           349: }
        !           350: 
        !           351: 
        !           352: 
        !           353: /*
        !           354:  * lookupinclude() returns a pointer to an include hash table block
        !           355:  * corresponding to incname and type. Returns null if not found.
        !           356:  */
        !           357: HASHBLK *
        !           358: lookupinclude(incname, type)
        !           359:        char *incname;                  /* name of include file */
        !           360:        int type;                       /* type of source file */
        !           361: {
        !           362:        HASH *includetable = NULL;      /* include file hash table */
        !           363:        HASHBLK *htlookup();            /* find hash table entry */
        !           364: 
        !           365:        switch (type)
        !           366:                {
        !           367:                case INCLUDE_C:
        !           368:                        includetable = C_INCLUDETABLE;
        !           369:                        break;
        !           370:                case INCLUDE_FORTRAN:
        !           371:                        includetable = F_INCLUDETABLE;
        !           372:                        break;
        !           373:                case INCLUDE_PASCAL:
        !           374:                        includetable = P_INCLUDETABLE;
        !           375:                        break;
        !           376:                }
        !           377:        return((includetable == NULL) ? NULL : htlookup(incname, includetable));
        !           378: }
        !           379: 
        !           380: 
        !           381: 
        !           382: /*
        !           383:  * mkdepend() creates include file dependencies for object files and installs
        !           384:  * them to dependency list dlp. Returns a pointer to the dependency list.
        !           385:  */
        !           386: DLIST *
        !           387: mkdepend()
        !           388: {
        !           389:        extern SLIST *SRCLIST;          /* source file name list */
        !           390:        char *rindex();                 /* find last occurrence of character */
        !           391:        char *suffix;                   /* suffix pointer */
        !           392:        DLBLK *dlappend();              /* append dependency list */
        !           393:        DLIST *dlinit();                /* initialize dependency list */
        !           394:        DLIST *dlist;                   /* dependency list */
        !           395:        INCBLK *ibp;                    /* pointer to chain of include files */
        !           396:        INCBLK *readC();                /* read C include-style files */
        !           397:        INCBLK *readF();                /* read Fortran include-style files */
        !           398:        INCBLK *readP();                /* read Pascal include-style files */
        !           399:        int cleanup();                  /* remove temporary makefile and exit */
        !           400:        int lookuptypeofinclude();      /* look up the brand of include */
        !           401:        int slsort();                   /* sort singly-linked list */
        !           402:        int strcmp();                   /* string comparison */
        !           403:        int type;                       /* source file type */
        !           404:        SLBLK *lbp;                     /* list block pointer */
        !           405:        SLIST *slinit();                /* initialize singly-linked list */
        !           406:        void addincdir();               /* add to list of include directories */
        !           407:        void rmprinttag();              /* remove "already printed" tags */
        !           408: 
        !           409:        /* initialize include file look-up lists */
        !           410:        C_INCDIR = slinit();
        !           411:        F_INCDIR = slinit();
        !           412:        P_INCDIR = slinit();
        !           413: 
        !           414:        /* add additional include directories */
        !           415:        addincdir();
        !           416: 
        !           417:        /* initialize external header file name list */
        !           418:        EXTLIST = slinit();
        !           419: 
        !           420:        /* initialize dependency list */
        !           421:        dlist = dlinit();
        !           422:         
        !           423:        for (lbp = SRCLIST->head; lbp != NULL; lbp = lbp->next)
        !           424:                {
        !           425:                suffix = rindex(lbp->key, '.');
        !           426:                type = lookuptypeofinclude(++suffix);
        !           427:                switch (type)
        !           428:                        {
        !           429:                        case INCLUDE_C:
        !           430:                                ibp = readC(lbp->key, 0, lbp->key);
        !           431:                                break;
        !           432:                        case INCLUDE_FORTRAN:
        !           433:                                ibp = readF(lbp->key, 0, lbp->key);
        !           434:                                break;
        !           435:                        case INCLUDE_PASCAL:
        !           436:                                ibp = readP(lbp->key, 0, lbp->key);
        !           437:                                break;
        !           438:                        case INCLUDE_NONE:
        !           439:                                ibp = NULL;
        !           440:                                break;
        !           441:                        }
        !           442:                if (ibp != NULL)
        !           443:                        {
        !           444:                        if (dlappend(type, lbp, ibp, dlist) == NULL)
        !           445:                                cleanup();
        !           446:                        }
        !           447:                }
        !           448:        if (slsort(strcmp, EXTLIST) == NO)
        !           449:                cleanup();
        !           450:        return(dlist);
        !           451: }
        !           452: 
        !           453: 
        !           454: 
        !           455: /*
        !           456:  * notfound() prints a "can't find" filename error message.
        !           457:  */
        !           458: void
        !           459: notfound(curname, lineno, incname)
        !           460:        char *curname;                  /* current file name */
        !           461:        char *incname;                  /* name of include file */
        !           462:        int lineno;                     /* current line number */
        !           463: {
        !           464:        if (PGN != NULL && *PGN != '\0')
        !           465:                {
        !           466:                fprintf(stderr, "%s: ", PGN);
        !           467:                }
        !           468:        if (*incname == '<')
        !           469:                {
        !           470:                fprintf(stderr, "\"%s\", line %d: can't find %s\n",
        !           471:                        curname, lineno, incname);
        !           472:                }
        !           473:        else    {
        !           474:                fprintf(stderr, "\"%s\", line %d: can't find \"%s\"\n",
        !           475:                        curname, lineno, incname);
        !           476:                }
        !           477: }
        !           478: 
        !           479: 
        !           480: 
        !           481: /*
        !           482:  * readC() searches C files for included files. Returns a pointer to
        !           483:  * the chain of include files installed or found in the include file
        !           484:  * hash table, or null if no include files found.
        !           485:  */
        !           486: INCBLK *
        !           487: readC(lastfile, lastline, curname)
        !           488:        char *lastfile;                 /* parent file name */
        !           489:        int lastline;                   /* current line in parent file */
        !           490:        char *curname;                  /* current file name */
        !           491: {
        !           492:        register char *p;               /* include string pointer */
        !           493:        register FILE *ifp;             /* input file stream */
        !           494:        register int c;                 /* current character */
        !           495:        char incname[PATHSIZE];         /* name of include file */
        !           496:        char incpath[PATHSIZE];         /* path to include file */
        !           497:        char *slappend();               /* append pathname to list */
        !           498:        FILE *fopen();                  /* open file */
        !           499:        HASHBLK *ftb;                   /* fromrule hash table entry block */
        !           500:        HASHBLK *htb = NULL;            /* hash table entry block */
        !           501:        HASHBLK *instalinclude();       /* install include name in hash table */
        !           502:        HASHBLK *lookupinclude();       /* look up include in hash table */
        !           503:        INCBLK *i_head = NULL;          /* head of include chain */
        !           504:        INCBLK *i_tail = NULL;          /* tail of include chain */
        !           505:        INCBLK *inclink();              /* link include file hash blocks */
        !           506:        int cleanup();                  /* remove temporary makefile and exit */
        !           507:        int findinclude();              /* locate include file */
        !           508:        int getinclude();               /* get include name from input line */
        !           509:        int inctype;                    /* origin of include file */
        !           510:        int lineno = 1;                 /* current line number */
        !           511:        int strlen();                   /* string length */
        !           512:        int type;                       /* file type */
        !           513:        void notfound();                /* print "can't find" filename msg */
        !           514: 
        !           515:        type = INCLUDE_C;
        !           516: 
        !           517:        if ((ifp = fopen(curname, "r")) == NULL)
        !           518:                {
        !           519:                if (lastline > 0)
        !           520:                        fprintf(stderr, "%s: \"%s\", line %d: ", PGN,
        !           521:                                lastfile, lastline);
        !           522:                else
        !           523:                        fprintf(stderr, "%s: ", PGN);
        !           524:                perror(curname);
        !           525:                return(NULL);
        !           526:                }
        !           527:        while ((c = getc(ifp)) != EOF)
        !           528:                {
        !           529:                if (c != '#')
        !           530:                        goto nextline;
        !           531:                SKIPWHITESPACE(c, ifp);
        !           532:                for (p = "include"; (c = getc(ifp)) == *p && *p != '\0' ; p++)
        !           533:                        continue;
        !           534:                if (*p != '\0')
        !           535:                        goto nextline;
        !           536:                if (getinclude(incname, curname, lineno, ifp) == NO)
        !           537:                        goto nextline;
        !           538:                if ((htb = lookupinclude(incname, type)) == NULL)
        !           539:                        {
        !           540:                        inctype = findinclude(incpath, incname, curname, type);
        !           541:                        if (inctype == INTERNAL)
        !           542:                                {
        !           543:                                htb = instalinclude(incname, incpath, type);
        !           544:                                }
        !           545:                        else if (inctype == EXTERNAL)
        !           546:                                {
        !           547:                                htb = instalinclude(incname, incpath, type);
        !           548:                                if (slappend(incpath, EXTLIST) == NULL)
        !           549:                                        cleanup();
        !           550:                                }
        !           551:                        else if (inctype == FROMRULE)
        !           552:                                {
        !           553:                                htb = instalinclude(incname, incname, type);
        !           554:                                ftb = instalinclude(incpath, incpath, type);
        !           555:                                }
        !           556:                        else    {
        !           557:                                notfound(curname, lineno, incname);
        !           558:                                goto nextline;
        !           559:                                }
        !           560: 
        !           561:                        /* look for nested include files */
        !           562:                        htb->h_sub = readC(curname, lineno, incpath);
        !           563: 
        !           564:                        if (inctype == FROMRULE) 
        !           565:                                ftb->h_sub = htb->h_sub;
        !           566:                        }
        !           567:                if (i_tail == NULL)
        !           568:                        {
        !           569:                        i_head = i_tail = inclink(htb);
        !           570:                        }
        !           571:                else    {
        !           572:                        i_tail = i_tail->i_next = inclink(htb);
        !           573:                        }
        !           574: nextline:      while (c != '\n' && c != EOF)
        !           575:                        c = getc(ifp);
        !           576:                lineno++;
        !           577:                }
        !           578:        fclose(ifp);
        !           579:        return(i_head);
        !           580: }
        !           581: 
        !           582: 
        !           583: 
        !           584: /*
        !           585:  * readF() searches Fortran files for included files. Returns a pointer
        !           586:  * to the chain of include files installed or found in the include file
        !           587:  * hash table, or null if no include files found.
        !           588:  */
        !           589: INCBLK *
        !           590: readF(lastfile, lastline, curname)
        !           591:        char *lastfile;                 /* parent file name */
        !           592:        int lastline;                   /* current line in parent file */
        !           593:        char *curname;                  /* current file name */
        !           594: {
        !           595:        register char *p;               /* include string pointer */
        !           596:        register FILE *ifp;             /* input file stream */
        !           597:        register int c;                 /* current character */
        !           598:        char incname[PATHSIZE];         /* name of include file */
        !           599:        char incpath[PATHSIZE];         /* path to include file */
        !           600:        char *slappend();               /* append pathname to list */
        !           601:        FILE *fopen();                  /* open file */
        !           602:        HASHBLK *ftb;                   /* fromrule hash table entry block */
        !           603:        HASHBLK *htb = NULL;            /* hash table entry block */
        !           604:        HASHBLK *instalinclude();       /* install include name in hash table */
        !           605:        HASHBLK *lookupinclude();       /* look up include in hash table */
        !           606:        INCBLK *i_head = NULL;          /* head of include chain */
        !           607:        INCBLK *i_tail = NULL;          /* tail of include chain */
        !           608:        INCBLK *inclink();              /* link include file hash blocks */
        !           609:        int cleanup();                  /* remove temporary makefile and exit */
        !           610:        int findinclude();              /* locate include file */
        !           611:        int getinclude();               /* get include name from input line */
        !           612:        int inctype;                    /* origin of include file */
        !           613:        int lineno = 1;                 /* current line number */
        !           614:        int strlen();                   /* string length */
        !           615:        int type;                       /* file type */
        !           616:        void notfound();                /* print "can't find" filename msg */
        !           617: 
        !           618:        type = INCLUDE_FORTRAN;
        !           619: 
        !           620:        if ((ifp = fopen(curname, "r")) == NULL)
        !           621:                {
        !           622:                if (lastline > 0)
        !           623:                        fprintf(stderr, "%s: \"%s\", line %d: ", PGN,
        !           624:                                lastfile, lastline);
        !           625:                else
        !           626:                        fprintf(stderr, "%s: ", PGN);
        !           627:                perror(curname);
        !           628:                return(NULL);
        !           629:                }
        !           630:        while ((c = getc(ifp)) != EOF)
        !           631:                {
        !           632:                if (c == 'c' || c == 'C' || c == '*' || c == '\n')
        !           633:                        goto nextline;
        !           634:                while ((c = getc(ifp)) == ' ' || c == '\t')
        !           635:                        continue;
        !           636:                for (p = "include"; *p == TOLOWER(c) && *p != '\0'; p++)
        !           637:                        c = getc(ifp);
        !           638:                if (*p != '\0')
        !           639:                        goto nextline;
        !           640:                if (getinclude(incname, curname, lineno, ifp) == NO)
        !           641:                        goto nextline;
        !           642:                if ((htb = lookupinclude(incname, type)) == NULL)
        !           643:                        {
        !           644:                        inctype = findinclude(incpath, incname, curname, type);
        !           645:                        if (inctype == INTERNAL)
        !           646:                                {
        !           647:                                htb = instalinclude(incname, incpath, type);
        !           648:                                }
        !           649:                        else if (inctype == EXTERNAL)
        !           650:                                {
        !           651:                                htb = instalinclude(incname, incpath, type);
        !           652:                                if (slappend(incpath, EXTLIST) == NULL)
        !           653:                                        cleanup();
        !           654:                                }
        !           655:                        else if (inctype == FROMRULE)
        !           656:                                {
        !           657:                                htb = instalinclude(incname, incname, type);
        !           658:                                ftb = instalinclude(incpath, incpath, type);
        !           659:                                }
        !           660:                        else    {
        !           661:                                notfound(curname, lineno, incname);
        !           662:                                goto nextline;
        !           663:                                }
        !           664: 
        !           665:                        /* look for nested include files */
        !           666:                        htb->h_sub = readF(curname, lineno, incpath);
        !           667: 
        !           668:                        if (inctype == FROMRULE) 
        !           669:                                ftb->h_sub = htb->h_sub;
        !           670:                        }
        !           671:                if (i_tail == NULL)
        !           672:                        {
        !           673:                        i_head = i_tail = inclink(htb);
        !           674:                        }
        !           675:                else    {
        !           676:                        i_tail = i_tail->i_next = inclink(htb);
        !           677:                        }
        !           678: nextline:      while (c != '\n' && c != EOF)
        !           679:                        c = getc(ifp);
        !           680:                lineno++;
        !           681:                }
        !           682:        fclose(ifp);
        !           683:        return(i_head);
        !           684: }
        !           685: 
        !           686: 
        !           687: 
        !           688: /*
        !           689:  * readP() searches Pascal files for included files. Returns a pointer
        !           690:  * to the chain of include files installed or found in the include file
        !           691:  * hash table, or null if no include files found.
        !           692:  */
        !           693: INCBLK *
        !           694: readP(lastfile, lastline, curname)
        !           695:        char *lastfile;                 /* parent file name */
        !           696:        int lastline;                   /* current line in parent file */
        !           697:        char *curname;                  /* current file name */
        !           698: {
        !           699:        register char *p;               /* include string pointer */
        !           700:        register FILE *ifp;             /* input file stream */
        !           701:        register int c;                 /* current character */
        !           702:        char incname[PATHSIZE];         /* name of include file */
        !           703:        char incpath[PATHSIZE];         /* path to include file */
        !           704:        char *slappend();               /* append pathname to list */
        !           705:        FILE *fopen();                  /* open file */
        !           706:        HASHBLK *ftb;                   /* fromrule hash table entry block */
        !           707:        HASHBLK *htb = NULL;            /* hash table entry block */
        !           708:        HASHBLK *instalinclude();       /* install include name in hash table */
        !           709:        HASHBLK *lookupinclude();       /* look up include in hash table */
        !           710:        INCBLK *i_head = NULL;          /* head of include chain */
        !           711:        INCBLK *i_tail = NULL;          /* tail of include chain */
        !           712:        INCBLK *inclink();              /* link include file hash blocks */
        !           713:        int cleanup();                  /* remove temporary makefile and exit */
        !           714:        int findinclude();              /* locate include file */
        !           715:        int getinclude();               /* get include name from input line */
        !           716:        int inctype;                    /* origin of include file */
        !           717:        int lineno = 1;                 /* current line number */
        !           718:        int strlen();                   /* string length */
        !           719:        int type;                       /* file type */
        !           720:        void notfound();                /* print "can't find" filename msg */
        !           721: 
        !           722:        type = INCLUDE_PASCAL;
        !           723: 
        !           724:        if ((ifp = fopen(curname, "r")) == NULL)
        !           725:                {
        !           726:                if (lastline > 0)
        !           727:                        fprintf(stderr, "%s: \"%s\", line %d: ", PGN,
        !           728:                                lastfile, lastline);
        !           729:                else
        !           730:                        fprintf(stderr, "%s: ", PGN);
        !           731:                perror(curname);
        !           732:                return(NULL);
        !           733:                }
        !           734:        while ((c = getc(ifp)) != EOF)
        !           735:                {
        !           736:                if (c != '#')
        !           737:                        goto nextline;
        !           738:                while ((c = getc(ifp)) == ' ' || c == '\t')
        !           739:                        continue;
        !           740:                for (p = "include"; *p == TOLOWER(c) && *p != '\0'; p++)
        !           741:                        c = getc(ifp);
        !           742:                if (*p != '\0')
        !           743:                        goto nextline;
        !           744:                if (getinclude(incname, curname, lineno, ifp) == NO)
        !           745:                        goto nextline;
        !           746:                if ((htb = lookupinclude(incname, type)) == NULL)
        !           747:                        {
        !           748:                        inctype = findinclude(incpath, incname, curname, type);
        !           749:                        if (inctype == INTERNAL)
        !           750:                                {
        !           751:                                htb = instalinclude(incname, incpath, type);
        !           752:                                }
        !           753:                        else if (inctype == EXTERNAL)
        !           754:                                {
        !           755:                                htb = instalinclude(incname, incpath, type);
        !           756:                                if (slappend(incpath, EXTLIST) == NULL)
        !           757:                                        cleanup();
        !           758:                                }
        !           759:                        else if (inctype == FROMRULE)
        !           760:                                {
        !           761:                                htb = instalinclude(incname, incname, type);
        !           762:                                ftb = instalinclude(incpath, incpath, type);
        !           763:                                }
        !           764:                        else    {
        !           765:                                notfound(curname, lineno, incname);
        !           766:                                goto nextline;
        !           767:                                }
        !           768: 
        !           769:                        /* look for nested include files */
        !           770:                        htb->h_sub = readP(curname, lineno, incpath);
        !           771: 
        !           772:                        if (inctype == FROMRULE) 
        !           773:                                ftb->h_sub = htb->h_sub;
        !           774:                        }
        !           775:                if (i_tail == NULL)
        !           776:                        {
        !           777:                        i_head = i_tail = inclink(htb);
        !           778:                        }
        !           779:                else    {
        !           780:                        i_tail = i_tail->i_next = inclink(htb);
        !           781:                        }
        !           782: nextline:      while (c != '\n' && c != EOF)
        !           783:                        c = getc(ifp);
        !           784:                lineno++;
        !           785:                }
        !           786:        fclose(ifp);
        !           787:        return(i_head);
        !           788: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.