fix floating point scanners
This commit is contained in:
@@ -222,36 +222,33 @@ scan_result_t scan_u8(scanner_t *s) {
|
|||||||
return scan_value(val);
|
return scan_value(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool scan_f64(scanner_t *s) {
|
scan_result_t scan_f64(scanner_t *s) {
|
||||||
char const *save = s->cur;
|
char const *save = s->cur;
|
||||||
char *end;
|
char *end;
|
||||||
errno = 0;
|
errno = 0;
|
||||||
double val = strtod(s->cur, &end);
|
double val = strtod(s->cur, &end);
|
||||||
if (end == s->cur) {
|
if (end == s->cur) {
|
||||||
s->cur = save;
|
s->cur = save;
|
||||||
return false;
|
return scan_error(s, "not a f64");
|
||||||
}
|
}
|
||||||
if (errno == ERANGE) {
|
if (errno == ERANGE) {
|
||||||
scanner_error(s, "float does not fit in f64 value");
|
return scan_error(s, "float does not fit in f64 value");
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
s->cur = end;
|
s->cur = end;
|
||||||
s->value.f64 = val;
|
return scan_value(.f64=val);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool scan_f32(scanner_t *s) {
|
scan_result_t scan_f32(scanner_t *s) {
|
||||||
if (!scan_f64(s)) {
|
scan_result_t result = scan_f64(s);
|
||||||
return false;
|
if (!result.ok) {
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
float val = (float)s->value.f64;
|
float val = (float)result.value.f64;
|
||||||
double back = (double)val;
|
double back = (double)val;
|
||||||
if (back != s->value.f64) {
|
if (back != result.value.f64) {
|
||||||
scanner_error(s, "float does not fit in f32 value");
|
return scan_error(s, "float does not fit in f32 value");
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
s->value.f32 = val;
|
return scan_value(.f32=val);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool scan_identifier(scanner_t *s) {
|
bool scan_identifier(scanner_t *s) {
|
||||||
|
|||||||
Reference in New Issue
Block a user