Annotation of 42BSD/bin/make/doname.c, revision 1.1

1.1     ! root        1: static char *sccsid = "@(#)doname.c    4.2 (Berkeley) 83/02/03";
        !             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)
        !            14: register struct nameblock *p;
        !            15: int reclevel;
        !            16: TIMETYPE *tval;
        !            17: {
        !            18: int errstat;
        !            19: int okdel1;
        !            20: int didwork;
        !            21: TIMETYPE td, td1, tdep, ptime, ptime1, prestime();
        !            22: register struct depblock *q;
        !            23: struct depblock *qtemp, *srchdir(), *suffp, *suffp1;
        !            24: struct nameblock *p1, *p2;
        !            25: struct shblock *implcom, *explcom;
        !            26: register struct lineblock *lp;
        !            27: struct lineblock *lp1, *lp2;
        !            28: char sourcename[100], prefix[100], temp[100], concsuff[20];
        !            29: char *pnamep, *p1namep;
        !            30: char *mkqlist();
        !            31: struct chain *qchain, *appendq();
        !            32: 
        !            33: if(p == 0)
        !            34:        {
        !            35:        *tval = 0;
        !            36:        return(0);
        !            37:        }
        !            38: 
        !            39: if(dbgflag)
        !            40:        {
        !            41:        printf("doname(%s,%d)\n",p->namep,reclevel);
        !            42:        fflush(stdout);
        !            43:        }
        !            44: 
        !            45: if(p->done > 0)
        !            46:        {
        !            47:        *tval = p->modtime;
        !            48:        return(p->done == 3);
        !            49:        }
        !            50: 
        !            51: errstat = 0;
        !            52: tdep = 0;
        !            53: implcom = 0;
        !            54: explcom = 0;
        !            55: ptime = exists(p->namep);
        !            56: ptime1 = 0;
        !            57: didwork = NO;
        !            58: p->done = 1;   /* avoid infinite loops */
        !            59: 
        !            60: qchain = NULL;
        !            61: 
        !            62: /* Expand any names that have embedded metacharaters */
        !            63: 
        !            64: for(lp = p->linep ; lp ; lp = lp->nxtlineblock)
        !            65:        for(q = lp->depp ; q ; q=qtemp )
        !            66:                {
        !            67:                qtemp = q->nxtdepblock;
        !            68:                expand(q);
        !            69:                }
        !            70: 
        !            71: /* make sure all dependents are up to date */
        !            72: 
        !            73: for(lp = p->linep ; lp ; lp = lp->nxtlineblock)
        !            74:        {
        !            75:        td = 0;
        !            76:        for(q = lp->depp ; q ; q = q->nxtdepblock)
        !            77:                {
        !            78:                errstat += doname(q->depname, reclevel+1, &td1);
        !            79:                if(dbgflag)
        !            80:                    printf("TIME(%s)=%ld\n", q->depname->namep, td1);
        !            81:                if(td1 > td) td = td1;
        !            82:                if(ptime < td1)
        !            83:                        qchain = appendq(qchain, q->depname->namep);
        !            84:                }
        !            85:        if(p->septype == SOMEDEPS)
        !            86:                {
        !            87:                if(lp->shp!=0)
        !            88:                     if( ptime<td || (ptime==0 && td==0) || lp->depp==0)
        !            89:                        {
        !            90:                        okdel1 = okdel;
        !            91:                        okdel = NO;
        !            92:                        setvar("@", p->namep);
        !            93:                        setvar("?", mkqlist(qchain) );
        !            94:                        qchain = NULL;
        !            95:                        if( !questflag )
        !            96:                                errstat += docom(lp->shp);
        !            97:                        setvar("@", (char *) NULL);
        !            98:                        okdel = okdel1;
        !            99:                        ptime1 = prestime();
        !           100:                        didwork = YES;
        !           101:                        }
        !           102:                }
        !           103: 
        !           104:        else    {
        !           105:                if(lp->shp != 0)
        !           106:                        {
        !           107:                        if(explcom)
        !           108:                                fprintf(stderr, "Too many command lines for `%s'\n",
        !           109:                                        p->namep);
        !           110:                        else    explcom = lp->shp;
        !           111:                        }
        !           112: 
        !           113:                if(td > tdep) tdep = td;
        !           114:                }
        !           115:        }
        !           116: 
        !           117: /* Look for implicit dependents, using suffix rules */
        !           118: 
        !           119: for(lp = sufflist ; lp ; lp = lp->nxtlineblock)
        !           120:     for(suffp = lp->depp ; suffp ; suffp = suffp->nxtdepblock)
        !           121:        {
        !           122:        pnamep = suffp->depname->namep;
        !           123:        if(suffix(p->namep , pnamep , prefix))
        !           124:                {
        !           125:                srchdir( concat(prefix,"*",temp) , NO, (struct depblock *) NULL);
        !           126:                for(lp1 = sufflist ; lp1 ; lp1 = lp1->nxtlineblock)
        !           127:                    for(suffp1=lp1->depp ; suffp1 ; suffp1 = suffp1->nxtdepblock)
        !           128:                        {
        !           129:                        p1namep = suffp1->depname->namep;
        !           130:                        if( (p1=srchname(concat(p1namep, pnamep ,concsuff))) &&
        !           131:                            (p2=srchname(concat(prefix, p1namep ,sourcename))) )
        !           132:                                {
        !           133:                                errstat += doname(p2, reclevel+1, &td);
        !           134:                                if(ptime < td)
        !           135:                                        qchain = appendq(qchain, p2->namep);
        !           136: if(dbgflag) printf("TIME(%s)=%ld\n", p2->namep, td);
        !           137:                                if(td > tdep) tdep = td;
        !           138:                                setvar("*", prefix);
        !           139:                                setvar("<", copys(sourcename));
        !           140:                                for(lp2=p1->linep ; lp2 ; lp2 = lp2->nxtlineblock)
        !           141:                                        if(implcom = lp2->shp) break;
        !           142:                                goto endloop;
        !           143:                                }
        !           144:                        }
        !           145:                setvar("*", &prefix[rindex(prefix, '/')]);
        !           146:                }
        !           147:        }
        !           148: 
        !           149: endloop:
        !           150: 
        !           151: 
        !           152: if(errstat==0 && (ptime<tdep || (ptime==0 && tdep==0) ) )
        !           153:        {
        !           154:        ptime = (tdep>0 ? tdep : prestime() );
        !           155:        setvar("@", p->namep);
        !           156:        setvar("?", mkqlist(qchain) );
        !           157:        if(explcom)
        !           158:                errstat += docom(explcom);
        !           159:        else if(implcom)
        !           160:                errstat += docom(implcom);
        !           161:        else if(p->septype == 0)
        !           162:                if(p1=srchname(".DEFAULT"))
        !           163:                        {
        !           164:                        setvar("<", p->namep);
        !           165:                        for(lp2 = p1->linep ; lp2 ; lp2 = lp2->nxtlineblock)
        !           166:                                if(implcom = lp2->shp)
        !           167:                                        {
        !           168:                                        errstat += docom(implcom);
        !           169:                                        break;
        !           170:                                        }
        !           171:                        }
        !           172:                else if(keepgoing)
        !           173:                        {
        !           174:                        printf("Don't know how to make %s\n", p->namep);
        !           175:                        ++errstat;
        !           176:                        }
        !           177:                else
        !           178:                        fatal1(" Don't know how to make %s", p->namep);
        !           179: 
        !           180:        setvar("@", (char *) NULL);
        !           181:        if(noexflag || (ptime = exists(p->namep)) == 0)
        !           182:                ptime = prestime();
        !           183:        }
        !           184: 
        !           185: else if(errstat!=0 && reclevel==0)
        !           186:        printf("`%s' not remade because of errors\n", p->namep);
        !           187: 
        !           188: else if(!questflag && reclevel==0  &&  didwork==NO)
        !           189:        printf("`%s' is up to date.\n", p->namep);
        !           190: 
        !           191: if(questflag && reclevel==0)
        !           192:        exit(ndocoms>0 ? -1 : 0);
        !           193: 
        !           194: p->done = (errstat ? 3 : 2);
        !           195: if(ptime1 > ptime) ptime = ptime1;
        !           196: p->modtime = ptime;
        !           197: *tval = ptime;
        !           198: return(errstat);
        !           199: }
        !           200: 
        !           201: docom(q)
        !           202: struct shblock *q;
        !           203: {
        !           204: char *s;
        !           205: struct varblock *varptr();
        !           206: int ign, nopr;
        !           207: char string[OUTMAX];
        !           208: 
        !           209: ++ndocoms;
        !           210: if(questflag)
        !           211:        return(NO);
        !           212: 
        !           213: if(touchflag)
        !           214:        {
        !           215:        s = varptr("@")->varval;
        !           216:        if(!silflag)
        !           217:                printf("touch(%s)\n", s);
        !           218:        if(!noexflag)
        !           219:                touch(YES, s);
        !           220:        }
        !           221: 
        !           222: else for( ; q ; q = q->nxtshblock )
        !           223:        {
        !           224:        subst(q->shbp,string);
        !           225: 
        !           226:        ign = ignerr;
        !           227:        nopr = NO;
        !           228:        for(s = string ; *s=='-' || *s=='@' ; ++s)
        !           229:                if(*s == '-')  ign = YES;
        !           230:                else nopr = YES;
        !           231: 
        !           232:        if( docom1(s, ign, nopr) && !ign)
        !           233:                if(keepgoing)
        !           234:                        return(YES);
        !           235:                else    fatal( (char *) NULL);
        !           236:        }
        !           237: return(NO);
        !           238: }
        !           239: 
        !           240: 
        !           241: 
        !           242: docom1(comstring, nohalt, noprint)
        !           243: register char *comstring;
        !           244: int nohalt, noprint;
        !           245: {
        !           246: register int status;
        !           247: 
        !           248: if(comstring[0] == '\0') return(0);
        !           249: 
        !           250: if(!silflag && (!noprint || noexflag) )
        !           251:        {
        !           252:        printf("%s%s\n", (noexflag ? "" : prompt), comstring);
        !           253:        fflush(stdout);
        !           254:        }
        !           255: 
        !           256: if(noexflag) return(0);
        !           257: 
        !           258: if( status = dosys(comstring, nohalt) )
        !           259:        {
        !           260:        if( status>>8 )
        !           261:                printf("*** Error code %d", status>>8 );
        !           262:        else    printf("*** Termination code %d", status );
        !           263: 
        !           264:        if(nohalt) printf(" (ignored)\n");
        !           265:        else    printf("\n");
        !           266:        fflush(stdout);
        !           267:        }
        !           268: 
        !           269: return(status);
        !           270: }
        !           271: 
        !           272: 
        !           273: /*
        !           274:    If there are any Shell meta characters in the name,
        !           275:    expand into a list, after searching directory
        !           276: */
        !           277: 
        !           278: expand(q)
        !           279: register struct depblock *q;
        !           280: {
        !           281: register char *s;
        !           282: char *s1;
        !           283: struct depblock *p, *srchdir();
        !           284: 
        !           285: s1 = q->depname->namep;
        !           286: for(s=s1 ; ;) switch(*s++)
        !           287:        {
        !           288:        case '\0':
        !           289:                return;
        !           290: 
        !           291:        case '*':
        !           292:        case '?':
        !           293:        case '[':
        !           294:                if( p = srchdir(s1 , YES, q->nxtdepblock) )
        !           295:                        {
        !           296:                        q->nxtdepblock = p;
        !           297:                        q->depname = 0;
        !           298:                        }
        !           299:                return;
        !           300:        }
        !           301: }

unix.superglobalmegacorp.com

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