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

1.1     ! root        1: /* $Header: buildlist.c,v 1.3 86/01/12 00:49:30 lepreau Exp $ */
        !             2: 
        !             3: /*
        !             4:  * Author: Peter J. Nicklin
        !             5:  */
        !             6: #include <sys/types.h>
        !             7: #include <sys/dir.h>
        !             8: #include <stdio.h>
        !             9: #include <ctype.h>
        !            10: #include "Mkmf.h"
        !            11: #include "hash.h"
        !            12: #include "null.h"
        !            13: #include "path.h"
        !            14: #include "slist.h"
        !            15: #include "suffix.h"
        !            16: #include "system.h"
        !            17: #include "yesno.h"
        !            18: 
        !            19: /*
        !            20:  * buftolist() copies the items from a buffer to a singly-linked list.
        !            21:  * Returns integer YES if successful, otherwise NO.
        !            22:  */
        !            23: buftolist(buf, list)
        !            24:        char *buf;                      /* item buffer */
        !            25:        SLIST *list;                    /* receiving list */
        !            26: {
        !            27:        char *gettoken();               /* get next token */
        !            28:        char *slappend();               /* append file name to list */
        !            29:        char token[MAXNAMLEN];          /* item buffer */
        !            30: 
        !            31:        while ((buf = gettoken(token, buf)) != NULL)
        !            32:                {
        !            33:                if (slappend(token, list) == NULL)
        !            34:                        return(NO);
        !            35:                }
        !            36:        return(YES);
        !            37: }
        !            38: 
        !            39: 
        !            40: 
        !            41: /*
        !            42:  * buildliblist() reads library pathnames from the LIBLIST macro
        !            43:  * definition, and adds them to the library pathname list. Libraries
        !            44:  * may be specified as `-lx'. Returns integer YES if successful,
        !            45:  * otherwise NO.
        !            46:  */
        !            47: buildliblist()
        !            48: {
        !            49:        extern SLIST *LIBLIST;          /* library pathname list */
        !            50:        extern HASH *MDEFTABLE;         /* macro definition table */
        !            51:        HASHBLK *htb;                   /* hash table block */
        !            52:        HASHBLK *htlookup();            /* find hash table entry */
        !            53:        int libbuftolist();             /* load library pathnames into list */
        !            54:        SLIST *slinit();                /* initialize singly-linked list */
        !            55:        void htrm();                    /* remove hash table entry */
        !            56: 
        !            57:        LIBLIST = NULL;
        !            58:        if ((htb = htlookup(MLIBLIST, MDEFTABLE)) != NULL)
        !            59:                {
        !            60:                LIBLIST = slinit();
        !            61:                if (libbuftolist(htb->h_def, LIBLIST) == NO)
        !            62:                        return(NO);
        !            63:                }
        !            64:        htrm(MLIBLIST, MDEFTABLE);
        !            65:        return(YES);
        !            66: }
        !            67: 
        !            68: 
        !            69: 
        !            70: /*
        !            71:  * buildsrclist() takes source and header file names from command line
        !            72:  * macro definitions or the current directory and appends them to source
        !            73:  * or header file name lists as appropriate. Returns integer YES if
        !            74:  * if successful, otherwise NO.
        !            75:  */
        !            76: buildsrclist()
        !            77: {
        !            78:        extern HASH *MDEFTABLE;         /* macro definition table */
        !            79:        extern SLIST *HEADLIST;         /* header file name list */
        !            80:        extern SLIST *SRCLIST;          /* source file name list */
        !            81:        char *slappend();               /* append file name to list */
        !            82:        HASHBLK *headhtb;               /* HEADERS macro hash table block */
        !            83:        HASHBLK *htlookup();            /* find hash table entry */
        !            84:        HASHBLK *srchtb;                /* SOURCE macro hash table block */
        !            85:        int buftolist();                /* copy items from buffer to list */
        !            86:        int needheaders = 1;            /* need header file names */
        !            87:        int needsource = 1;             /* need source file names */
        !            88:        int read_dir();                 /* read dir for source and headers */
        !            89:        int slsort();                   /* sort singly-linked list */
        !            90:        int strcmp();                   /* string comparison */
        !            91:        SLIST *slinit();                /* initialize singly-linked list */
        !            92: 
        !            93:        HEADLIST = slinit();
        !            94:        SRCLIST = slinit();
        !            95: 
        !            96:        /* build lists from command line macro definitions */
        !            97:        if ((headhtb = htlookup(MHEADERS, MDEFTABLE)) != NULL)
        !            98:                {
        !            99:                if (buftolist(headhtb->h_def, HEADLIST) == NO)
        !           100:                        return(NO);
        !           101:                needheaders--;
        !           102:                }
        !           103:        if ((srchtb = htlookup(MSOURCE, MDEFTABLE)) != NULL)
        !           104:                {
        !           105:                if (buftolist(srchtb->h_def, SRCLIST) == NO)
        !           106:                        return(NO);
        !           107:                needsource--;
        !           108:                }
        !           109:        
        !           110:        /* read the current directory to get source and header file names */
        !           111:        if (needheaders || needsource)
        !           112:                if (read_dir(needheaders, needsource) == NO)
        !           113:                        return(NO);
        !           114: 
        !           115:        if (slsort(strcmp, SRCLIST) == NO)
        !           116:                return(NO);
        !           117:        if (slsort(strcmp, HEADLIST) == NO)
        !           118:                return(NO);
        !           119:        return(YES);
        !           120: }
        !           121: 
        !           122: 
        !           123: 
        !           124: /*
        !           125:  * expandlibpath() converts a library file specified by `-lx' into a full
        !           126:  * pathname. /lib and /usr/lib are searched for the library in the form
        !           127:  * libx.a. An integer YES is returned if the library was found, otherwise NO.
        !           128:  * A library file which doesn't begin with `-' is left unchanged.
        !           129:  */
        !           130: expandlibpath(libpath)
        !           131:        char *libpath;                  /* library pathname buffer */
        !           132: {
        !           133:        char *lib;                      /* /lib library pathname template */
        !           134:        char *strcpy();                 /* string copy */
        !           135:        char *usrlib;                   /* /usr/lib library pathname template */
        !           136:        int i;                          /* library pathname index */
        !           137: 
        !           138:        lib = "/lib/libxxxxxxxxxxxxxxxxxxxxxxxxx";
        !           139:        usrlib = "/usr/lib/libxxxxxxxxxxxxxxxxxxxxxxxxx";
        !           140: 
        !           141:        if (libpath[0] == '-' && libpath[1] == 'l')
        !           142:                {
        !           143:                for (i = 0; libpath[i+2] != '\0' && i < 22; i++)
        !           144:                        {
        !           145:                        lib[i+8] = libpath[i+2];
        !           146:                        usrlib[i+12] = libpath[i+2];
        !           147:                        }
        !           148:                lib[i+8] = usrlib[i+12] = '.';
        !           149:                lib[i+9] = usrlib[i+13] = 'a';
        !           150:                lib[i+10] = usrlib[i+14] = '\0';
        !           151:                if (FILEXIST(lib))
        !           152:                        {
        !           153:                        strcpy(libpath, lib);
        !           154:                        return(YES);
        !           155:                        }
        !           156:                else if (FILEXIST(usrlib))
        !           157:                        {
        !           158:                        strcpy(libpath, usrlib);
        !           159:                        return(YES);
        !           160:                        }
        !           161:                else
        !           162:                        return(NO);
        !           163:                }
        !           164:        return(YES);
        !           165: }
        !           166: 
        !           167: 
        !           168: 
        !           169: /*
        !           170:  * libbuftolist() appends each library pathname specified in libbuf to
        !           171:  * the liblist library pathname list.
        !           172:  */
        !           173: libbuftolist(libbuf, liblist)
        !           174:        char *libbuf;                   /* library pathname buffer */
        !           175:        SLIST *liblist;                 /* library pathname list */
        !           176: {
        !           177:        char *gettoken();               /* get next token */
        !           178:        char libpath[PATHSIZE];         /* library file pathname */
        !           179:        char *slappend();               /* append file name to list */
        !           180:        int expandlibpath();            /* -lx -> full library pathname */
        !           181: 
        !           182:        while ((libbuf = gettoken(libpath, libbuf)) != NULL)
        !           183:                {
        !           184:                if (expandlibpath(libpath) == NO)
        !           185:                        {
        !           186:                        warns("can't find library %s", libpath);
        !           187:                        return(NO);
        !           188:                        }
        !           189:                if (slappend(libpath, liblist) == NULL)
        !           190:                        return(NO);
        !           191:                }
        !           192:        return(YES);
        !           193: }
        !           194: 
        !           195: 
        !           196: 
        !           197: /*
        !           198:  * read_dir() reads filenames from the current directory and adds them
        !           199:  * to the source or header file name lists as appropriate. Returns
        !           200:  * integer YES if successful, otherwise NO.
        !           201:  */
        !           202: read_dir(needheaders, needsource)
        !           203:        int needheaders;                /* need header file names */
        !           204:        int needsource;                 /* need source file names */
        !           205: {
        !           206:        extern int AFLAG;               /* accept src files w/ leading dots? */
        !           207:        extern SLIST *HEADLIST;         /* header file name list */
        !           208:        extern SLIST *SRCLIST;          /* source file name list */
        !           209:        char *rindex();                 /* find last occurrence of character */
        !           210:        char *slappend();               /* append file name to list */
        !           211:        char *suffix;                   /* pointer to file name suffix */
        !           212:        char *p;                        /* beginning of file name component */
        !           213:        DIR *dirp;                      /* directory stream */
        !           214:        DIR *opendir();                 /* open directory stream */
        !           215:        int lookupsfx();                /* get suffix type */
        !           216:        int sfxtyp;                     /* type of suffix */
        !           217:        struct direct *dp;              /* directory entry pointer */
        !           218:        struct direct *readdir();       /* read a directory entry */
        !           219: 
        !           220:        if ((dirp = opendir(CURDIR)) == NULL)
        !           221:                {
        !           222:                warn("can't open current directory");
        !           223:                return(NO);
        !           224:                }
        !           225:        for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
        !           226:                if ((suffix = rindex(dp->d_name, '.')) != NULL)
        !           227:                        {
        !           228:                        if ((p = rindex(dp->d_name, '/')) != NULL)
        !           229:                                p++;
        !           230:                        else
        !           231:                                p = dp->d_name;
        !           232:                        if (*p == '.' && (AFLAG == 0))
        !           233:                                continue;
        !           234:                        suffix++;
        !           235:                        sfxtyp = lookupsfx(suffix);
        !           236:                        if (sfxtyp == SFXSRC)
        !           237:                                {
        !           238:                                if (needsource)
        !           239:                                        if (slappend(dp->d_name, SRCLIST) == NULL)
        !           240:                                                return(NO);
        !           241:                                }
        !           242:                        else if (sfxtyp == SFXHEAD)
        !           243:                                {
        !           244:                                if (needheaders)
        !           245:                                        if (slappend(dp->d_name, HEADLIST) == NULL)
        !           246:                                                return(NO);
        !           247:                                }
        !           248:                        }
        !           249:        closedir(dirp);
        !           250:        return(YES);
        !           251: }

unix.superglobalmegacorp.com

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