added a few lines of code to stix_strtoint()
This commit is contained in:
parent
db2de5787d
commit
797fdc4c1f
@ -535,8 +535,9 @@ stix_oop_t stix_strtoint (stix_t* stix, const stix_ooch_t* str, stix_oow_t len,
|
|||||||
int neg = 0;
|
int neg = 0;
|
||||||
const stix_ooch_t* ptr, * start, * end;
|
const stix_ooch_t* ptr, * start, * end;
|
||||||
stix_oow_t w, v;
|
stix_oow_t w, v;
|
||||||
stix_oohw_t hw[64];
|
stix_oohw_t hw[64], * hwp = STIX_NULL;
|
||||||
stix_oow_t hwlen;
|
stix_oow_t hwlen, outlen;
|
||||||
|
stix_oop_t res;
|
||||||
|
|
||||||
STIX_ASSERT (radix >= 2 && radix <= 36);
|
STIX_ASSERT (radix >= 2 && radix <= 36);
|
||||||
|
|
||||||
@ -611,6 +612,22 @@ stix_oop_t stix_strtoint (stix_t* stix, const stix_ooch_t* str, stix_oow_t len,
|
|||||||
exp = exp_tab[radix];
|
exp = exp_tab[radix];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* bytes */
|
||||||
|
outlen = ((stix_oow_t)(end - str) * exp + 7) / 8;
|
||||||
|
/* number of stix_oohw_t */
|
||||||
|
outlen = (outlen + STIX_SIZEOF(stix_oohw_t) - 1) / STIX_SIZEOF(stix_oohw_t);
|
||||||
|
/* TODO: use a precomputed table for outlen instead of calculating here */
|
||||||
|
|
||||||
|
if (outlen > STIX_COUNTOF(hw))
|
||||||
|
{
|
||||||
|
hwp = stix_allocmem (stix, outlen * STIX_SIZEOF(stix_oohw_t));
|
||||||
|
if (!hwp) return STIX_NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hwp = hw;
|
||||||
|
}
|
||||||
|
|
||||||
w = 0;
|
w = 0;
|
||||||
bitcnt = 0;
|
bitcnt = 0;
|
||||||
ptr = end - 1;
|
ptr = end - 1;
|
||||||
@ -626,9 +643,7 @@ stix_oop_t stix_strtoint (stix_t* stix, const stix_ooch_t* str, stix_oow_t len,
|
|||||||
if (bitcnt >= STIX_OOHW_BITS)
|
if (bitcnt >= STIX_OOHW_BITS)
|
||||||
{
|
{
|
||||||
bitcnt -= STIX_OOHW_BITS;
|
bitcnt -= STIX_OOHW_BITS;
|
||||||
/* TODO: grow hw if it's full OR
|
hwp[hwlen++] = (stix_oohw_t)(w & STIX_LBMASK(stix_oow_t, STIX_OOHW_BITS));
|
||||||
* i can estimate how much will be needed based on ext. so preallocate the buffer for these bases */
|
|
||||||
hw[hwlen++] = (stix_oohw_t)(w & STIX_LBMASK(stix_oow_t, STIX_OOHW_BITS));
|
|
||||||
w >>= STIX_OOHW_BITS;
|
w >>= STIX_OOHW_BITS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -636,7 +651,7 @@ stix_oop_t stix_strtoint (stix_t* stix, const stix_ooch_t* str, stix_oow_t len,
|
|||||||
}
|
}
|
||||||
|
|
||||||
STIX_ASSERT (w <= STIX_TYPE_MAX(stix_oohw_t));
|
STIX_ASSERT (w <= STIX_TYPE_MAX(stix_oohw_t));
|
||||||
if (hwlen == 0 || w > 0) hw[hwlen++] = w;
|
if (hwlen == 0 || w > 0) hwp[hwlen++] = w;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -648,9 +663,16 @@ stix_oop_t stix_strtoint (stix_t* stix, const stix_ooch_t* str, stix_oow_t len,
|
|||||||
ptr = start;
|
ptr = start;
|
||||||
|
|
||||||
max_ndigits = 9; /* GET THIS */
|
max_ndigits = 9; /* GET THIS */
|
||||||
reqsize = (end - str) / max_ndigits + 1;
|
outlen = (end - str) / max_ndigits + 1;
|
||||||
if (reqsize > STIX_COUNTF(hw)) hwp = malloc (reqsize * STIX_SIZEOF(stix_oohw_t));
|
if (outlen > STIX_COUNTOF(hw))
|
||||||
|
{
|
||||||
|
hwp = stix_allocmem (stix, outlen * STIX_SIZEOF(stix_oohw_t));
|
||||||
|
if (!hwp) return STIX_NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hwp = hw;
|
||||||
|
}
|
||||||
multiplier = 1;
|
multiplier = 1;
|
||||||
for (i = 0; i < max_ndigits; i++) multiplier *= radix;
|
for (i = 0; i < max_ndigits; i++) multiplier *= radix;
|
||||||
|
|
||||||
@ -679,7 +701,7 @@ if (reqsize > STIX_COUNTF(hw)) hwp = malloc (reqsize * STIX_SIZEOF(stix_oohw_t))
|
|||||||
{
|
{
|
||||||
stix_oohw_t high, low;
|
stix_oohw_t high, low;
|
||||||
|
|
||||||
v = (stix_oow_t)hw[i] * multiplier;
|
v = (stix_oow_t)hwp[i] * multiplier;
|
||||||
high = (stix_oohw_t)(v >> STIX_OOHW_BITS);
|
high = (stix_oohw_t)(v >> STIX_OOHW_BITS);
|
||||||
low = (stix_oohw_t)(v /*& STIX_LBMASK(stix_oow_t, STIX_OOHW_BITS)*/);
|
low = (stix_oohw_t)(v /*& STIX_LBMASK(stix_oow_t, STIX_OOHW_BITS)*/);
|
||||||
|
|
||||||
@ -692,9 +714,9 @@ if (reqsize > STIX_COUNTF(hw)) hwp = malloc (reqsize * STIX_SIZEOF(stix_oohw_t))
|
|||||||
r2 = high + (low < r2);
|
r2 = high + (low < r2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
hw[i] = low;
|
hwp[i] = low;
|
||||||
}
|
}
|
||||||
if (r2) hw[hwlen++] = r2;
|
if (r2) hwp[hwlen++] = r2;
|
||||||
}
|
}
|
||||||
while (dg >= max_ndigits);
|
while (dg >= max_ndigits);
|
||||||
}
|
}
|
||||||
@ -702,15 +724,15 @@ if (reqsize > STIX_COUNTF(hw)) hwp = malloc (reqsize * STIX_SIZEOF(stix_oohw_t))
|
|||||||
{ int i;
|
{ int i;
|
||||||
for (i = hwlen; i > 0;)
|
for (i = hwlen; i > 0;)
|
||||||
{
|
{
|
||||||
printf ("%08x ", hw[--i]);
|
printf ("%08x ", hwp[--i]);
|
||||||
}
|
}
|
||||||
printf ("\n");
|
printf ("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hwlen == 1) return STIX_OOP_FROM_SMINT((stix_ooi_t)hw[0] * -neg);
|
if (hwlen == 1) return STIX_OOP_FROM_SMINT((stix_ooi_t)hwp[0] * -neg);
|
||||||
else if (hwlen == 2)
|
else if (hwlen == 2)
|
||||||
{
|
{
|
||||||
w = MAKE_WORD(hw[0], hw[1]);
|
w = MAKE_WORD(hwp[0], hwp[1]);
|
||||||
if (neg)
|
if (neg)
|
||||||
{
|
{
|
||||||
if (w <= STIX_SMINT_MAX + 1) return STIX_OOP_FROM_SMINT(-(stix_ooi_t)w);
|
if (w <= STIX_SMINT_MAX + 1) return STIX_OOP_FROM_SMINT(-(stix_ooi_t)w);
|
||||||
@ -721,9 +743,12 @@ printf ("\n");
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return stix_instantiate (stix, (neg? stix->_large_negative_integer: stix->_large_positive_integer), hw, hwlen);
|
res = stix_instantiate (stix, (neg? stix->_large_negative_integer: stix->_large_positive_integer), hwp, hwlen);
|
||||||
|
if (hwp && hw != hwp) stix_freemem (stix, hwp);
|
||||||
|
return res;
|
||||||
|
|
||||||
oops_einval:
|
oops_einval:
|
||||||
|
if (hwp && hw != hwp) stix_freemem (stix, hwp);
|
||||||
stix->errnum = STIX_EINVAL;
|
stix->errnum = STIX_EINVAL;
|
||||||
return STIX_NULL;
|
return STIX_NULL;
|
||||||
}
|
}
|
||||||
|
@ -476,7 +476,7 @@ stix_oow_t buflen;
|
|||||||
xxxlen = stix_countbcstr(xxx);
|
xxxlen = stix_countbcstr(xxx);
|
||||||
buflen = STIX_COUNTOF(buf);
|
buflen = STIX_COUNTOF(buf);
|
||||||
stix_utf8toucs (xxx, &xxxlen, buf, &buflen);
|
stix_utf8toucs (xxx, &xxxlen, buf, &buflen);
|
||||||
dump_object (stix, stix_strtoint (stix, buf, buflen, 10), "STRINT");
|
dump_object (stix, stix_strtoint (stix, buf, buflen, 16), "STRINT");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
stix_ooch_t x[] = { 'X', 't', 'r', 'i', 'n', 'g', '\0' };
|
stix_ooch_t x[] = { 'X', 't', 'r', 'i', 'n', 'g', '\0' };
|
||||||
|
Loading…
Reference in New Issue
Block a user