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 {
VTAILQ_ENTRY(token) src_list;
unsigned cnt;
char *dec;
double num;
};
/*---------------------------------------------------------------------*/
......
......@@ -691,13 +691,13 @@ vcc_number(struct vcc *tl, struct expr **e, vcc_type_t fmt, const char *sign)
t = tl->t;
vcc_NextToken(tl);
if (tl->t->tok == ID) {
e1 = vcc_mk_expr(DURATION, "(%s%.*s) * %g",
sign, PF(t), vcc_DurationUnit(tl));
e1 = vcc_mk_expr(DURATION, "%s%.3f * %g",
sign, t->num, vcc_DurationUnit(tl));
ERRCHK(tl);
} 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 {
e1 = vcc_mk_expr(INT, "%s%.*s", sign, PF(t));
e1 = vcc_mk_expr(INT, "%s%.0f", sign, t->num);
}
}
e1->constant = EXPR_CONST;
......
......@@ -446,6 +446,7 @@ static const char *
vcc_lex_number(struct vcc *tl, struct source *sp, const char *p)
{
const char *q, *r;
char *s;
for (q = p; q < sp->e; q++)
if (!vct_isdigit(*q))
......@@ -457,6 +458,8 @@ vcc_lex_number(struct vcc *tl, struct source *sp, const char *p)
vcc_ErrWhere(tl, tl->t);
return (NULL);
}
tl->t->num = strtod(p, &s);
assert(s == tl->t->e);
return (q);
}
r = ++q;
......@@ -469,6 +472,8 @@ vcc_lex_number(struct vcc *tl, struct source *sp, const char *p)
vcc_ErrWhere(tl, tl->t);
return(NULL);
}
tl->t->num = strtod(p, &s);
assert(s == tl->t->e);
return (r);
}
......
......@@ -284,20 +284,13 @@ vcc_DurationUnit(struct vcc *tl)
uint64_t
vcc_UintVal(struct vcc *tl)
{
const char *p, *errtxt;
int64_t retval;
if (tl->t->tok != CNUM) {
Expect(tl, CNUM);
return (0);
}
p = tl->t->b;
retval = SF_Parse_Integer(&p, &errtxt);
if (errno) {
VSB_printf(tl->sb, "Bad UINT: %s\n", errtxt);
vcc_ErrWhere(tl, tl->t);
return (0);
}
retval = (int64_t)round(tl->t->num);
if (retval < 0) {
VSB_printf(tl->sb, "UINT cannot be negative\n");
vcc_ErrWhere(tl, tl->t);
......@@ -310,20 +303,13 @@ vcc_UintVal(struct vcc *tl)
static double
vcc_DoubleVal(struct vcc *tl)
{
const char *p, *errtxt;
double retval;
if (tl->t->tok != CNUM && tl->t->tok != FNUM) {
Expect(tl, CNUM);
return (0);
}
p = tl->t->b;
retval = SF_Parse_Decimal(&p, &errtxt);
if (errno) {
VSB_printf(tl->sb, "Bad REAL: %s\n", errtxt);
vcc_ErrWhere(tl, tl->t);
return (0);
}
retval = tl->t->num;
vcc_NextToken(tl);
return (retval);
}
......@@ -349,19 +335,13 @@ vcc_ByteVal(struct vcc *tl, VCL_INT *d)
{
double v;
VCL_INT retval;
const char *p, *errtxt;
const char *errtxt;
if (tl->t->tok != CNUM && tl->t->tok != FNUM) {
Expect(tl, CNUM);
return;
}
p = tl->t->b;
v = SF_Parse_Number(&p, &errtxt);
if (errno) {
VSB_printf(tl->sb, "Bad BYTES: %s\n", errtxt);
vcc_ErrWhere(tl, tl->t);
return;
}
v = tl->t->num;
vcc_NextToken(tl);
if (tl->t->tok != ID) {
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