Commit 5ef563a7 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Convert CNUM and FNUM to double as part of lexing

parent d4cf677a
...@@ -101,6 +101,7 @@ struct token { ...@@ -101,6 +101,7 @@ struct token {
VTAILQ_ENTRY(token) src_list; VTAILQ_ENTRY(token) src_list;
unsigned cnt; unsigned cnt;
char *dec; char *dec;
double num;
}; };
/*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/
......
...@@ -691,13 +691,13 @@ vcc_number(struct vcc *tl, struct expr **e, vcc_type_t fmt, const char *sign) ...@@ -691,13 +691,13 @@ vcc_number(struct vcc *tl, struct expr **e, vcc_type_t fmt, const char *sign)
t = tl->t; t = tl->t;
vcc_NextToken(tl); vcc_NextToken(tl);
if (tl->t->tok == ID) { if (tl->t->tok == ID) {
e1 = vcc_mk_expr(DURATION, "(%s%.*s) * %g", e1 = vcc_mk_expr(DURATION, "%s%.3f * %g",
sign, PF(t), vcc_DurationUnit(tl)); sign, t->num, vcc_DurationUnit(tl));
ERRCHK(tl); ERRCHK(tl);
} else if (fmt == REAL || t->tok == FNUM) { } else if (fmt == REAL || t->tok == FNUM) {
e1 = vcc_mk_expr(REAL, "%s%.*s", sign, PF(t)); e1 = vcc_mk_expr(REAL, "%s%.3f", sign, t->num);
} else { } else {
e1 = vcc_mk_expr(INT, "%s%.*s", sign, PF(t)); e1 = vcc_mk_expr(INT, "%s%.0f", sign, t->num);
} }
} }
e1->constant = EXPR_CONST; e1->constant = EXPR_CONST;
......
...@@ -446,6 +446,7 @@ static const char * ...@@ -446,6 +446,7 @@ static const char *
vcc_lex_number(struct vcc *tl, struct source *sp, const char *p) vcc_lex_number(struct vcc *tl, struct source *sp, const char *p)
{ {
const char *q, *r; const char *q, *r;
char *s;
for (q = p; q < sp->e; q++) for (q = p; q < sp->e; q++)
if (!vct_isdigit(*q)) if (!vct_isdigit(*q))
...@@ -457,6 +458,8 @@ vcc_lex_number(struct vcc *tl, struct source *sp, const char *p) ...@@ -457,6 +458,8 @@ vcc_lex_number(struct vcc *tl, struct source *sp, const char *p)
vcc_ErrWhere(tl, tl->t); vcc_ErrWhere(tl, tl->t);
return (NULL); return (NULL);
} }
tl->t->num = strtod(p, &s);
assert(s == tl->t->e);
return (q); return (q);
} }
r = ++q; r = ++q;
...@@ -469,6 +472,8 @@ vcc_lex_number(struct vcc *tl, struct source *sp, const char *p) ...@@ -469,6 +472,8 @@ vcc_lex_number(struct vcc *tl, struct source *sp, const char *p)
vcc_ErrWhere(tl, tl->t); vcc_ErrWhere(tl, tl->t);
return(NULL); return(NULL);
} }
tl->t->num = strtod(p, &s);
assert(s == tl->t->e);
return (r); return (r);
} }
......
...@@ -284,20 +284,13 @@ vcc_DurationUnit(struct vcc *tl) ...@@ -284,20 +284,13 @@ vcc_DurationUnit(struct vcc *tl)
uint64_t uint64_t
vcc_UintVal(struct vcc *tl) vcc_UintVal(struct vcc *tl)
{ {
const char *p, *errtxt;
int64_t retval; int64_t retval;
if (tl->t->tok != CNUM) { if (tl->t->tok != CNUM) {
Expect(tl, CNUM); Expect(tl, CNUM);
return (0); return (0);
} }
p = tl->t->b; retval = (int64_t)round(tl->t->num);
retval = SF_Parse_Integer(&p, &errtxt);
if (errno) {
VSB_printf(tl->sb, "Bad UINT: %s\n", errtxt);
vcc_ErrWhere(tl, tl->t);
return (0);
}
if (retval < 0) { if (retval < 0) {
VSB_printf(tl->sb, "UINT cannot be negative\n"); VSB_printf(tl->sb, "UINT cannot be negative\n");
vcc_ErrWhere(tl, tl->t); vcc_ErrWhere(tl, tl->t);
...@@ -310,20 +303,13 @@ vcc_UintVal(struct vcc *tl) ...@@ -310,20 +303,13 @@ vcc_UintVal(struct vcc *tl)
static double static double
vcc_DoubleVal(struct vcc *tl) vcc_DoubleVal(struct vcc *tl)
{ {
const char *p, *errtxt;
double retval; double retval;
if (tl->t->tok != CNUM && tl->t->tok != FNUM) { if (tl->t->tok != CNUM && tl->t->tok != FNUM) {
Expect(tl, CNUM); Expect(tl, CNUM);
return (0); return (0);
} }
p = tl->t->b; retval = tl->t->num;
retval = SF_Parse_Decimal(&p, &errtxt);
if (errno) {
VSB_printf(tl->sb, "Bad REAL: %s\n", errtxt);
vcc_ErrWhere(tl, tl->t);
return (0);
}
vcc_NextToken(tl); vcc_NextToken(tl);
return (retval); return (retval);
} }
...@@ -349,19 +335,13 @@ vcc_ByteVal(struct vcc *tl, VCL_INT *d) ...@@ -349,19 +335,13 @@ vcc_ByteVal(struct vcc *tl, VCL_INT *d)
{ {
double v; double v;
VCL_INT retval; VCL_INT retval;
const char *p, *errtxt; const char *errtxt;
if (tl->t->tok != CNUM && tl->t->tok != FNUM) { if (tl->t->tok != CNUM && tl->t->tok != FNUM) {
Expect(tl, CNUM); Expect(tl, CNUM);
return; return;
} }
p = tl->t->b; v = tl->t->num;
v = SF_Parse_Number(&p, &errtxt);
if (errno) {
VSB_printf(tl->sb, "Bad BYTES: %s\n", errtxt);
vcc_ErrWhere(tl, tl->t);
return;
}
vcc_NextToken(tl); vcc_NextToken(tl);
if (tl->t->tok != ID) { if (tl->t->tok != ID) {
VSB_cat(tl->sb, "Expected BYTES unit (B, KB, MB...) got "); VSB_cat(tl->sb, "Expected BYTES unit (B, KB, MB...) got ");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment