aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/rc/subr.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2003-11-23 18:04:08 +0000
committerrsc <devnull@localhost>2003-11-23 18:04:08 +0000
commitf08fdedcee12c06e3ce9ac9bec363915978e8289 (patch)
treed67a27473be1e8f98d3694028104d9ddf915345b /src/cmd/rc/subr.c
parent5993a8f2756bc455101a8c9ce95347d5050e7883 (diff)
downloadplan9port-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.c59
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();
+}