Annotation of 43BSD/bin/make/doname.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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