|
|
1.1 ! root 1: static char *sccsid = "@(#)files.c 4.8 (Berkeley) 83/06/30"; ! 2: /* UNIX DEPENDENT PROCEDURES */ ! 3: ! 4: ! 5: /* DEFAULT RULES FOR UNIX */ ! 6: ! 7: char *builtin[] = ! 8: { ! 9: #ifdef pwb ! 10: ".SUFFIXES : .L .out .o .c .f .e .r .y .yr .ye .l .s .z .x .t .h .cl", ! 11: #else ! 12: ".SUFFIXES : .out .o .c .F .f .e .r .y .yr .ye .l .s .cl .p", ! 13: #endif ! 14: "YACC=yacc", ! 15: "YACCR=yacc -r", ! 16: "YACCE=yacc -e", ! 17: "YFLAGS=", ! 18: "LEX=lex", ! 19: "LFLAGS=", ! 20: "CC=cc", ! 21: #if defined(vax) || defined(sun) ! 22: "AS=as", ! 23: #else ! 24: "AS=as -", ! 25: #endif ! 26: "PC=pc", ! 27: "PFLAGS=", ! 28: "CFLAGS=", ! 29: "RC=f77", ! 30: "RFLAGS=", ! 31: "FC=f77", ! 32: "EFLAGS=", ! 33: "FFLAGS=", ! 34: "LOADLIBES=", ! 35: #ifdef pwb ! 36: "SCOMP=scomp", ! 37: "SCFLAGS=", ! 38: "CMDICT=cmdict", ! 39: "CMFLAGS=", ! 40: #endif ! 41: ! 42: ".c.o :", ! 43: "\t$(CC) $(CFLAGS) -c $<", ! 44: ! 45: ".p.o :", ! 46: "\t$(PC) $(PFLAGS) -c $<", ! 47: ! 48: ".cl.o :", ! 49: "\tclass -c $<", ! 50: ! 51: ".e.o .r.o .F.o .f.o :", ! 52: "\t$(FC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<", ! 53: ! 54: ".s.o :", ! 55: "\t$(AS) -o $@ $<", ! 56: ! 57: ".y.o :", ! 58: "\t$(YACC) $(YFLAGS) $<", ! 59: "\t$(CC) $(CFLAGS) -c y.tab.c", ! 60: "\trm y.tab.c", ! 61: "\tmv y.tab.o $@", ! 62: ! 63: ".yr.o:", ! 64: "\t$(YACCR) $(YFLAGS) $<", ! 65: "\t$(RC) $(RFLAGS) -c y.tab.r", ! 66: "\trm y.tab.r", ! 67: "\tmv y.tab.o $@", ! 68: ! 69: ".ye.o :", ! 70: "\t$(YACCE) $(YFLAGS) $<", ! 71: "\t$(EC) $(RFLAGS) -c y.tab.e", ! 72: "\trm y.tab.e", ! 73: "\tmv y.tab.o $@", ! 74: ! 75: ".l.o :", ! 76: "\t$(LEX) $(LFLAGS) $<", ! 77: "\t$(CC) $(CFLAGS) -c lex.yy.c", ! 78: "\trm lex.yy.c", ! 79: "\tmv lex.yy.o $@", ! 80: ! 81: ".y.c :", ! 82: "\t$(YACC) $(YFLAGS) $<", ! 83: "\tmv y.tab.c $@", ! 84: ! 85: ".l.c :", ! 86: "\t$(LEX) $(LFLAGS) $<", ! 87: "\tmv lex.yy.c $@", ! 88: ! 89: ".yr.r:", ! 90: "\t$(YACCR) $(YFLAGS) $<", ! 91: "\tmv y.tab.r $@", ! 92: ! 93: ".ye.e :", ! 94: "\t$(YACCE) $(YFLAGS) $<", ! 95: "\tmv y.tab.e $@", ! 96: ! 97: #ifdef pwb ! 98: ".o.L .c.L .t.L:", ! 99: "\t$(SCOMP) $(SCFLAGS) $<", ! 100: ! 101: ".t.o:", ! 102: "\t$(SCOMP) $(SCFLAGS) -c $<", ! 103: ! 104: ".t.c:", ! 105: "\t$(SCOMP) $(SCFLAGS) -t $<", ! 106: ! 107: ".h.z .t.z:", ! 108: "\t$(CMDICT) $(CMFLAGS) $<", ! 109: ! 110: ".h.x .t.x:", ! 111: "\t$(CMDICT) $(CMFLAGS) -c $<", ! 112: #endif ! 113: ! 114: ".s.out .c.out .o.out :", ! 115: "\t$(CC) $(CFLAGS) $< $(LOADLIBES) -o $@", ! 116: ! 117: ".f.out .F.out .r.out .e.out :", ! 118: "\t$(FC) $(EFLAGS) $(RFLAGS) $(FFLAGS) $< $(LOADLIBES) -o $@", ! 119: "\t-rm $*.o", ! 120: ! 121: ".y.out :", ! 122: "\t$(YACC) $(YFLAGS) $<", ! 123: "\t$(CC) $(CFLAGS) y.tab.c $(LOADLIBES) -ly -o $@", ! 124: "\trm y.tab.c", ! 125: ! 126: ".l.out :", ! 127: "\t$(LEX) $(LFLAGS) $<", ! 128: "\t$(CC) $(CFLAGS) lex.yy.c $(LOADLIBES) -ll -o $@", ! 129: "\trm lex.yy.c", ! 130: ! 131: 0 }; ! 132: ! 133: #include "defs" ! 134: ! 135: ! 136: TIMETYPE exists(filename) ! 137: char *filename; ! 138: { ! 139: #include <sys/stat.h> ! 140: struct stat buf; ! 141: register char *s; ! 142: TIMETYPE lookarch(); ! 143: ! 144: for(s = filename ; *s!='\0' && *s!='(' ; ++s) ! 145: ; ! 146: ! 147: if(*s == '(') ! 148: return(lookarch(filename)); ! 149: ! 150: if (stat(filename, &buf) < 0) ! 151: return(0); ! 152: else return(buf.st_mtime); ! 153: } ! 154: ! 155: ! 156: TIMETYPE prestime() ! 157: { ! 158: TIMETYPE t; ! 159: time(&t); ! 160: return(t); ! 161: } ! 162: ! 163: ! 164: ! 165: FSTATIC char nbuf[MAXNAMLEN + 1]; ! 166: FSTATIC char *nbufend = &nbuf[MAXNAMLEN]; ! 167: ! 168: ! 169: ! 170: struct depblock *srchdir(pat, mkchain, nextdbl) ! 171: register char *pat; /* pattern to be matched in directory */ ! 172: int mkchain; /* nonzero if results to be remembered */ ! 173: struct depblock *nextdbl; /* final value for chain */ ! 174: { ! 175: DIR *dirf; ! 176: register int i; ! 177: int nread, cldir; ! 178: char *dirname, *dirpref, *endir, *filepat, *p, temp[100]; ! 179: char fullname[100], *p1, *p2; ! 180: struct nameblock *q; ! 181: struct depblock *thisdbl; ! 182: struct dirhdr *od; ! 183: struct pattern *patp; ! 184: ! 185: struct direct *dptr; ! 186: ! 187: ! 188: thisdbl = 0; ! 189: ! 190: if(mkchain == NO) ! 191: for(patp=firstpat ; patp ; patp = patp->nxtpattern) ! 192: if(! unequal(pat, patp->patval)) return(0); ! 193: ! 194: patp = ALLOC(pattern); ! 195: patp->nxtpattern = firstpat; ! 196: firstpat = patp; ! 197: patp->patval = copys(pat); ! 198: ! 199: endir = 0; ! 200: ! 201: for(p=pat; *p!='\0'; ++p) ! 202: if(*p=='/') endir = p; ! 203: ! 204: if(endir==0) ! 205: { ! 206: dirname = "."; ! 207: dirpref = ""; ! 208: filepat = pat; ! 209: } ! 210: else { ! 211: dirname = pat; ! 212: *endir = '\0'; ! 213: dirpref = concat(dirname, "/", temp); ! 214: filepat = endir+1; ! 215: } ! 216: ! 217: dirf = NULL; ! 218: cldir = NO; ! 219: ! 220: for(od = firstod; od; od = od->nxtopendir) ! 221: if(! unequal(dirname, od->dirn) ) ! 222: { ! 223: dirf = od->dirfc; ! 224: if (dirf != NULL) ! 225: rewinddir(dirf); /* start over at the beginning */ ! 226: break; ! 227: } ! 228: ! 229: if(dirf == NULL) ! 230: { ! 231: dirf = opendir(dirname); ! 232: if(nopdir >= MAXDIR) ! 233: cldir = YES; ! 234: else { ! 235: ++nopdir; ! 236: od = ALLOC(dirhdr); ! 237: od->nxtopendir = firstod; ! 238: firstod = od; ! 239: od->dirfc = dirf; ! 240: od->dirn = copys(dirname); ! 241: } ! 242: } ! 243: ! 244: if(dirf == NULL) ! 245: { ! 246: fprintf(stderr, "Directory %s: ", dirname); ! 247: fatal("Cannot open"); ! 248: } ! 249: ! 250: else for (dptr = readdir(dirf); dptr != NULL; dptr = readdir(dirf)) ! 251: { ! 252: p1 = dptr->d_name; ! 253: p2 = nbuf; ! 254: while( (p2<nbufend) && (*p2++ = *p1++)!='\0' ) ! 255: /* void */; ! 256: if( amatch(nbuf,filepat) ) ! 257: { ! 258: concat(dirpref,nbuf,fullname); ! 259: if( (q=srchname(fullname)) ==0) ! 260: q = makename(copys(fullname)); ! 261: if(mkchain) ! 262: { ! 263: thisdbl = ALLOC(depblock); ! 264: thisdbl->nxtdepblock = nextdbl; ! 265: thisdbl->depname = q; ! 266: nextdbl = thisdbl; ! 267: } ! 268: } ! 269: } ! 270: ! 271: if(endir != 0) *endir = '/'; ! 272: ! 273: if(cldir) { ! 274: closedir(dirf); ! 275: dirf = NULL; ! 276: } ! 277: return(thisdbl); ! 278: } ! 279: ! 280: /* stolen from glob through find */ ! 281: ! 282: static amatch(s, p) ! 283: char *s, *p; ! 284: { ! 285: register int cc, scc, k; ! 286: int c, lc; ! 287: ! 288: scc = *s; ! 289: lc = 077777; ! 290: switch (c = *p) { ! 291: ! 292: case '[': ! 293: k = 0; ! 294: while (cc = *++p) { ! 295: switch (cc) { ! 296: ! 297: case ']': ! 298: if (k) ! 299: return(amatch(++s, ++p)); ! 300: else ! 301: return(0); ! 302: ! 303: case '-': ! 304: k |= (lc <= scc) & (scc <= (cc=p[1]) ) ; ! 305: } ! 306: if (scc==(lc=cc)) k++; ! 307: } ! 308: return(0); ! 309: ! 310: case '?': ! 311: caseq: ! 312: if(scc) return(amatch(++s, ++p)); ! 313: return(0); ! 314: case '*': ! 315: return(umatch(s, ++p)); ! 316: case 0: ! 317: return(!scc); ! 318: } ! 319: if (c==scc) goto caseq; ! 320: return(0); ! 321: } ! 322: ! 323: static umatch(s, p) ! 324: char *s, *p; ! 325: { ! 326: if(*p==0) return(1); ! 327: while(*s) ! 328: if (amatch(s++,p)) return(1); ! 329: return(0); ! 330: } ! 331: ! 332: #ifdef METERFILE ! 333: #include <pwd.h> ! 334: int meteron = 0; /* default: metering off */ ! 335: ! 336: meter(file) ! 337: char *file; ! 338: { ! 339: TIMETYPE tvec; ! 340: char *p, *ctime(); ! 341: FILE * mout; ! 342: struct passwd *pwd, *getpwuid(); ! 343: ! 344: if(file==0 || meteron==0) return; ! 345: ! 346: pwd = getpwuid(getuid()); ! 347: ! 348: time(&tvec); ! 349: ! 350: if( (mout=fopen(file,"a")) != NULL ) ! 351: { ! 352: p = ctime(&tvec); ! 353: p[16] = '\0'; ! 354: fprintf(mout,"User %s, %s\n",pwd->pw_name,p+4); ! 355: fclose(mout); ! 356: } ! 357: } ! 358: #endif ! 359: ! 360: ! 361: /* look inside archives for notations a(b) and a((b)) ! 362: a(b) is file member b in archive a ! 363: a((b)) is entry point _b in object archive a ! 364: */ ! 365: ! 366: #ifdef ASCARCH ! 367: # include <ar.h> ! 368: #else ! 369: # include <ar.h> ! 370: #endif ! 371: #include <a.out.h> ! 372: ! 373: static long arflen; ! 374: static long arfdate; ! 375: static char arfname[16]; ! 376: FILE *arfd; ! 377: long int arpos, arlen; ! 378: ! 379: static struct exec objhead; ! 380: ! 381: static struct nlist objentry; ! 382: ! 383: ! 384: TIMETYPE lookarch(filename) ! 385: char *filename; ! 386: { ! 387: char *p, *q, *send, s[MAXNAMLEN + 1]; ! 388: int i, nc, nsym, objarch; ! 389: ! 390: for(p = filename; *p!= '(' ; ++p) ! 391: ; ! 392: *p = '\0'; ! 393: openarch(filename); ! 394: *p++ = '('; ! 395: ! 396: if(*p == '(') ! 397: { ! 398: objarch = YES; ! 399: nc = 8; ! 400: ++p; ! 401: } ! 402: else ! 403: { ! 404: objarch = NO; ! 405: nc = MAXNAMLEN; ! 406: } ! 407: send = s + nc; ! 408: ! 409: for( q = s ; q<send && *p!='\0' && *p!=')' ; *q++ = *p++ ) ! 410: ; ! 411: while(q < send) ! 412: *q++ = '\0'; ! 413: while(getarch()) ! 414: { ! 415: if(objarch) ! 416: { ! 417: getobj(); ! 418: nsym = objhead.a_syms / sizeof(objentry); ! 419: for(i = 0; i<nsym ; ++i) ! 420: { ! 421: fread( (char *) &objentry, sizeof(objentry),1,arfd); ! 422: if( (objentry.n_type & N_EXT) ! 423: && ((objentry.n_type & ~N_EXT) || objentry.n_value) ! 424: && eqstr(objentry.n_un.n_name,s,nc)) ! 425: { ! 426: clarch(); ! 427: return(arfdate); ! 428: } ! 429: } ! 430: } ! 431: ! 432: else if( eqstr(arfname, s, nc)) ! 433: { ! 434: clarch(); ! 435: return(arfdate); ! 436: } ! 437: } ! 438: ! 439: clarch(); ! 440: return( 0L); ! 441: } ! 442: ! 443: ! 444: clarch() ! 445: { ! 446: fclose( arfd ); ! 447: } ! 448: ! 449: ! 450: openarch(f) ! 451: register char *f; ! 452: { ! 453: #ifdef ASCARCH ! 454: char magic[SARMAG]; ! 455: #endif ! 456: int word; ! 457: #include <sys/stat.h> ! 458: struct stat buf; ! 459: ! 460: stat(f, &buf); ! 461: arlen = buf.st_size; ! 462: ! 463: arfd = fopen(f, "r"); ! 464: if(arfd == NULL) ! 465: fatal1("cannot open %s", f); ! 466: ! 467: fread( (char *) &word, sizeof(word), 1, arfd); ! 468: #ifdef ASCARCH ! 469: fseek(arfd, 0L, 0); ! 470: fread(magic, SARMAG, 1, arfd); ! 471: arpos = SARMAG; ! 472: if( ! eqstr(magic, ARMAG, SARMAG) ) ! 473: #else ! 474: arpos = sizeof(word); ! 475: if(word != ARMAG) ! 476: #endif ! 477: fatal1("%s is not an archive", f); ! 478: ! 479: arflen = 0; ! 480: } ! 481: ! 482: ! 483: ! 484: getarch() ! 485: { ! 486: struct ar_hdr arhead; ! 487: long atol(); ! 488: ! 489: arpos += (arflen + 1) & ~1L; /* round archived file length up to even */ ! 490: if(arpos >= arlen) ! 491: return(0); ! 492: fseek(arfd, arpos, 0); ! 493: ! 494: fread( (char *) &arhead, sizeof(arhead), 1, arfd); ! 495: arpos += sizeof(arhead); ! 496: #ifdef ASCARCH ! 497: arflen = atol(arhead.ar_size); ! 498: arfdate = atol(arhead.ar_date); ! 499: #else ! 500: arflen = arhead.ar_size; ! 501: arfdate = arhead.ar_date; ! 502: #endif ! 503: strncpy(arfname, arhead.ar_name, sizeof(arhead.ar_name)); ! 504: return(1); ! 505: } ! 506: ! 507: ! 508: getobj() ! 509: { ! 510: long int skip; ! 511: ! 512: fread( (char *) &objhead, sizeof(objhead), 1, arfd); ! 513: if (N_BADMAG(objhead)) ! 514: fatal1("%s is not an object module", arfname); ! 515: skip = objhead.a_text + objhead.a_data; ! 516: #if defined(vax) || defined(sun) ! 517: skip += objhead.a_trsize + objhead.a_drsize; ! 518: #else ! 519: if(! objhead.a_flag ) ! 520: skip *= 2; ! 521: #endif ! 522: fseek(arfd, skip, 1); ! 523: } ! 524: ! 525: ! 526: eqstr(a,b,n) ! 527: register char *a, *b; ! 528: int n; ! 529: { ! 530: register int i; ! 531: for(i = 0 ; i < n ; ++i) ! 532: if(*a++ != *b++) ! 533: return(NO); ! 534: return(YES); ! 535: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.