Include looks in #9/acid now.

Acid works harder at not falling over.
This commit is contained in:
rsc 2004-04-21 05:34:37 +00:00
parent eaf56db5bc
commit a8c15b08ca
3 changed files with 26 additions and 6 deletions

View file

@ -478,6 +478,8 @@ interpret(Node *r, Node *args)
void
include(Node *r, Node *args)
{
char *file, *libfile;
static char buf[1024];
Node res;
int isave;
@ -488,7 +490,19 @@ include(Node *r, Node *args)
error("include(string): arg type");
Bflush(bout);
pushfile(res.store.u.string->string);
libfile = nil;
file = res.store.u.string->string;
if(access(file, AREAD) < 0 && file[0] != '/'){
snprint(buf, sizeof buf, "#9/acid/%s", file);
libfile = unsharp(buf);
if(access(libfile, AREAD) >= 0){
strecpy(buf, buf+sizeof buf, libfile);
file = buf;
}
free(libfile);
}
pushfile(file);
isave = interactive;
interactive = 0;

View file

@ -76,6 +76,7 @@ struct IOstack
IOstack *prev;
};
IOstack *lexio;
uint nlexio;
void
setacidfile(void)
@ -100,6 +101,9 @@ pushfile(char *file)
Biobuf *b;
IOstack *io;
if(nlexio > 64)
error("too many includes");
if(file)
b = Bopen(file, OREAD);
else{
@ -122,6 +126,7 @@ pushfile(char *file)
io->fin = b;
io->prev = lexio;
lexio = io;
nlexio++;
setacidfile();
}
@ -156,6 +161,7 @@ pushstr(Node *s)
io->ip = io->text;
io->fin = 0;
io->prev = lexio;
nlexio++;
lexio = io;
setacidfile();
}
@ -190,6 +196,7 @@ popio(void)
s = lexio;
lexio = s->prev;
free(s);
nlexio--;
setacidfile();
return 1;
}
@ -197,18 +204,17 @@ popio(void)
int
Zfmt(Fmt *f)
{
int i;
char buf[1024];
char buf[1024], *p;
IOstack *e;
e = lexio;
if(e) {
i = sprint(buf, "%s:%d", e->name, line);
p = seprint(buf, buf+sizeof buf, "%s:%d", e->name, line);
while(e->prev) {
e = e->prev;
if(initialising && e->prev == 0)
break;
i += sprint(buf+i, " [%s:%d]", e->name, e->line);
p = seprint(p, buf+sizeof buf, " [%s:%d]", e->name, e->line);
}
} else
sprint(buf, "no file:0");

View file

@ -36,7 +36,7 @@ unique(char *buf, Symbol *s)
}
}
if(renamed && !quiet)
print("\t%s=%s %c/%Z\n", s->name, buf, s->type, s->loc);
print("\t%s=%s %c/%L\n", s->name, buf, s->type, s->loc);
if(l == 0)
l = enter(buf, Tid);
return l;