Annotation of researchv10no/cmd/make/doname.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)doname.c    8th edition (Bell Labs) 85/07/16";
                      2: #include "defs"
                      3: 
                      4: /*  BASIC PROCEDURE.  RECURSIVE.  */
                      5: 
                      6: /*
                      7: p->done = 0   don't know what to do yet
                      8: p->done = 1   file in process of being updated
                      9: p->done = 2   file already exists in current state
                     10: p->done = 3   file make failed
                     11: */
                     12: 
                     13: doname(p, reclevel, tval, nowait)
                     14: register nameblkp p;
                     15: int reclevel;
                     16: TIMETYPE *tval;
                     17: int nowait;
                     18: {
                     19: int errstat;
                     20: int okdel1;
                     21: int didwork;
                     22: int len;
                     23: TIMETYPE td, td1, tdep, ptime, ptime1, prestime();
                     24: register depblkp q;
                     25: depblkp qtemp, srchdir(), suffp, suffp1;
                     26: nameblkp p1, p2, chkname();
                     27: struct shblock *implcom, *explcom;
                     28: register lineblkp lp;
                     29: lineblkp lp1, lp2;
                     30: char sourcename[100], prefix[100], temp[100], concsuff[20];
                     31: char *wildsub(), *wildmatch(), *stem;
                     32: char *pnamep, *p1namep;
                     33: char *mkqlist();
                     34: chainp allchain, qchain, appendq();
                     35: char qbuf[QBUFMAX], tgsbuf[QBUFMAX];
                     36: wildp wp;
                     37: int nproc1;
                     38: char *lastslash, *s;
                     39: 
                     40: if(p == 0)
                     41:        {
                     42:        *tval = 0;
                     43:        return 0;
                     44:        }
                     45: 
                     46: if(dbgflag)
                     47:        {
                     48:        printf("doname(%s,%d)\n",p->namep,reclevel);
                     49:        fflush(stdout);
                     50:        }
                     51: 
                     52: if(p->done > 0)
                     53:        {
                     54:        *tval = p->modtime;
                     55:        return (p->done == 3);
                     56:        }
                     57: 
                     58: errstat = 0;
                     59: tdep = 0;
                     60: implcom = 0;
                     61: explcom = 0;
                     62: ptime = exists(p->namep);
                     63: ptime1 = 0;
                     64: didwork = NO;
                     65: p->done = 1;   /* avoid infinite loops */
                     66: nproc1 = nproc;        /* current depth of process stack */
                     67: 
                     68: qchain = NULL;
                     69: allchain = NULL;
                     70: 
                     71: /* define values of Bradford's $$@ and $$/ macros */
                     72: for(s = lastslash = p->namep; *s; ++s)
                     73:        if(*s == '/')
                     74:                lastslash = s;
                     75: setvar("$@", p->namep, YES);
                     76: setvar("$/", lastslash, YES);
                     77: 
                     78: 
                     79: /* expand any names that have embedded metacharacters */
                     80: 
                     81: for(lp = p->linep ; lp ; lp = lp->nxtlineblock)
                     82:        for(q = lp->depp ; q ; q=qtemp )
                     83:                {
                     84:                qtemp = q->nxtdepblock;
                     85:                expand(q);
                     86:                }
                     87: 
                     88: /* make sure all dependents are up to date */
                     89: 
                     90: for(lp = p->linep ; lp ; lp = lp->nxtlineblock)
                     91:        {
                     92:        td = 0;
                     93:        for(q = lp->depp ; q ; q = q->nxtdepblock)
                     94:                if(q->depname)
                     95:                        {
                     96:                        errstat += doname(q->depname, reclevel+1, &td1, q->nowait);
                     97:                        if(dbgflag)
                     98:                                printf("TIME(%s)=%ld\n",q->depname->namep, td1);
                     99:                        if(td1 > td)
                    100:                                td = td1;
                    101:                        if(ptime < td1)
                    102:                                qchain = appendq(qchain, q->depname->namep);
                    103:                        allchain = appendq(allchain, q->depname->namep);
                    104:                        }
                    105:        if(p->septype == SOMEDEPS)
                    106:                {
                    107:                if(lp->shp)
                    108:                     if( ptime<td || (ptime==0 && td==0) || lp->depp==0)
                    109:                        {
                    110:                        okdel1 = okdel;
                    111:                        okdel = NO;
                    112:                        set3var("@", p->namep);
                    113:                        setvar("?", mkqlist(qchain,qbuf), YES);
                    114:                        setvar("^", mkqlist(allchain,tgsbuf), YES);
                    115:                        qchain = NULL;
                    116:                        if( !questflag )
                    117:                                errstat += docom(lp->shp, nowait, nproc1);
                    118:                        set3var("@", CHNULL);
                    119:                        okdel = okdel1;
                    120:                        ptime1 = prestime();
                    121:                        didwork = YES;
                    122:                        }
                    123:                }
                    124: 
                    125:        else    {
                    126:                if(lp->shp != 0)
                    127:                        {
                    128:                        if(explcom)
                    129:                                fprintf(stderr, "Too many command lines for `%s'\n",
                    130:                                        p->namep);
                    131:                        else    explcom = lp->shp;
                    132:                        }
                    133: 
                    134:                if(td > tdep) tdep = td;
                    135:                }
                    136:        }
                    137: 
                    138: 
                    139: 
                    140: /* Look for implicit dependents, using suffix rules */
                    141: 
                    142: for(lp = sufflist ; lp ; lp = lp->nxtlineblock)
                    143:     for(suffp = lp->depp ; suffp ; suffp = suffp->nxtdepblock)
                    144:        {
                    145:        pnamep = suffp->depname->namep;
                    146:        if(suffix(p->namep , pnamep , prefix))
                    147:                {
                    148:                (void)srchdir(concat(prefix,"*",temp), NO, (depblkp) NULL);
                    149:                for(lp1 = sufflist ; lp1 ; lp1 = lp1->nxtlineblock)
                    150:                    for(suffp1=lp1->depp; suffp1 ; suffp1 = suffp1->nxtdepblock)
                    151:                        {
                    152:                        p1namep = suffp1->depname->namep;
                    153:                        if( (p1=srchname(concat(p1namep, pnamep ,concsuff))) &&
                    154:                            (p2=srchname(concat(prefix, p1namep ,sourcename))) )
                    155:                                {
                    156:                                errstat += doname(p2, reclevel+1, &td, NO);
                    157:                                if(ptime < td)
                    158:                                        qchain = appendq(qchain, p2->namep);
                    159: if(dbgflag) printf("TIME(%s)=%ld\n", p2->namep, td);
                    160:                                if(td > tdep) tdep = td;
                    161:                                set3var("*", prefix);
                    162:                                set3var("<", copys(sourcename));
                    163:                                for(lp2=p1->linep ; lp2 ; lp2 = lp2->nxtlineblock)
                    164:                                        if(implcom = lp2->shp) break;
                    165:                                goto endloop;
                    166:                                }
                    167:                        }
                    168:                }
                    169:        }
                    170: 
                    171: /* Look for implicit dependents, using pattern matching rules */
                    172: 
                    173: len = strlen(p->namep);
                    174: for(wp = firstwild ; wp ; wp = wp->next)
                    175:        if(stem = wildmatch(wp, p->namep, len) )
                    176:                {
                    177:                lp = wp->linep;
                    178:                for(q = lp->depp; q; q = q->nxtdepblock)
                    179:                        {
                    180:                        if(dbgflag>1 && q->depname)
                    181:                                fprintf(stderr,"check dep of %s on %s\n", p->namep,
                    182:                                        wildsub(q->depname->namep,stem));
                    183:                        if(q->depname &&
                    184:                                ! chkname(wildsub(q->depname->namep,stem)))
                    185:                                        break;
                    186:                        }
                    187: 
                    188:                if(q)   /* some name not found, go to next line */
                    189:                        continue;
                    190: 
                    191:                for(q = lp->depp; q; q = q->nxtdepblock)
                    192:                        {
                    193:                        nameblkp tamep;
                    194:                        if(q->depname == NULL)
                    195:                                continue;
                    196:                        tamep = srchname( wildsub(q->depname->namep,stem));
                    197: /*TEMP fprintf(stderr,"check dep %s on %s =>%s\n",p->namep,q->depname->namep,tamep->namep);*/
                    198: /*TEMP*/if(dbgflag) printf("%s depends on %s. stem=%s\n", p->namep,tamep->namep, stem);
                    199:                        errstat += doname(tamep, reclevel+1, &td, q->nowait);
                    200:                        if(ptime < td)
                    201:                                qchain = appendq(qchain, tamep->namep);
                    202:                        allchain = appendq(allchain, tamep->namep);
                    203:                        if(dbgflag) printf("TIME(%s)=%ld\n", tamep->namep, td);
                    204:                        if(td > tdep)
                    205:                                tdep = td;
                    206:                        set3var("<", copys(tamep->namep) );
                    207:                        }
                    208:                set3var("*", stem);
                    209:                setvar("%", stem, YES);
                    210:                implcom = lp->shp;
                    211:                goto endloop;
                    212:                }
                    213: 
                    214: endloop:
                    215: 
                    216: 
                    217: if(errstat==0 && (ptime<tdep || (ptime==0 && tdep==0) ) )
                    218:        {
                    219:        ptime = (tdep>0 ? tdep : prestime() );
                    220:        set3var("@", p->namep);
                    221:        setvar("?", mkqlist(qchain,qbuf), YES);
                    222:        setvar("^", mkqlist(allchain,tgsbuf), YES);
                    223:        if(explcom)
                    224:                errstat += docom(explcom, nowait, nproc1);
                    225:        else if(implcom)
                    226:                errstat += docom(implcom, nowait, nproc1);
                    227:        else if(p->septype == 0)
                    228:                if(p1=srchname(".DEFAULT"))
                    229:                        {
                    230:                        set3var("<", p->namep);
                    231:                        for(lp2 = p1->linep ; lp2 ; lp2 = lp2->nxtlineblock)
                    232:                                if(implcom = lp2->shp)
                    233:                                        {
                    234:                                        errstat += docom(implcom, nowait,nproc1);
                    235:                                        break;
                    236:                                        }
                    237:                        }
                    238:                else if(keepgoing)
                    239:                        {
                    240:                        printf("Don't know how to make %s\n", p->namep);
                    241:                        ++errstat;
                    242:                        }
                    243:                else
                    244:                        fatal1(" Don't know how to make %s", p->namep);
                    245: 
                    246:        set3var("@", CHNULL);
                    247:        if(noexflag || nowait || (ptime = exists(p->namep)) == 0 )
                    248:                ptime = prestime();
                    249:        }
                    250: 
                    251: else if(errstat!=0 && reclevel==0)
                    252:        printf("`%s' not remade because of errors\n", p->namep);
                    253: 
                    254: else if(!questflag && reclevel==0  &&  didwork==NO)
                    255:        printf("`%s' is up to date.\n", p->namep);
                    256: 
                    257: if(questflag && reclevel==0)
                    258:        exit(ndocoms>0 ? -1 : 0);
                    259: 
                    260: p->done = (errstat ? 3 : 2);
                    261: if(ptime1 > ptime)
                    262:        ptime = ptime1;
                    263: p->modtime = ptime;
                    264: *tval = ptime;
                    265: return errstat;
                    266: }
                    267: 
                    268: docom(q, nowait, nproc1)
                    269: struct shblock *q;
                    270: int nowait;
                    271: int nproc1;
                    272: {
                    273: char *s;
                    274: struct varblock *varptr();
                    275: int ign, nopr, doit;
                    276: char string[OUTMAX];
                    277: 
                    278: ++ndocoms;
                    279: if(questflag)
                    280:        return NO;
                    281: 
                    282: if(touchflag)
                    283:        {
                    284:        s = varptr("@")->varval;
                    285:        if(!silflag)
                    286:                printf("touch(%s)\n", s);
                    287:        if(!noexflag)
                    288:                touch(YES, s);
                    289:        return NO;
                    290:        }
                    291: 
                    292: if(nproc1 < nproc)
                    293:        waitstack(nproc1);
                    294: 
                    295: for( ; q ; q = q->nxtshblock )
                    296:        {
                    297:        subst(q->shbp,string);
                    298:        ign = ignerr;
                    299:        nopr = NO;
                    300:        doit = NO;
                    301:        for(s = string ; ; ++s)
                    302:                {
                    303:                switch(*s)
                    304:                        {
                    305:                        case '-':
                    306:                                ign = YES;
                    307:                                continue;
                    308:                        case '@':
                    309:                                nopr = YES;
                    310:                                continue;
                    311:                        case '+':
                    312:                                doit = YES;
                    313:                                continue;
                    314:                        default:
                    315:                                break;
                    316:                        }
                    317:                break;
                    318:                }
                    319: 
                    320:        if( docom1(s, ign, nopr, doit||!noexflag, nowait&&!q->nxtshblock) && !ign)
                    321:                return YES;
                    322:        }
                    323: return NO;
                    324: }
                    325: 
                    326: 
                    327: 
                    328: docom1(comstring, nohalt, noprint, doit, nowait)
                    329: register char *comstring;
                    330: int nohalt, noprint, doit, nowait;
                    331: {
                    332: register int status;
                    333: char *prefix;
                    334: 
                    335: if(comstring[0] == '\0')
                    336:        return 0;
                    337: 
                    338: if(!silflag && (!noprint || !doit) )
                    339:        prefix = doit ? prompt : "" ;
                    340: else
                    341:        prefix = CHNULL;
                    342: 
                    343: if(dynmacro(comstring) || !doit)
                    344:        {
                    345:        if(prefix)
                    346:                {
                    347:                fputs(prefix, stdout);
                    348:                puts(comstring);        /* with a newline */
                    349:                fflush(stdout);
                    350:                }
                    351:        return 0;
                    352:        }
                    353: 
                    354: status = dosys(comstring, nohalt, nowait, prefix);
                    355: baddirs();     /* directories may have changed */
                    356: return status;
                    357: }
                    358: 
                    359: 
                    360: /*
                    361:    If there are any Shell meta characters in the name,
                    362:    expand into a list, after searching directory
                    363: */
                    364: 
                    365: expand(q)
                    366: register depblkp q;
                    367: {
                    368: register char *s;
                    369: char *s1;
                    370: depblkp p, srchdir();
                    371: 
                    372: s1 = q->depname->namep;
                    373: for(s=s1 ; ;) switch(*s++)
                    374:        {
                    375:        case '\0':
                    376:                return;
                    377: 
                    378:        case '*':
                    379:        case '?':
                    380:        case '[':
                    381:                if( p = srchdir(s1 , YES, q->nxtdepblock) )
                    382:                        {
                    383:                        q->nxtdepblock = p;
                    384:                        q->depname = 0;
                    385:                        }
                    386:                return;
                    387:        }
                    388: }

unix.superglobalmegacorp.com

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