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