static char *sccsid
= "@(#)doname.c 4.3 (Berkeley) 83/03/11";
/* BASIC PROCEDURE. RECURSIVE. */
p->done = 0 don't know what to do yet
p->done = 1 file in process of being updated
p->done = 2 file already exists in current state
p->done = 3 file make failed
doname(p
, reclevel
, tval
)
register struct nameblock
*p
;
TIMETYPE td
, td1
, tdep
, ptime
, ptime1
, prestime();
register struct depblock
*q
;
struct depblock
*qtemp
, *srchdir(), *suffp
, *suffp1
;
struct nameblock
*p1
, *p2
;
struct shblock
*implcom
, *explcom
;
register struct lineblock
*lp
;
struct lineblock
*lp1
, *lp2
;
char sourcename
[100], prefix
[100], temp
[100], concsuff
[20];
struct chain
*qchain
, *appendq();
printf("doname(%s,%d)\n",p
->namep
,reclevel
);
ptime
= exists(p
->namep
);
p
->done
= 1; /* avoid infinite loops */
/* Expand any names that have embedded metacharaters */
for(lp
= p
->linep
; lp
; lp
= lp
->nxtlineblock
)
for(q
= lp
->depp
; q
; q
=qtemp
)
/* make sure all dependents are up to date */
for(lp
= p
->linep
; lp
; lp
= lp
->nxtlineblock
)
for(q
= lp
->depp
; q
; q
= q
->nxtdepblock
)
errstat
+= doname(q
->depname
, reclevel
+1, &td1
);
printf("TIME(%s)=%ld\n", q
->depname
->namep
, td1
);
qchain
= appendq(qchain
, q
->depname
->namep
);
if(p
->septype
== SOMEDEPS
)
if( ptime
<td
|| (ptime
==0 && td
==0) || lp
->depp
==0)
setvar("?", mkqlist(qchain
) );
errstat
+= docom(lp
->shp
);
setvar("@", (char *) NULL
);
fprintf(stderr
, "Too many command lines for `%s'\n",
/* Look for implicit dependents, using suffix rules */
for(lp
= sufflist
; lp
; lp
= lp
->nxtlineblock
)
for(suffp
= lp
->depp
; suffp
; suffp
= suffp
->nxtdepblock
)
pnamep
= suffp
->depname
->namep
;
if(suffix(p
->namep
, pnamep
, prefix
))
srchdir( concat(prefix
,"*",temp
) , NO
, (struct depblock
*) NULL
);
for(lp1
= sufflist
; lp1
; lp1
= lp1
->nxtlineblock
)
for(suffp1
=lp1
->depp
; suffp1
; suffp1
= suffp1
->nxtdepblock
)
p1namep
= suffp1
->depname
->namep
;
if( (p1
=srchname(concat(p1namep
, pnamep
,concsuff
))) &&
(p2
=srchname(concat(prefix
, p1namep
,sourcename
))) )
errstat
+= doname(p2
, reclevel
+1, &td
);
qchain
= appendq(qchain
, p2
->namep
);
if(dbgflag
) printf("TIME(%s)=%ld\n", p2
->namep
, td
);
setvar("<", copys(sourcename
));
for(lp2
=p1
->linep
; lp2
; lp2
= lp2
->nxtlineblock
)
if(implcom
= lp2
->shp
) break;
setvar("*", rindex(prefix
, '/') + 1);
if(errstat
==0 && (ptime
<tdep
|| (ptime
==0 && tdep
==0) ) )
ptime
= (tdep
>0 ? tdep
: prestime() );
setvar("?", mkqlist(qchain
) );
errstat
+= docom(explcom
);
errstat
+= docom(implcom
);
if(p1
=srchname(".DEFAULT"))
for(lp2
= p1
->linep
; lp2
; lp2
= lp2
->nxtlineblock
)
errstat
+= docom(implcom
);
printf("Don't know how to make %s\n", p
->namep
);
fatal1(" Don't know how to make %s", p
->namep
);
setvar("@", (char *) NULL
);
if(noexflag
|| (ptime
= exists(p
->namep
)) == 0)
else if(errstat
!=0 && reclevel
==0)
printf("`%s' not remade because of errors\n", p
->namep
);
else if(!questflag
&& reclevel
==0 && didwork
==NO
)
printf("`%s' is up to date.\n", p
->namep
);
if(questflag
&& reclevel
==0)
exit(ndocoms
>0 ? -1 : 0);
p
->done
= (errstat
? 3 : 2);
if(ptime1
> ptime
) ptime
= ptime1
;
struct varblock
*varptr();
printf("touch(%s)\n", s
);
else for( ; q
; q
= q
->nxtshblock
)
for(s
= string
; *s
=='-' || *s
=='@' ; ++s
)
if( docom1(s
, ign
, nopr
) && !ign
)
else fatal( (char *) NULL
);
docom1(comstring
, nohalt
, noprint
)
register char *comstring
;
if(comstring
[0] == '\0') return(0);
if(!silflag
&& (!noprint
|| noexflag
) )
printf("%s%s\n", (noexflag
? "" : prompt
), comstring
);
if( status
= dosys(comstring
, nohalt
) )
printf("*** Error code %d", status
>>8 );
else printf("*** Termination code %d", status
);
if(nohalt
) printf(" (ignored)\n");
If there are any Shell meta characters in the name,
expand into a list, after searching directory
register struct depblock
*q
;
struct depblock
*p
, *srchdir();
for(s
=s1
; ;) switch(*s
++)
if( p
= srchdir(s1
, YES
, q
->nxtdepblock
) )