|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.