Annotation of 42BSD/bin/make/files.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

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