Commit Diff


commit - a196bf0577767d97165f01186b32b0913430a1fe
commit + e637c944febf271252e59742aa108d6e0a527eb7
blob - ae835ef9535250a8719ba67b062a318665e7be11
blob + a26781c0f1eaf65f5c72d4fcae7589c2d22bbd98
--- src/cmd/acid/acid.h
+++ src/cmd/acid/acid.h
@@ -76,6 +76,7 @@ enum
 	TSTRING,
 	TLIST,
 	TCODE,
+	NUMT,
 };
 
 struct Type
@@ -211,6 +212,8 @@ void	gc(void);
 char*	getstatus(int);
 void*	gmalloc(long);
 void	indir(Map*, ulong, char, Node*);
+void	initexpr(void);
+void	initprint(void);
 void	installbuiltin(void);
 void	kinit(void);
 int	Zfmt(Fmt*);
@@ -311,4 +314,5 @@ enum
 	OFMT,
 	OEVAL,
 	OWHAT,
+	NUMO,
 };
blob - 46e522bfdb48d761f6a85af848ce27c3e4ffe5c6
blob + 18b68f4e24cd19ea382e04ce41d07269f42205fb
--- src/cmd/acid/expr.c
+++ src/cmd/acid/expr.c
@@ -6,36 +6,39 @@
 #define Extern extern
 #include "acid.h"
 
-static int fsize[] =
+static int fsize[256];
+
+static void
+initfsize(void)
 {
-	['A'] 4,
-	['B'] 4,
-	['C'] 1,
-	['D'] 4,
-	['F'] 8,
-	['G'] 8,
-	['O'] 4,
-	['Q'] 4,
-	['R'] 4,
-	['S'] 4,
-	['U'] 4,
-	['V'] 8,
-	['X'] 4,
-	['Y'] 8,
-	['W'] 8,
-	['Z'] 8,
-	['a'] 4,
-	['b'] 1,
-	['c'] 1,
-	['d'] 2,
-	['f'] 4,
-	['g'] 4,
-	['o'] 2,
-	['q'] 2,
-	['r'] 2,
-	['s'] 4,
-	['u'] 2,
-	['x'] 2,
+	fsize['A'] = 4;
+	fsize['B'] = 4;
+	fsize['C'] = 1;
+	fsize['D'] = 4;
+	fsize['F'] = 8;
+	fsize['G'] = 8;
+	fsize['O'] = 4;
+	fsize['Q'] = 4;
+	fsize['R'] = 4;
+	fsize['S'] = 4;
+	fsize['U'] = 4;
+	fsize['V'] = 8;
+	fsize['X'] = 4;
+	fsize['Y'] = 8;
+	fsize['W'] = 8;
+	fsize['Z'] = 8;
+	fsize['a'] = 4;
+	fsize['b'] = 1;
+	fsize['c'] = 1;
+	fsize['d'] = 2;
+	fsize['f'] = 4;
+	fsize['g'] = 4;
+	fsize['o'] = 2;
+	fsize['q'] = 2;
+	fsize['r'] = 2;
+	fsize['s'] = 4;
+	fsize['u'] = 2;
+	fsize['x'] = 2;
 };
 
 int
@@ -964,55 +967,66 @@ owhat(Node *n, Node *res)
 	whatis(n->sym);
 }
 
-void (*expop[])(Node*, Node*) =
+void (*expop[NUMO])(Node*, Node*);
+
+static void
+initexpop(void)
 {
-	[ONAME]		oname,
-	[OCONST]	oconst,
-	[OMUL]		omul,
-	[ODIV]		odiv,
-	[OMOD]		omod,
-	[OADD]		oadd,
-	[OSUB]		osub,
-	[ORSH]		orsh,
-	[OLSH]		olsh,
-	[OLT]		olt,
-	[OGT]		ogt,
-	[OLEQ]		oleq,
-	[OGEQ]		ogeq,
-	[OEQ]		oeq,
-	[ONEQ]		oeq,
-	[OLAND]		oland,
-	[OXOR]		oxor,
-	[OLOR]		olor,
-	[OCAND]		ocand,
-	[OCOR]		ocor,
-	[OASGN]		oasgn,
-	[OINDM]		oindm,
-	[OEDEC]		oeinc,
-	[OEINC]		oeinc,
-	[OPINC]		opinc,
-	[OPDEC]		opinc,
-	[ONOT]		onot,
-	[OIF]		0,
-	[ODO]		0,
-	[OLIST]		olist,
-	[OCALL]		ocall,
-	[OCTRUCT]	octruct,
-	[OWHILE]	0,
-	[OELSE]		0,
-	[OHEAD]		ohead,
-	[OTAIL]		otail,
-	[OAPPEND]	oappend,
-	[ORET]		0,
-	[OINDEX]	oindex,
-	[OINDC]		oindc,
-	[ODOT]		odot,
-	[OLOCAL]	0,
-	[OFRAME]	oframe,
-	[OCOMPLEX]	0,
-	[ODELETE]	odelete,
-	[OCAST]		ocast,
-	[OFMT]		ofmt,
-	[OEVAL]		oeval,
-	[OWHAT]		owhat,
+	expop[ONAME] = oname;
+	expop[OCONST] = oconst;
+	expop[OMUL] = omul;
+	expop[ODIV] = odiv;
+	expop[OMOD] = omod;
+	expop[OADD] = oadd;
+	expop[OSUB] = osub;
+	expop[ORSH] = orsh;
+	expop[OLSH] = olsh;
+	expop[OLT] = olt;
+	expop[OGT] = ogt;
+	expop[OLEQ] = oleq;
+	expop[OGEQ] = ogeq;
+	expop[OEQ] = oeq;
+	expop[ONEQ] = oeq;
+	expop[OLAND] = oland;
+	expop[OXOR] = oxor;
+	expop[OLOR] = olor;
+	expop[OCAND] = ocand;
+	expop[OCOR] = ocor;
+	expop[OASGN] = oasgn;
+	expop[OINDM] = oindm;
+	expop[OEDEC] = oeinc;
+	expop[OEINC] = oeinc;
+	expop[OPINC] = opinc;
+	expop[OPDEC] = opinc;
+	expop[ONOT] = onot;
+	expop[OIF] = 0;
+	expop[ODO] = 0;
+	expop[OLIST] = olist;
+	expop[OCALL] = ocall;
+	expop[OCTRUCT] = octruct;
+	expop[OWHILE] =0;
+	expop[OELSE] = 0;
+	expop[OHEAD] = ohead;
+	expop[OTAIL] = otail;
+	expop[OAPPEND] = oappend;
+	expop[ORET] = 0;
+	expop[OINDEX] =oindex;
+	expop[OINDC] = oindc;
+	expop[ODOT] = odot;
+	expop[OLOCAL] =0;
+	expop[OFRAME] = oframe;
+	expop[OCOMPLEX] =0;
+	expop[ODELETE] = odelete;
+	expop[OCAST] = ocast;
+	expop[OFMT] = ofmt;
+	expop[OEVAL] = oeval;
+	expop[OWHAT] = owhat;
 };
