73 #define string_forwarder(method)\ 74 RexxObject *RexxNumberString::##method(RexxObject *operand)\ 76 return (RexxObject *)this->stringValue()->##method(operand);\ 226 char expstring[17], num;
228 size_t createdDigits;
229 size_t MaxNumSize, LenValue;
241 if (this->
sign == 0 )
255 ExpValue = this->
exp;
262 MaxNumSize = LenValue;
276 for (numindex=0; (size_t)numindex < LenValue; numindex++)
280 StringObj->
putChar(charpos++, num);
343 strcpy(expstring,
"E+");
354 MaxNumSize = (size_t)ExpValue + LenValue;
366 MaxNumSize = LenValue + 1;
372 MaxNumSize += strlen(expstring);
396 charpos = MaxNumSize - strlen(expstring);
401 StringObj->
put(charpos, expstring, strlen(expstring));
418 for (numindex = (
wholenumber_t)(LenValue-1);numindex >= 0 ;numindex-- )
421 num = this->
number[numindex];
423 StringObj->
putChar(--charpos, num);
444 else if ((
size_t)temp >= LenValue)
459 for (numindex = (
wholenumber_t)LenValue-1;numindex >= 0 ;numindex-- )
461 num = this->
number[numindex];
463 StringObj->
putChar(--charpos, num);
471 for (numindex = (
wholenumber_t)LenValue - 1; numindex > temp - 1 ;numindex-- )
473 num = this->
number[numindex];
476 StringObj->
putChar(--charpos, num);
483 for (numindex = temp - 1; numindex >= 0; numindex-- )
485 num = this->
number[numindex];
487 StringObj->
putChar(--charpos, num);
540 if (length <= numDigits && numberExp >= 0)
567 result = carry ? 1 : 0;
619 if (length <= numDigits && numberExp >= 0)
645 result = carry ? 1 : 0;
717 size_t intNumber = 0;
719 for (
stringsize_t numpos = 1; numpos <= intlength; numpos++ )
722 size_t newNumber = (intNumber * 10) + (
size_t)*thisnum++;
725 if (newNumber < intNumber)
730 intNumber = newNumber;
737 size_t newNumber = intNumber + 1;
738 if (newNumber < intNumber)
742 intNumber = newNumber;
749 size_t exponentMultiplier = 1;
752 exponentMultiplier *= 10;
756 size_t newNumber = intNumber * exponentMultiplier;
760 if (newNumber < intNumber)
764 intNumber = newNumber;
768 if (intNumber >= maxValue)
791 uint64_t intNumber = 0;
793 for (
stringsize_t numpos = 1; numpos <= intlength; numpos++ )
796 uint64_t newNumber = (intNumber * 10) + (uint64_t)*thisnum++;
799 if (newNumber < intNumber)
804 intNumber = newNumber;
811 uint64_t newNumber = intNumber + 1;
812 if (newNumber < intNumber)
816 intNumber = newNumber;
823 uint64_t exponentMultiplier = 1;
826 exponentMultiplier *= 10;
831 uint64_t newNumber = intNumber * exponentMultiplier;
835 if (newNumber < intNumber)
839 intNumber = newNumber;
843 if (intNumber > maxValue)
860 numberExponent = this->
exp;
861 numberLength = this->
length;
867 if (this->
length > numDigits)
870 numberExponent += (this->
length - numDigits);
872 numberLength = numDigits;
876 if (*(this->
number + numberLength) >= 5)
883 if (numberExponent < 0)
888 char compareChar = 0;
898 if (decimalPos > numberLength)
906 const char *numberData;
907 if (decimalPos >= numberLength )
911 decimalPos = numberLength;
912 numberData = this->
number;
917 numberData = this->
number + numberLength + numberExponent;
920 for ( ; decimalPos > 0 ; decimalPos--)
923 if ( *numberData++ != compareChar)
952 if (length <= numDigits && numberExp >= 0)
960 if (intnum == ((uint64_t)INT64_MAX) + 1)
972 *result = ((int64_t)intnum) *
sign;
993 *result = carry ? 1 : 0;
1015 if (intnum == ((uint64_t)INT64_MAX) + 1)
1022 *result = INT64_MAX;
1027 *result = ((int64_t)intnum) *
sign;
1045 if (this->
sign == 0)
1058 if (length <= numDigits && numberExp >= 0)
1083 *result = carry ? 1 : 0;
1107 if (this->
sign == 0 )
1112 else if (!(this->
sign == 1 && this->
exp == 0 && this->
length == 1L && *(this->
number) == 1))
1130 if (this->
sign == 0 )
1157 const char *EndData;
1172 EndData = InPtr + length;
1195 if (ch < ch_ZERO || ch >
ch_NINE)
1208 if (InPtr >= EndData)
1218 if (InPtr >= EndData)
1235 if (InPtr >= EndData)
1241 if (toupper(*InPtr) ==
'E')
1243 if (++InPtr >= EndData)
1253 if (InPtr >= EndData)
1258 if (*InPtr < ch_ZERO || *InPtr >
ch_NINE)
1274 if (InPtr >= EndData)
1292 *outPtr++ = *number++ +
'0';
1309 size_t needed_digits)
1321 if (this->
sign == 0)
1323 if (needed_digits == 0)
1334 strcpy(resultPtr,
"0.");
1336 memset(resultPtr + 2,
'0', needed_digits);
1343 signValue = this->
sign;
1350 if (needed_digits != 0)
1352 size += needed_digits + 1;
1359 if (integer_digits > 0)
1361 size += integer_digits;
1362 if (needed_digits != 0)
1364 size += needed_digits + 1;
1369 if (needed_digits == 0)
1377 size = needed_digits + 2;
1382 size += needed_digits + 2;
1404 resultPtr += this->
length;
1406 memset(resultPtr,
'0', this->
exp);
1407 resultPtr += this->
exp;
1408 if (needed_digits != 0)
1412 memset(resultPtr,
'0', needed_digits);
1417 integer_digits = this->
length + this->
exp;
1418 if (integer_digits > 0)
1422 resultPtr += integer_digits;
1423 if (needed_digits != 0)
1431 needed_digits -= temp;
1432 if (needed_digits != 0)
1435 memset(resultPtr,
'0', needed_digits);
1445 strcpy(resultPtr,
"0.");
1448 memset(resultPtr,
'0', needed_digits);
1452 strcpy(resultPtr,
"0.");
1455 memset(resultPtr,
'0', -integer_digits);
1456 resultPtr += -integer_digits;
1457 needed_digits += integer_digits;
1463 needed_digits -= temp;
1464 if (needed_digits != 0)
1467 memset(resultPtr,
'0', needed_digits);
1502 if (this->
sign == 0)
1507 else if (this->
sign > 0)
1532 bool foundNonZero =
false;
1536 if (this->
number[lastDecimal--] != 0)
1538 foundNonZero =
true;
1557 if (integer_digits <= 0)
1566 this->
length = integer_digits;
1571 char *current = this->
number + integer_digits - 1;
1573 while (current >= this->
number)
1575 int ch = *current + 1;
1631 if (this->
sign == 0)
1636 else if (this->
sign < 0)
1661 bool foundNonZero =
false;
1665 if (this->
number[lastDecimal--] != 0)
1667 foundNonZero =
true;
1686 if (integer_digits <= 0)
1695 this->length = integer_digits;
1700 char *current = this->
number + integer_digits - 1;
1702 while (current >= this->
number)
1704 int ch = *current + 1;
1758 if (this->
sign == 0)
1786 if (integer_digits < 0)
1795 this->
length = integer_digits;
1800 char *current = this->
number + integer_digits;
1811 while (current >= this->
number)
1813 int ch = *current + 1;
1888 size_t exponentsize = 0;
1892 size_t leadingSpaces;
1893 size_t leadingZeros = 0;
1894 size_t leadingExpZeros = 0;
1895 size_t trailingZeros;
1899 bool defaultexpsize =
false;
1917 temp = (temp / 3) * 3;
1919 this->
exp = this->
exp - temp;
1925 exponentsize = strlen(exponent);
1926 if (mathexp == (
size_t)-1)
1928 mathexp = exponentsize;
1929 defaultexpsize =
true;
1931 if (exponentsize > mathexp)
1938 if (decimals == (
size_t)-1)
1942 decimals = -this->
exp;
1949 adjust = -this->
exp;
1950 if ((
size_t)adjust > decimals)
1952 adjust = adjust - decimals;
1954 this->
exp = this->
exp + adjust;
1973 temp = decimals - adjust;
1975 this->length = this->length - adjust;
1981 if (mathexp != 0 && expfactor != 0)
1983 this->
exp += expfactor;
1985 strcpy(exponent,
"0");
1986 exponentsize = strlen(exponent);
1989 temp = this->
exp + this->length - 1;
2001 temp = (temp / 3) * 3;
2004 this->
exp = this->
exp - temp;
2006 expfactor = expfactor + temp;
2010 exponentsize = strlen(exponent);
2012 if (mathexp == (
size_t)-1)
2014 mathexp = exponentsize;
2016 if (exponentsize > mathexp)
2026 if (integers == (
size_t)-1)
2048 reqIntegers = integers;
2049 if (this->
sign == -1)
2051 integers = integers - 1;
2084 leadingSpaces = integers - temp;
2088 leadingSpaces = integers - 1;
2090 size += leadingSpaces;
2092 if (this->
sign == -1)
2100 leadingZeros = -temp;
2101 size += leadingZeros;
2102 if (this->length > 0)
2107 if (leadingZeros + this->length < decimals)
2110 trailingZeros = decimals - (leadingZeros + this->
length);
2111 size += trailingZeros;
2122 trailingZeros = temp - this->
length;
2123 size += trailingZeros;
2126 size += decimals + 1;
2131 size += this->length + 1;
2133 trailingZeros = decimals - (this->length - temp);
2134 size += trailingZeros;
2137 this->length += trailingZeros;
2138 this->
exp -= trailingZeros;
2147 leadingExpZeros = mathexp - exponentsize;
2151 else if (mathexp > 0 && !defaultexpsize && temp > (
wholenumber_t)exptrigger)
2153 size += mathexp + 2;
2159 if (leadingSpaces != 0)
2162 memset(resultPtr,
' ', leadingSpaces);
2163 resultPtr += leadingSpaces;
2165 if (this->
sign == -1)
2172 strcpy(resultPtr,
"0.");
2174 if (leadingZeros != 0)
2177 memset(resultPtr,
'0', leadingZeros);
2178 resultPtr += leadingZeros;
2180 if (this->length > 0)
2184 resultPtr += this->
length;
2186 if (trailingZeros != 0)
2189 memset(resultPtr,
'0', trailingZeros);
2190 resultPtr += trailingZeros;
2197 resultPtr += this->
length;
2198 if (trailingZeros != 0)
2201 memset(resultPtr,
'0', trailingZeros);
2202 resultPtr += trailingZeros;
2207 memset(resultPtr,
'0', decimals);
2208 resultPtr += decimals;
2219 resultPtr += this->length - temp;
2223 memset(resultPtr,
'0', trailingZeros);
2224 resultPtr += trailingZeros;
2239 if (leadingExpZeros > 0)
2242 memset(resultPtr,
'0', leadingExpZeros);
2243 resultPtr += leadingExpZeros;
2246 memcpy(resultPtr, exponent, exponentsize);
2249 else if (mathexp > 0 && !defaultexpsize && temp > (
wholenumber_t)exptrigger)
2252 memset(resultPtr,
' ', mathexp + 2);
2253 resultPtr += mathexp;
2278 const char *EndData;
2280 size_t resultDigits;
2288 EndData = InPtr + _length;
2308 MaxDigits = resultDigits = _length;
2319 if (InPtr >= EndData)
2337 *OutPtr++ = (char)(*InPtr++ -
'0');
2344 if ((!MSDigit) && (InPtr < EndData))
2352 if (InPtr >= EndData)
2355 this->
length = (size_t) (resultDigits - MaxDigits);
2356 this->
exp = ExpValue;
2362 this->
length = (resultDigits - MaxDigits);
2363 this->
exp = ExpValue;
2368 if (InPtr >= EndData)
2372 if (MaxDigits == resultDigits || isZero)
2383 if (MaxDigits == resultDigits)
2392 if (InPtr >= EndData)
2411 *OutPtr++ = (char)(*InPtr++ -
'0');
2423 if (InPtr >= EndData)
2426 this->
length = (resultDigits - MaxDigits);
2427 this->
exp = ExpValue;
2440 this->
length = resultDigits - MaxDigits;
2445 if (InPtr >= EndData)
2452 this->
exp = ExpValue;
2454 if (toupper(*InPtr) ==
'E')
2474 ExpValue = ExpValue * 10 + ((*InPtr++) -
'0');
2484 this->
exp += (ExpValue * ExpSign);
2492 if (this->
sign == 0 || isZero)
2546 while (*current !=
'\0')
2572 size_t index =
sizeof(buffer);
2580 uint64_t working = (uint64_t)(-(integer + 1));
2587 int digit = (int)(working % 10);
2588 working = working / 10;
2590 buffer[--index] = digit;
2599 int digit = (int)(integer % 10);
2600 integer = integer / 10;
2602 buffer[--index] = digit;
2607 this->
length =
sizeof(buffer) - index;
2629 size_t index =
sizeof(buffer);
2634 int digit = (int)(integer % 10);
2635 integer = integer / 10;
2637 buffer[--index] = digit;
2641 this->
length =
sizeof(buffer) - index;
2783 size_t NumberDigits;
2806 if (this->
length > NumberDigits)
2810 if (rightNumber->
length > NumberDigits)
2815 if (this->
sign != rightNumber->
sign)
2818 return(this->sign < rightNumber->
sign) ? -1 : 1;
2820 if (rightNumber->
sign == 0)
2824 if (this->
sign == 0)
2826 return rightNumber->
sign;
2829 MinExp = (rightNumber->
exp < this->
exp)? rightNumber->
exp : this->exp;
2830 aLexp = this->exp - MinExp;
2831 aRexp = rightNumber->
exp - MinExp;
2832 aLlen = aLexp + this->length;
2833 aRlen = aRexp + rightNumber->
length;
2836 if (aLlen <= NumberDigits && aRlen <= NumberDigits)
2843 else if (aRlen > aLlen)
2854 return memcmp(this->
number, rightNumber->
number, this->length) * this->
sign;
2905 return rightNumber->
sign;
3147 return this->
Multiply(rightNumber);
3300 while ((InPtr >= this->
number) && carry)
3330 return this->
d2xD2c(_length,
false);
3340 return this->
d2xD2c(_length,
true);
3375 size_t CurrentDigits;
3376 size_t TargetLength;
3384 TargetLength = this->
length;
3386 if (this->
exp + this->
length > CurrentDigits)
3398 else if (this->
exp < 0)
3402 HexLength = -this->
exp;
3404 HighDigit = this->
number + CurrentDigits;
3406 while (HexLength -- && TempPtr <= HighDigit)
3411 if (TargetLength > CurrentDigits)
3414 if (TempPtr == HighDigit && *TempPtr < 5)
3432 TargetLength = this->
length + this->
exp;
3435 if (this->
sign < 0 && ResultSize == SIZE_MAX)
3440 if (ResultSize == SIZE_MAX)
3445 else if (
type ==
true)
3447 if (ResultSize * 2 < CurrentDigits)
3459 if (ResultSize < CurrentDigits)
3473 HighDigit = Accumulator - 1;
3476 while (TargetLength--)
3480 if (TargetLength != 0)
3490 TargetLength = this->
exp;
3491 while (TargetLength--)
3495 if (TargetLength != 0)
3502 HexLength = Accumulator - HighDigit;
3514 while (Scan > HighDigit)
3517 *Scan = (char)(*Scan ^ (
unsigned)0x0f);
3527 while (Scan > HighDigit)
3532 Scan = HighDigit + 1;
3536 if (ResultSize == SIZE_MAX)
3538 ResultSize = HexLength;
3543 if (ResultSize == SIZE_MAX)
3545 ResultSize = HexLength;
3549 ResultSize += ResultSize;
3552 if (ResultSize < HexLength)
3555 Scan += HexLength - ResultSize;
3556 HexLength = ResultSize;
3560 PadSize = ResultSize - HexLength;
3565 memset(Scan, PadChar, PadSize);
3628 void *RexxNumberString::operator
new(
size_t size,
size_t length)
3712 else if (
number == +HUGE_VAL)
3716 else if (
number == -HUGE_VAL)
3728 sprintf(doubleStr,
"%.*g", (
int)(precision + 2),
number);
3729 resultLen = strlen(doubleStr);
3733 result->
format(doubleStr, resultLen);