support exponential literal

This commit is contained in:
Yuichi Nishiwaki 2014-08-08 15:38:29 +09:00
parent 977345392f
commit bd98dda5d0
1 changed files with 29 additions and 5 deletions

View File

@ -236,6 +236,30 @@ read_uinteger(pic_state *pic, struct pic_port *port, int c, char buf[])
return i; return i;
} }
static size_t
read_suffix(pic_state *pic, struct pic_port *port, char buf[])
{
size_t i = 0;
char c;
c = peek(port);
if (c != 'e' && c != 'E') {
return i;
}
buf[i++] = next(port);
switch ((c = next(port))) {
case '-':
case '+':
buf[i++] = c;
c = next(port);
default:
return i + read_uinteger(pic, port, c, buf + i);
}
}
static pic_value static pic_value
read_number(pic_state *pic, struct pic_port *port, int c) read_number(pic_state *pic, struct pic_port *port, int c)
{ {
@ -246,14 +270,14 @@ read_number(pic_state *pic, struct pic_port *port, int c)
switch (peek(port)) { switch (peek(port)) {
case '.': case '.':
do { buf[i++] = next(port);
buf[i++] = next(port); i += read_uinteger(pic, port, next(port), buf + i);
} while (isdigit(peek(port))); read_suffix(pic, port, buf + i);
buf[i] = '\0';
return pic_float_value(atof(buf)); return pic_float_value(atof(buf));
default: default:
return pic_int_value(atoi(buf)); read_suffix(pic, port, buf + i);
return pic_int_value((int)atof(buf));
} }
} }