mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-24 04:25:06 +02:00
Cleanup
This commit is contained in:
parent
08bd333701
commit
132c745330
1 changed files with 29 additions and 14 deletions
25
runtime.c
25
runtime.c
|
@ -2617,9 +2617,22 @@ int str_is_bignum(str2int_errno errnum, char *c)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read a rational number from given string.
|
||||||
|
* @param data Thread data object for the caller.
|
||||||
|
* @param char* String to read
|
||||||
|
* @return double Return number as double, since cyclone does
|
||||||
|
* not support a rational number type at this time
|
||||||
|
*/
|
||||||
double string2rational(void *data, char *s)
|
double string2rational(void *data, char *s)
|
||||||
{
|
{
|
||||||
|
// Duplicate string so we can safely create separate strings
|
||||||
|
// for numerator and denominator
|
||||||
char *nom = _strdup(s);
|
char *nom = _strdup(s);
|
||||||
|
if (nom == NULL) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
char *denom = strchr(nom, '/');
|
char *denom = strchr(nom, '/');
|
||||||
if (denom == NULL) {
|
if (denom == NULL) {
|
||||||
// Should never happen since we check for '/' elsewhere
|
// Should never happen since we check for '/' elsewhere
|
||||||
|
@ -2627,19 +2640,21 @@ double string2rational(void *data, char *s)
|
||||||
}
|
}
|
||||||
denom[0] = '\0';
|
denom[0] = '\0';
|
||||||
denom++;
|
denom++;
|
||||||
// TODO: clean this up
|
|
||||||
// TODO: check return values from strtol
|
// Parse both rational components as bignums since
|
||||||
// double x = strtol(nom, NULL, 10);
|
// that code handles any integer
|
||||||
// double y = strtol(denom, NULL, 10);
|
|
||||||
alloc_bignum(data, bn_nom);
|
alloc_bignum(data, bn_nom);
|
||||||
if (MP_OKAY != mp_read_radix(&(bignum_value(bn_nom)), nom, 10)) {
|
if (MP_OKAY != mp_read_radix(&(bignum_value(bn_nom)), nom, 10)) {
|
||||||
Cyc_rt_raise2(data, "Error converting string to bignum", nom);
|
Cyc_rt_raise2(data, "Error converting string to bignum", nom);
|
||||||
}
|
}
|
||||||
double x = mp_get_double(&bignum_value(bn_nom));
|
|
||||||
alloc_bignum(data, bn_denom);
|
alloc_bignum(data, bn_denom);
|
||||||
if (MP_OKAY != mp_read_radix(&(bignum_value(bn_denom)), denom, 10)) {
|
if (MP_OKAY != mp_read_radix(&(bignum_value(bn_denom)), denom, 10)) {
|
||||||
Cyc_rt_raise2(data, "Error converting string to bignum", denom);
|
Cyc_rt_raise2(data, "Error converting string to bignum", denom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compute final result as double
|
||||||
|
double x = mp_get_double(&bignum_value(bn_nom));
|
||||||
double y = mp_get_double(&bignum_value(bn_denom));
|
double y = mp_get_double(&bignum_value(bn_denom));
|
||||||
return x / y;
|
return x / y;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue