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