|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.