diff options
author | rsc <devnull@localhost> | 2003-11-23 18:04:08 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2003-11-23 18:04:08 +0000 |
commit | f08fdedcee12c06e3ce9ac9bec363915978e8289 (patch) | |
tree | d67a27473be1e8f98d3694028104d9ddf915345b /src/cmd/rc/subr.c | |
parent | 5993a8f2756bc455101a8c9ce95347d5050e7883 (diff) | |
download | plan9port-f08fdedcee12c06e3ce9ac9bec363915978e8289.tar.gz plan9port-f08fdedcee12c06e3ce9ac9bec363915978e8289.tar.bz2 plan9port-f08fdedcee12c06e3ce9ac9bec363915978e8289.zip |
Plan 9's rc.
not a clear win over byron's,
but at least it has the right syntax.
Diffstat (limited to 'src/cmd/rc/subr.c')
-rw-r--r-- | src/cmd/rc/subr.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/cmd/rc/subr.c b/src/cmd/rc/subr.c new file mode 100644 index 00000000..2b242242 --- /dev/null +++ b/src/cmd/rc/subr.c @@ -0,0 +1,59 @@ +#include "rc.h" +#include "exec.h" +#include "io.h" +#include "fns.h" +char *emalloc(long n){ + char *p=(char *)Malloc(n); + if(p==0) panic("Can't malloc %d bytes", n); +/* if(err){ pfmt(err, "malloc %d->%p\n", n, p); flush(err); } *//**/ + return p; +} +void efree(char *p) +{ +/* pfmt(err, "free %p\n", p); flush(err); *//**/ + if(p) free(p); + else pfmt(err, "free 0\n"); +} +extern int lastword, lastdol; +void yyerror(char *m) +{ + pfmt(err, "rc: "); + if(runq->cmdfile && !runq->iflag) + pfmt(err, "%s:%d: ", runq->cmdfile, runq->lineno); + else if(runq->cmdfile) + pfmt(err, "%s: ", runq->cmdfile); + else if(!runq->iflag) + pfmt(err, "line %d: ", runq->lineno); + if(tok[0] && tok[0]!='\n') pfmt(err, "token %q: ", tok); + pfmt(err, "%s\n", m); + flush(err); + lastword=0; + lastdol=0; + while(lastc!='\n' && lastc!=EOF) advance(); + nerror++; + setvar("status", newword(m, (word *)0)); +} +char *bp; +void iacvt(int n){ + if(n<0){ + *bp++='-'; + n=-n; /* doesn't work for n==-inf */ + } + if(n/10) + iacvt(n/10); + *bp++=n%10+'0'; +} +void itoa(char *s, long n) +{ + bp=s; + iacvt(n); + *bp='\0'; +} +void panic(char *s, int n) +{ + pfmt(err, "rc: "); + pfmt(err, s, n); + pchr(err, '\n'); + flush(err); + Abort(); +} |