Annotation of 40BSD/cmd/make/doname.c, revision 1.1

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

unix.superglobalmegacorp.com

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