The use of {w} in a program line of fe did not work, because ack scans

fe before it scans MACH (which is where most vars are declared).
Reversing the order of the scans caused other problems, related to
callnames. I have therefore delayed the 'scanvars' of program lines
(as is already done with args).
This commit is contained in:
ceriel 1987-10-19 10:24:52 +00:00
parent 67cf9c4933
commit 211d2bcfff
2 changed files with 16 additions and 10 deletions

View file

@ -131,10 +131,7 @@ intrf() {
if ( strcmp(ty_name,PROG)==0 ) {
if ( new->t_prog ) twice=YES ;
bline= scanb(bol); /* Scan for \ */
vline= scanvars(gr_start(bline)); /* Scan for {} */
gr_throw(&bline);
new->t_prog= gr_final(&vline);
clr_noscan(new->t_prog);
new->t_prog= gr_final(&bline);
} else
if ( strcmp(ty_name,MAPF)==0 ) {
/* First read the mapflags line

View file

@ -7,6 +7,7 @@
#include "ack.h"
#include "list.h"
#include "trans.h"
#include "grows.h"
#include "data.h"
#include <signal.h>
@ -16,6 +17,8 @@ static char rcs_id[] = "$Header$" ;
#define ARG_MORE 40 /* The size of args chunks to allocate */
extern growstring scanvars();
static char **arglist ; /* The first argument */
static unsigned argcount ; /* The current number of arguments */
static unsigned argmax; /* The maximum number of arguments so far */
@ -28,7 +31,11 @@ int do_run() {
int runphase(phase) register trf *phase ; {
register list_elem *elem ;
char *prog ; int result ;
growstring bline ;
bline=scanvars(phase->t_prog) ;
prog=gr_final(&bline) ;
if ( v_flag || debug ) {
if ( v_flag==1 && !debug ) {
vprint("%s",phase->t_name) ;
@ -43,7 +50,7 @@ int runphase(phase) register trf *phase ; {
}
} else {
/* list all args */
vprint("%s",phase->t_prog) ;
vprint("%s",prog) ;
scanlist(l_first(phase->t_flags), elem) {
vprint(" %s",l_content(*elem)) ;
}
@ -62,10 +69,12 @@ int runphase(phase) register trf *phase ; {
x_arg(l_content(*elem)) ;
}
x_arg( (char *)0 ) ;
return run_exec(phase) ;
result=run_exec(phase,prog) ;
throws(&prog) ;
return result ;
}
int run_exec(phase) trf *phase ; {
int run_exec(phase,prog) trf *phase ; char *prog ; {
int status, child, waitchild ;
do_flush();
@ -91,7 +100,7 @@ int run_exec(phase) trf *phase ; {
quit(-5) ;
default:
error("%s died with signal %d",
phase->t_prog,status&0177) ;
prog,status&0177) ;
}
/* The assumption is that processes voluntarely
dying with a non-zero status already produced
@ -124,9 +133,9 @@ int run_exec(phase) trf *phase ; {
exit(1) ;
}
}
execv(phase->t_prog,arglist) ;
execv(prog,arglist) ;
if ( phase->t_stdout ) { close(1) ; dup(2) ; }
error("Cannot execute %s",phase->t_prog) ;
error("Cannot execute %s",prog) ;
exit(1) ;
/*NOTREACHED*/
}