+
+void
+initexpr(void)
+{
+	initfsize();
+	initexpop();
+}
+
blob - 40f6400e7aa202b3b048fd5dec4cbffe86c765d2
blob + db11eb1c7925d8fa1c973834b39c98a8bd421638
--- src/cmd/acid/lex.c
+++ src/cmd/acid/lex.c
@@ -37,25 +37,30 @@ keywds[] =
 	0,		0
 };
 
-char cmap[256] =
+char cmap[256];
+
+void
+initcmap(void)
 {
-	['0']	'\0'+1,
-	['n']	'\n'+1,
-	['r']	'\r'+1,
-	['t']	'\t'+1,
-	['b']	'\b'+1,
-	['f']	'\f'+1,
-	['a']	'\a'+1,
-	['v']	'\v'+1,
-	['\\']	'\\'+1,
-	['"']	'"'+1,
+	cmap['0']=	'\0'+1;
+	cmap['n']=	'\n'+1;
+	cmap['r']=	'\r'+1;
+	cmap['t']=	'\t'+1;
+	cmap['b']=	'\b'+1;
+	cmap['f']=	'\f'+1;
+	cmap['a']=	'\a'+1;
+	cmap['v']=	'\v'+1;
+	cmap['\\']=	'\\'+1;
+	cmap['"']=	'"'+1;
 };
 
 void
 kinit(void)
 {
 	int i;
-	
+
+	initcmap();
+
 	for(i = 0; keywds[i].name; i++) 
 		enter(keywds[i].name, keywds[i].terminal);
 }
blob - 9c57ae6a6ce85c229bc4f9eb753f8f56072a48dc
blob + 89bca4c3e7aeaf0896e4a8e5ded0bc9b9cc00b70
--- src/cmd/acid/main.c
+++ src/cmd/acid/main.c
@@ -76,6 +76,7 @@ main(int argc, char *argv[])
 	Binit(&bioout, 1, OWRITE);
 	bout = &bioout;
 
+	initexpr();
 	kinit();
 	initialising = 1;
 	pushfile(0);
blob - 00d7b737017828d5ca556733556a3c29da8c3a3f
blob + 960210378b6ed9df98142559d1149273117f1a24
--- src/cmd/acid/print.c
+++ src/cmd/acid/print.c
@@ -6,38 +6,46 @@
 #define Extern extern
 #include "acid.h"
 
-static char *binop[] =
+static char *binop[NUMO];
+
+static void
+initbinop(void)
 {
-	[OMUL]	"*",
-	[ODIV]	"/",
-	[OMOD]	"%",
-	[OADD]	"+",
-	[OSUB]	"-",
-	[ORSH]	">>",
-	[OLSH]	"<<",
-	[OLT]	"<",
-	[OGT]	">",
-	[OLEQ]	"<=",
-	[OGEQ]	">=",
-	[OEQ]	"==",
-	[ONEQ]	"!=",
-	[OLAND]	"&",
-	[OXOR]	"^",
-	[OLOR]	"|",
-	[OCAND]	"&&",
-	[OCOR]	"||",
-	[OASGN]	" = ",
+	binop[OMUL]=	"*";
+	binop[ODIV]=	"/";
+	binop[OMOD]=	"%";
+	binop[OADD]=	"+";
+	binop[OSUB]=	"-";
+	binop[ORSH]=	">>";
+	binop[OLSH]=	"<<";
+	binop[OLT]=	"<";
+	binop[OGT]=	">";
+	binop[OLEQ]=	"<=";
+	binop[OGEQ]=	">=";
+	binop[OEQ]=	"==";
+	binop[ONEQ]=	"!=";
+	binop[OLAND]=	"&";
+	binop[OXOR]=	"^";
+	binop[OLOR]=	"|";
+	binop[OCAND]=	"&&";
+	binop[OCOR]=	"||";
+	binop[OASGN]=	" = ";
 };
 
 static char *tabs = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
-char *typenames[] =
-{
-	[TINT]		"integer",
-	[TFLOAT]	"float",
-	[TSTRING]	"string",
-	[TLIST]		"list",
-	[TCODE]		"code",
+char *typenames[] = {
+	"integer",
+	"float",
+	"string",
+	"list",
+	"code",
 };
+
+void
+initprint(void)
+{
+	initbinop();
+}
 
 int
 cmp(const void *va, const void *vb)