work on number parsing

This commit is contained in:
William Bell
2025-08-11 19:26:19 +01:00
parent d2e742f992
commit f851b37f99
7 changed files with 208 additions and 25 deletions

View File

@@ -7,6 +7,7 @@
#include "number.h"
#include "../../memory.h"
#include <ctype.h>
#include <gmp-x86_64.h>
#include <gmp.h>
#include <stdio.h>
#include <stdlib.h>
@@ -102,6 +103,11 @@ int mpq_set_decimal_str_exp(mpq_t r, const char *str) {
free(buf);
return -1;
}
if (endptr-exp_str>11) {
free(buf);
return -1;
}
if (exp_negative)
exp_val = -exp_val;
}
@@ -145,18 +151,13 @@ int mpq_set_decimal_str_exp(mpq_t r, const char *str) {
if (denom_exp >= 0) {
mpz_ui_pow_ui(denominator, 10, (unsigned long)denom_exp);
} else {
// denom_exp < 0 means multiply numerator by 10^(-denom_exp)
mpz_ui_pow_ui(denominator, 10, 0);
mpz_ui_pow_ui(numerator, 10, (unsigned long)(-denom_exp));
}
mpz_set_ui(denominator, 1);
if (denom_exp < 0) {
mpz_t temp;
mpz_init(temp);
mpz_ui_pow_ui(temp, 10, (unsigned long)(-denom_exp));
mpz_mul(numerator, numerator, temp);
mpz_clear(temp);
mpz_set_ui(denominator, 1);
}
mpq_set_num(r, numerator);
@@ -172,7 +173,7 @@ int mpq_set_decimal_str_exp(mpq_t r, const char *str) {
return 0;
}
ParsedValueReturn parse_number(Token *token, char*path) {
ParsedValueReturn parse_number(Token *token, char *path) {
ParsedValue *parsedValue = checked_malloc(sizeof(ParsedValue));
parsedValue->type = AST_NUMBER;
mpq_t r;
@@ -180,12 +181,14 @@ ParsedValueReturn parse_number(Token *token, char*path) {
int err = mpq_set_decimal_str_exp(r, token->value);
if (err) {
free(parsedValue);
return (ParsedValueReturn){
create_err(token->length, token->column, token->length, path, "Parsing Error", "Unable to parse number"),
NULL
};
mpq_clear(r);
return (ParsedValueReturn){create_err(token->line, token->column,
token->length, path, "Parsing Error",
"Unable to parse number"),
NULL};
}
char *s = mpq_get_str(NULL, 62, r);
parsedValue->data = strdup(s);
mpq_clear(r);
parsedValue->data = s;
return (ParsedValueReturn){no_err, parsedValue};
}