summary refs log tree commit diff
path: root/lisc/parse.c
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-11-30 15:50:46 -0500
committerQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-11-30 15:51:32 -0500
commit7c97ca6aae363b66e16f9ab97260a866706c2319 (patch)
treedc77f0260282e7bac2c923d1ad314c2c90b7b15e /lisc/parse.c
parent62a4ff456627d5c1b2dff79c9c9e33f27b983533 (diff)
downloadroux-7c97ca6aae363b66e16f9ab97260a866706c2319.tar.gz
parse and print floating points
Diffstat (limited to 'lisc/parse.c')
-rw-r--r--lisc/parse.c61
1 files changed, 45 insertions, 16 deletions
diff --git a/lisc/parse.c b/lisc/parse.c
index 8a67c87..8cba8db 100644
--- a/lisc/parse.c
+++ b/lisc/parse.c
@@ -73,7 +73,8 @@ enum {
 	TD,
 	TS,
 
-	TNum,
+	TInt,
+	TFlt,
 	TTmp,
 	TLbl,
 	TGlo,
@@ -93,6 +94,7 @@ enum {
 static FILE *inf;
 static int thead;
 static struct {
+	double flt;
 	int64_t num;
 	char *str;
 } tokval;
@@ -167,6 +169,10 @@ lex()
 		return TRBrace;
 	case '=':
 		return TEq;
+	case '`':
+		if (fscanf(inf, "%lf", &tokval.flt) != 1)
+			err("invalid floating point");
+		return TFlt;
 	case '%':
 		t = TTmp;
 		goto Alpha;
@@ -202,8 +208,7 @@ lex()
 			tokval.num += c - '0';
 		}
 		ungetc(c, inf);
-		tokval.num *= sgn;
-		return TNum;
+		return TInt;
 	}
 	if (c == '"') {
 		tokval.str = vnew(0, 1);
@@ -322,14 +327,17 @@ parseref()
 	switch (next()) {
 	case TTmp:
 		return tmpref(tokval.str);
-	case TNum:
+	case TInt:
 		c = (Con){.type = CNum, .val = tokval.num};
-		strcpy(c.label, "");
-	if (0) {
+		goto Look;
+	case TFlt:
+		c = (Con){.type = CNum, .flt = 1};
+		memcpy(&c.val, &tokval.flt, sizeof c.val);
+		goto Look;
 	case TGlo:
 		c = (Con){.type = CAddr, .val = 0};
 		strcpy(c.label, tokval.str);
-	}
+	Look:
 		for (i=0; i<ncon; i++)
 			if (con[i].type == c.type
 			&& con[i].val == c.val
@@ -646,7 +654,7 @@ parsetyp()
 	strcpy(ty->name, tokval.str);
 	t = nextnl();
 	if (t == TAlign) {
-		if (nextnl() != TNum)
+		if (nextnl() != TInt)
 			err("alignment expected");
 		for (al=0; tokval.num /= 2; al++)
 			;
@@ -656,7 +664,7 @@ parsetyp()
 	if (t != TLBrace)
 		err("type body must start with {");
 	t = nextnl();
-	if (t == TNum) {
+	if (t == TInt) {
 		ty->dark = 1;
 		ty->size = tokval.num;
 		if (ty->align == -1)
@@ -689,7 +697,7 @@ parsetyp()
 				}
 			}
 			t = nextnl();
-			if (t == TNum) {
+			if (t == TInt) {
 				c = tokval.num;
 				t = nextnl();
 			} else
@@ -724,6 +732,8 @@ static void
 parsedat(void cb(Dat *))
 {
 	char s[NString];
+	float fs;
+	double fd;
 	int t;
 	Dat d;
 
@@ -734,7 +744,7 @@ parsedat(void cb(Dat *))
 	strcpy(s, tokval.str);
 	t = nextnl();
 	if (t == TAlign) {
-		if (nextnl() != TNum)
+		if (nextnl() != TInt)
 			err("alignment expected");
 		d.type = DAlign;
 		d.u.num = tokval.num;
@@ -757,14 +767,27 @@ parsedat(void cb(Dat *))
 			case TW: d.type = DW; break;
 			case TH: d.type = DH; break;
 			case TB: d.type = DB; break;
+			case TS: d.type = DW; break;
+			case TD: d.type = DL; break;
 			}
-			if (nextnl() != TNum)
+			t = nextnl();
+			if (t != TInt && t != TFlt)
 				err("number expected");
 			do {
-				d.u.num = tokval.num;
+
+				if (t == TFlt) {
+					fd = tokval.flt;
+					fs = tokval.flt;
+					d.u.num = 0;
+					if (d.type == DL)
+						memcpy(&d.u.num, &fd, sizeof fd);
+					else
+						memcpy(&d.u.num, &fs, sizeof fs);
+				} else
+					d.u.num = tokval.num;
 				cb(&d);
 				t = nextnl();
-			} while (t == TNum);
+			} while (t == TInt || t == TFlt);
 			if (t == TRBrace)
 				break;
 			if (t != TComma)
@@ -804,6 +827,8 @@ parse(FILE *f, void data(Dat *), void func(Fn *))
 static void
 printcon(Con *c, FILE *f)
 {
+	double d;
+
 	switch (c->type) {
 	case CUndef:
 		break;
@@ -813,7 +838,11 @@ printcon(Con *c, FILE *f)
 			fprintf(f, "%+"PRIi64, c->val);
 		break;
 	case CNum:
-		fprintf(f, "%"PRIi64, c->val);
+		if (c->flt) {
+			memcpy(&d, &c->val, sizeof d);
+			fprintf(f, "`%lf", d);
+		} else
+			fprintf(f, "%"PRIi64, c->val);
 		break;
 	}
 }
@@ -917,7 +946,7 @@ printfn(Fn *fn, FILE *f)
 			fprintf(f, "\t");
 			if (!req(i->to, R)) {
 				printref(i->to, fn, f);
-				fprintf(f, " =%c", ktoc[i->cls]);
+				fprintf(f, " =%c ", ktoc[i->cls]);
 			}
 			assert(opdesc[i->op].name);
 			fprintf(f, "%s", opdesc[i->op].name);