|
|
1.1 ! root 1: /* $Header: misc.c,v 1.6 85/06/27 08:15:57 nicklin Exp $ */ ! 2: ! 3: /* ! 4: * Author: Peter J. Nicklin ! 5: */ ! 6: #include <ctype.h> ! 7: #include <stdio.h> ! 8: #include "Mkmf.h" ! 9: #include "hash.h" ! 10: #include "macro.h" ! 11: #include "null.h" ! 12: #include "path.h" ! 13: #include "target.h" ! 14: #include "spms.h" ! 15: #include "suffix.h" ! 16: #include "system.h" ! 17: #include "yesno.h" ! 18: ! 19: /* ! 20: * answer() installs a line from stdin in the macro definition table. ! 21: * exit(1) is called if EOF, error, or out of memory. ! 22: */ ! 23: void ! 24: answer(mdefkey, mdefval) ! 25: char *mdefkey; /* macro definition key */ ! 26: int mdefval; /* macro definition value */ ! 27: { ! 28: extern HASH *MDEFTABLE; /* macro definition table */ ! 29: char answerbuf[ANSWERBUFSIZE]; /* answer from stdin */ ! 30: char *gets(); /* get a line from stdin */ ! 31: HASHBLK *htinstall(); /* install hash table entry */ ! 32: ! 33: if (gets(answerbuf) == NULL) ! 34: exit(1); ! 35: if (*answerbuf != '\0') ! 36: if (htinstall(mdefkey, answerbuf, mdefval, MDEFTABLE) == NULL) ! 37: exit(1); ! 38: } ! 39: ! 40: ! 41: ! 42: /* ! 43: * fastcopy() copies file to stream fp. Returns integer YES if successful, ! 44: * otherwise NO. ! 45: */ ! 46: fastcopy(filename, ofp) ! 47: char *filename; /* file to be copied */ ! 48: register FILE *ofp; /* output stream */ ! 49: { ! 50: register int ifd; /* input file descriptor */ ! 51: register int n; /* byte count */ ! 52: char buf[BUFSIZ]; /* I/O buffer */ ! 53: ! 54: if ((ifd = OPEN(filename, 0, 0644)) == -1) ! 55: { ! 56: pperror(""); ! 57: return(NO); ! 58: } ! 59: while ((n = read(ifd, buf, BUFSIZ)) > 0) ! 60: write(fileno(ofp), buf, n); ! 61: close(ifd); ! 62: return(YES); ! 63: } ! 64: ! 65: ! 66: ! 67: /* ! 68: * findmf() locates the makefile to be edited. The type of makefile ! 69: * is returned in target. The pathname to the makefile is returned ! 70: * in mfpath. Returns YES if makefile or makefile template can be ! 71: * opened, otherwise NO. ! 72: */ ! 73: findmf(mfname, mfpath, target) ! 74: char *mfname; /* name of target makefile */ ! 75: char *mfpath; /* path to target makefile */ ! 76: TARGET *target; /* type of makefile target */ ! 77: { ! 78: extern int CFLAG; /* makefile creation message */ ! 79: char *strcpy(); /* string copy */ ! 80: int readmf(); /* read makefile */ ! 81: int targettype; /* type of makefile requested */ ! 82: void findmftemplate(); /* find makefile template */ ! 83: ! 84: targettype = target->type; ! 85: if (FILEXIST(mfname)) ! 86: { ! 87: if (!FILEWRITE(mfname)) ! 88: { ! 89: pperror(mfname); ! 90: target->type = VERROR; ! 91: return(NO); ! 92: } ! 93: if (readmf(mfname, target) == VERROR) ! 94: return(NO); ! 95: if (targettype == VUNKNOWN || targettype == target->type) ! 96: { ! 97: strcpy(mfpath, mfname); ! 98: return(YES); ! 99: } ! 100: } ! 101: target->type = (targettype == VLIBRARY) ? VLIBRARY : VPROGRAM; ! 102: findmftemplate(mfpath, target); ! 103: if (readmf(mfpath, target) == VERROR) ! 104: return(NO); ! 105: else if (CFLAG == YES) ! 106: warn2("creating %s from template %s", mfname, mfpath); ! 107: return(YES); ! 108: } ! 109: ! 110: ! 111: ! 112: /* ! 113: * findmftemplate() returns the pathname of a makefile template in mfpath. ! 114: */ ! 115: void ! 116: findmftemplate(mfpath, target) ! 117: char *mfpath; /* path to target makefile */ ! 118: TARGET *target; /* type of makefile target */ ! 119: { ! 120: extern char *L_MAKEFILE; /* library makefile template */ ! 121: extern char *P_MAKEFILE; /* program makefile template */ ! 122: char *cwp; /* current project pathname pointer */ ! 123: char *getcwp(); /* get current project pathname */ ! 124: char *pathcat(); /* pathname concatenation */ ! 125: char *strcpy(); /* string copy */ ! 126: ! 127: cwp = getcwp(); ! 128: if (target->type == VPROGRAM) ! 129: { ! 130: if (*P_MAKEFILE == _RDIRC) ! 131: strcpy(mfpath, P_MAKEFILE); ! 132: else if (cwp == NULL || ! 133: !FILEXIST(pathcat(mfpath, pathcat(mfpath, cwp, "lib"), P_MAKEFILE))) ! 134: pathcat(mfpath, SPMSLIB, P_MAKEFILE); ! 135: } ! 136: else if (target->type == VLIBRARY) ! 137: { ! 138: if (*L_MAKEFILE == _RDIRC) ! 139: strcpy(mfpath, L_MAKEFILE); ! 140: else if (cwp == NULL || ! 141: !FILEXIST(pathcat(mfpath, pathcat(mfpath, cwp, "lib"), L_MAKEFILE))) ! 142: pathcat(mfpath, SPMSLIB, L_MAKEFILE); ! 143: } ! 144: else ! 145: warn("unknown template request"); ! 146: } ! 147: ! 148: ! 149: ! 150: /* ! 151: * gettoken() copies the next token from token buffer to token. Returns a ! 152: * pointer to the first character after the token, or null upon reaching ! 153: * the end of the token buffer. ! 154: */ ! 155: char * ! 156: gettoken(token, tp) ! 157: register char *token; /* receiving token */ ! 158: register char *tp; /* token buffer pointer */ ! 159: { ! 160: while (isspace(*tp) && *tp != '\0') ! 161: tp++; ! 162: if (*tp == '\0') ! 163: { ! 164: *token = '\0'; ! 165: return(NULL); ! 166: } ! 167: while (!isspace(*tp) && *tp != '\0') ! 168: *token++ = *tp++; ! 169: *token = '\0'; ! 170: return(tp); ! 171: } ! 172: ! 173: ! 174: ! 175: /* ! 176: * putobj() converts a source file name to an object file name and then ! 177: * writes the file name to stream. ! 178: */ ! 179: void ! 180: putobj(s, stream) ! 181: register char *s; /* source file name */ ! 182: register FILE *stream; /* output stream */ ! 183: { ! 184: extern char OBJSFX[]; /* object file name suffix */ ! 185: register char *dot; /* pointer to suffix */ ! 186: char *rindex(); /* last occurrence of character */ ! 187: ! 188: dot = rindex(s, '.'); ! 189: while (s != dot) ! 190: putc(*s++, stream); ! 191: fprintf(stream, "%s", OBJSFX); ! 192: } ! 193: ! 194: ! 195: ! 196: /* ! 197: * readmf() reads a makefile and loads CFLAGS, FFLAGS, and SUFFIX definitions ! 198: * into the macro definition table if they do not already exist. Returns ! 199: * integer VLIBRARY, VPROGRAM, or VUNKNOWN according to the type of makefile, ! 200: * or VERROR if cannot open makefile. ! 201: */ ! 202: readmf(mfname, target) ! 203: char *mfname; /* name of makefile */ ! 204: TARGET *target; /* type of makefile target */ ! 205: { ! 206: register char *bp; /* buffer pointer */ ! 207: extern char IOBUF[]; /* I/O buffer line */ ! 208: extern HASH *MDEFTABLE; /* macro definition table */ ! 209: char *findmacro(); /* is the line a macro definition? */ ! 210: char *findrule(); /* is the line a rule definition? */ ! 211: char *getlin(); /* get a line from input stream */ ! 212: char *getmacro(); /* get macro def from input stream */ ! 213: char macrodef[MACRODEFSIZE]; /* macro definition buffer */ ! 214: char macroname[MACRONAMSIZE]; /* macro name buffer */ ! 215: char rulename[2*SUFFIXSIZE+3]; /* transformation rule name */ ! 216: FILE *fopen(); /* open file */ ! 217: FILE *fp; /* file pointer */ ! 218: HASHBLK *htinstall(); /* install hash table entry */ ! 219: HASHBLK *htlookup(); /* find hash table entry */ ! 220: int storerule(); /* store transformation rule */ ! 221: ! 222: target->type = target->dest = VUNKNOWN; ! 223: if ((fp = fopen(mfname, "r")) == NULL) ! 224: { ! 225: pperror(mfname); ! 226: target->type = VERROR; ! 227: return(target->type); ! 228: } ! 229: while (getlin(fp) != NULL) ! 230: { ! 231: if (EQUAL(IOBUF, DEPENDMARK)) ! 232: break; ! 233: for (bp = IOBUF; *bp == ' '; bp++) ! 234: continue; ! 235: if (isalnum(*bp) && findmacro(macroname, bp) != NULL) ! 236: { ! 237: if (EQUAL(macroname, MPROGRAM)) ! 238: { ! 239: target->type = VPROGRAM; ! 240: continue; ! 241: } ! 242: else if (EQUAL(macroname, MLIBRARY)) ! 243: { ! 244: target->type = VLIBRARY; ! 245: continue; ! 246: } ! 247: else if (EQUAL(macroname, MDESTDIR)) ! 248: { ! 249: target->dest = VDESTDIR; ! 250: continue; ! 251: } ! 252: ! 253: /* does macro definition already exist? */ ! 254: if (htlookup(macroname, MDEFTABLE) != NULL) ! 255: continue; ! 256: ! 257: if (EQUAL(macroname, MCFLAGS) || ! 258: EQUAL(macroname, MFFLAGS) || ! 259: EQUAL(macroname, MPFLAGS) || ! 260: EQUAL(macroname, MSUFFIX)) ! 261: { ! 262: if (htinstall(macroname, getmacro(macrodef, fp), ! 263: VREADONLY, MDEFTABLE) == NULL) ! 264: { ! 265: fclose(fp); ! 266: return(NO); ! 267: } ! 268: } ! 269: } ! 270: else if (*bp == '.' && findrule(rulename, bp) != NULL) ! 271: { ! 272: if (storerule(rulename) == NO) ! 273: { ! 274: fclose(fp); ! 275: return(NO); ! 276: } ! 277: } ! 278: } ! 279: fclose(fp); ! 280: return(target->type); ! 281: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.