aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/bc.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/bc.y')
-rw-r--r--src/cmd/bc.y124
1 files changed, 64 insertions, 60 deletions
diff --git a/src/cmd/bc.y b/src/cmd/bc.y
index 43021b93..699205d4 100644
--- a/src/cmd/bc.y
+++ b/src/cmd/bc.y
@@ -6,10 +6,8 @@
#define bsp_max 5000
Biobuf *in;
- #define stdin bstdin
- #define stdout bstdout
- Biobuf stdin;
- Biobuf stdout;
+ Biobuf bstdin;
+ Biobuf bstdout;
char cary[1000];
char* cp = { cary };
char string[1000];
@@ -19,7 +17,7 @@
int bindx = 0;
int lev = 0;
int ln;
- int* ttp;
+ char* ttp;
char* ss = "";
int bstack[10] = { 0 };
char* numb[15] =
@@ -28,8 +26,8 @@
" 6", " 7", " 8", " 9", " 10", " 11",
" 12", " 13", " 14"
};
- int* pre;
- int* post;
+ char* pre;
+ char* post;
long peekc = -1;
int sargc;
@@ -61,40 +59,39 @@
"u","v","w","x","y","z"
};
char* dot = { "." };
- int bspace[bsp_max];
- int* bsp_nxt = { bspace };
+ char* bspace[bsp_max];
+ char** bsp_nxt = bspace;
int bdebug = 0;
int lflag;
int cflag;
int sflag;
- int* bundle(int, ...);
- void conout(int*, char*);
+ char* bundle(int, ...);
+ void conout(char*, char*);
int cpeek(int, int, int);
int getch(void);
- int* geta(char*);
- int* getf(char*);
+ char* geta(char*);
+ char* getf(char*);
void getout(void);
- void output(int*);
+ void output(char*);
void pp(char*);
- void routput(int*);
+ void routput(char*);
void tp(char*);
void yyerror(char*, ...);
int yyparse(void);
typedef void* pointer;
-/* #pragma varargck type "lx" pointer */
+ #pragma varargck type "lx" pointer
%}
%union
{
- int* iptr;
char* cptr;
int cc;
}
-%type <iptr> pstat stat stat1 def slist dlets e ase nase
-%type <iptr> slist re fprefix cargs eora cons constant lora
+%type <cptr> pstat stat stat1 def slist dlets e ase nase
+%type <cptr> slist re fprefix cargs eora cons constant lora
%type <cptr> crs
%token <cptr> LETTER EQOP _AUTO DOT
@@ -124,7 +121,7 @@ stuff:
ttp = bundle(6, pre, $6, post , "0", numb[lev], "Q");
conout(ttp, (char*)$1);
rcrs = crs;
- output((int*)""); /* this is horse puk!! */
+ output("");
lev = bindx = 0;
}
@@ -550,8 +547,8 @@ def:
_DEFINE LETTER '('
{
$$ = getf($2);
- pre = (int*)"";
- post = (int*)"";
+ pre = (char*)"";
+ post = (char*)"";
lev = 1;
bindx = 0;
bstack[bindx] = 0;
@@ -793,12 +790,13 @@ loop:
if(ifile > sargc) {
if(ifile >= sargc+2)
getout();
- in = &stdin;
+ in = &bstdin;
Binit(in, 0, OREAD);
ln = 0;
goto loop;
}
- Bterm(in);
+ if(in)
+ Bterm(in);
if((in = Bopen(sargv[ifile], OREAD)) != 0){
ln = 0;
ss = sargv[ifile];
@@ -808,57 +806,63 @@ loop:
return 0; /* shut up ken */
}
-int*
+char*
bundle(int a, ...)
{
- int i, *p, *q;
-
- p = &a;
- i = *p++;
+ int i;
+ char **q;
+ va_list arg;
+
+ i = a;
+ va_start(arg, a);
q = bsp_nxt;
if(bdebug)
fprint(2, "bundle %d elements at %lx\n", i, q);
while(i-- > 0) {
if(bsp_nxt >= &bspace[bsp_max])
yyerror("bundling space exceeded");
- *bsp_nxt++ = *p++;
+ *bsp_nxt++ = va_arg(arg, char*);
}
*bsp_nxt++ = 0;
- yyval.iptr = q;
- return q;
+ va_end(arg);
+ yyval.cptr = (char*)q;
+ return (char*)q;
}
void
-routput(int *p)
+routput(char *p)
{
+ char **pp;
+
if(bdebug)
fprint(2, "routput(%lx)\n", p);
- if(p >= &bspace[0] && p < &bspace[bsp_max]) {
+ if((char**)p >= &bspace[0] && (char**)p < &bspace[bsp_max]) {
/* part of a bundle */
- while(*p != 0)
- routput((int*)(*p++));
+ pp = (char**)p;
+ while(*pp != 0)
+ routput(*pp++);
} else
- Bprint(&stdout, (char*)p); /* character string */
+ Bprint(&bstdout, p); /* character string */
}
void
-output(int *p)
+output(char *p)
{
routput(p);
bsp_nxt = &bspace[0];
- Bprint(&stdout, "\n");
- Bflush(&stdout);
+ Bprint(&bstdout, "\n");
+ Bflush(&bstdout);
cp = cary;
crs = rcrs;
}
void
-conout(int *p, char *s)
+conout(char *p, char *s)
{
- Bprint(&stdout, "[");
+ Bprint(&bstdout, "[");
routput(p);
- Bprint(&stdout, "]s%s\n", s);
- Bflush(&stdout);
+ Bprint(&bstdout, "]s%s\n", s);
+ Bflush(&bstdout);
lev--;
}
@@ -867,8 +871,8 @@ yyerror(char *s, ...)
{
if(ifile > sargc)
ss = "teletype";
- Bprint(&stdout, "c[%s on line %d, %s]pc\n", s, ln+1, ss);
- Bflush(&stdout);
+ Bprint(&bstdout, "c[%s on line %d, %s]pc\n", s, ln+1, ss);
+ Bflush(&bstdout);
cp = cary;
crs = rcrs;
bindx = 0;
@@ -881,9 +885,9 @@ pp(char *s)
{
/* puts the relevant stuff on pre and post for the letter s */
bundle(3, "S", s, pre);
- pre = yyval.iptr;
+ pre = yyval.cptr;
bundle(4, post, "L", s, "s.");
- post = yyval.iptr;
+ post = yyval.cptr;
}
void
@@ -891,19 +895,19 @@ tp(char *s)
{
/* same as pp, but for temps */
bundle(3, "0S", s, pre);
- pre = yyval.iptr;
+ pre = yyval.cptr;
bundle(4, post, "L", s, "s.");
- post = yyval.iptr;
+ post = yyval.cptr;
}
void
yyinit(int argc, char **argv)
{
- Binit(&stdout, 1, OWRITE);
+ Binit(&bstdout, 1, OWRITE);
sargv = argv;
sargc = argc - 1;
if(sargc == 0) {
- in = &stdin;
+ in = &bstdin;
Binit(in, 0, OREAD);
} else if((in = Bopen(sargv[1], OREAD)) == 0)
yyerror("cannot open input file");
@@ -915,21 +919,21 @@ yyinit(int argc, char **argv)
void
getout(void)
{
- Bprint(&stdout, "q");
- Bflush(&stdout);
+ Bprint(&bstdout, "q");
+ Bflush(&bstdout);
exits(0);
}
-int*
+char*
getf(char *p)
{
- return (int*)funtab[*p - 'a'];
+ return funtab[*p - 'a'];
}
-int*
+char*
geta(char *p)
{
- return (int*)atab[*p - 'a'];
+ return atab[*p - 'a'];
}
void
@@ -967,7 +971,7 @@ main(int argc, char **argv)
yyinit(argc, argv);
for(;;)
yyparse();
- /* exits(0); */
+ exits(0);
}
pipe(p);
if(fork() == 0) {
@@ -981,5 +985,5 @@ main(int argc, char **argv)
dup(p[0], 0);
close(p[0]);
close(p[1]);
- execlp("dc", "dc", (char*)0);
+ execl("dc", "dc", nil);
}