From: <bi...@us...> - 2008-09-04 21:16:20
|
Revision: 3163 http://oorexx.svn.sourceforge.net/oorexx/?rev=3163&view=rev Author: bigrixx Date: 2008-09-04 21:16:27 +0000 (Thu, 04 Sep 2008) Log Message: ----------- Cleanup some 64-issues in power operator Modified Paths: -------------- main/trunk/interpreter/classes/NumberStringClass.cpp main/trunk/interpreter/classes/NumberStringMath.hpp main/trunk/interpreter/classes/NumberStringMath2.cpp Modified: main/trunk/interpreter/classes/NumberStringClass.cpp =================================================================== --- main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-04 20:41:26 UTC (rev 3162) +++ main/trunk/interpreter/classes/NumberStringClass.cpp 2008-09-04 21:16:27 UTC (rev 3163) @@ -255,7 +255,7 @@ carry = 0; /* assume rounding-up NOT necessary */ /*is number just flat out too big? */ - if ((( ExpValue + (int)LenValue - 1) > MAXNUM) || + if ((( ExpValue + (wholenumber_t)LenValue - 1) > MAXNUM) || (ExpValue < (-MAXNUM)) ) /* Yes, report Overflow error. */ { reportException(Error_Conversion_operator, this); @@ -263,10 +263,10 @@ ExpFactor = 0; /* number not eponential yet.. */ - temp = ExpValue + (int)LenValue - 1; /* get size of this number */ + temp = ExpValue + (wholenumber_t)LenValue - 1; /* get size of this number */ expstring[0] = '\0'; /* string vlaue of exp factor, Null */ /* is left of decimal > NumDigits or */ - if ((temp >= (int)createdDigits) || /* exponent twice numDigits */ + if ((temp >= (wholenumber_t)createdDigits) || /* exponent twice numDigits */ ((size_t)Numerics::abs(ExpValue) > (createdDigits*2)) ) { /* Yes, we need to go exponential. */ @@ -313,7 +313,7 @@ /* convert exponent value into string*/ sprintf(expstring, "E+%d", temp); } - temp = labs((int)temp); /* get positive exponent factor */ + temp = Numerics::abs(temp); /* get positive exponent factor */ } /* Now compute size of result string */ @@ -354,7 +354,7 @@ /* Yes, add in the negative sign. */ StringObj->putChar(charpos, ch_MINUS); } - temp = ExpValue + (int)LenValue; /* get the adjusted length. */ + temp = ExpValue + (wholenumber_t)LenValue; /* get the adjusted length. */ /* Since we may have carry from round*/ /* we'll fill in the number from the */ @@ -384,7 +384,7 @@ /* Start filling in digits */ /* from the back.... */ - for (numindex = (int)(LenValue-1);numindex >= 0 ;numindex-- ) + for (numindex = (wholenumber_t)(LenValue-1);numindex >= 0 ;numindex-- ) { /* are we carry from round? */ num = this->number[numindex]; /* working copy of this Digit. */ @@ -425,7 +425,7 @@ /* start filling in digits */ - for (numindex = (int)LenValue-1;numindex >= 0 ;numindex-- ) + for (numindex = (wholenumber_t)LenValue-1;numindex >= 0 ;numindex-- ) { num = this->number[numindex]; /* working copy of this Digit. */ num = num + ch_ZERO; /* now put the number as a character */ @@ -1821,7 +1821,7 @@ { int ExpSign; /* Exponent Sign */ - int ExpValue; /* Exponent Value */ + wholenumber_t ExpValue; /* Exponent Value */ size_t MaxDigits; /* Maximum number size */ char ch; /* current character */ char MSDigit = 0; /* Most Significant digit truncated */ @@ -2140,7 +2140,7 @@ // to make them zero based, and B) portable numeric-to-ascii routines // don't really exist for the various 32/64 bit values. char buffer[32]; - int index = sizeof(buffer); + size_t index = sizeof(buffer); while (integer > 0) { @@ -2174,7 +2174,7 @@ // to make them zero based, and B) portable numeric-to-ascii routines // don't really exist for the various 32/64 bit values. char buffer[32]; - int index = sizeof(buffer); + size_t index = sizeof(buffer); while (integer > 0) { Modified: main/trunk/interpreter/classes/NumberStringMath.hpp =================================================================== --- main/trunk/interpreter/classes/NumberStringMath.hpp 2008-09-04 20:41:26 UTC (rev 3162) +++ main/trunk/interpreter/classes/NumberStringMath.hpp 2008-09-04 21:16:27 UTC (rev 3163) @@ -88,6 +88,10 @@ #define ROUND true /* Perform rounding */ #define NOROUND false /* no Rounding */ +// these are used for masking the power bits +#define HIBIT (~SSIZE_MAX) +#define LOWBITS (SSIZE_MAX) + /* temporary buffer allocation */ #define buffer_alloc(s) (new_buffer(s)->getData()) /* define the digits limit for "fast path" processing */ Modified: main/trunk/interpreter/classes/NumberStringMath2.cpp =================================================================== --- main/trunk/interpreter/classes/NumberStringMath2.cpp 2008-09-04 20:41:26 UTC (rev 3162) +++ main/trunk/interpreter/classes/NumberStringMath2.cpp 2008-09-04 21:16:27 UTC (rev 3163) @@ -305,8 +305,8 @@ RexxNumberString *result; char *Num1, *Num2; char *resultPtr, *Output, *rightPtr, *leftPtr, *SaveLeftPtr, *SaveRightPtr; - int multiplier, rc; - int DivChar, thisDigit; + wholenumber_t multiplier, rc; + wholenumber_t DivChar, thisDigit; wholenumber_t CalcExp; size_t NumberDigits, totalDigits, resultDigits; @@ -346,7 +346,7 @@ right = other->checkNumber(NumberDigits + 1, NOROUND); CalcExp = left->exp - right->exp; /* compute the new exponents */ /* calculate expected resultant exp */ - CalcExp += (int)left->length - (int)right->length; + CalcExp += (wholenumber_t)left->length - (wholenumber_t)right->length; /* is exp < 0 and doing // or % */ if (CalcExp < 0 && DivOP != OT_DIVIDE) { @@ -472,7 +472,7 @@ if (SaveLeft->length == SaveRight->length) { /* yes, then compare two numbers */ - rc = memcmp(Num1, Num2, (unsigned int)SaveLeft->length); + rc = memcmp(Num1, Num2, SaveLeft->length); if (rc < 0) /* is Num1(left) smaller? */ { break; /* yes, break out of inner loop. */ @@ -691,7 +691,7 @@ RexxNumberStringBase *AccumObj; RexxNumberString *left; RexxNumberString *result; - unsigned int NumBits; + size_t NumBits; size_t AccumLen; NegativePower = false; /* Initialize the flags. */ @@ -740,7 +740,7 @@ reportException(Error_Overflow_overflow, this, (RexxObject *)OREF_POWER, PowerObj); } /* Will the result overflow ? */ - if (labs((int)(left->exp + left->length - 1)) * powerValue > MAXNUM) + if (labs((wholenumber_t)(left->exp + left->length - 1)) * powerValue > MAXNUM) { /* yes, report error and return. */ reportException(Error_Overflow_overflow, this, (RexxObject *)OREF_POWER, PowerObj); @@ -785,7 +785,7 @@ NumBits = LONGBITS; /* Get total number of bits in long */ /* Find first non-zero left most bit */ - while (!((unsigned int)powerValue & 0x80000000u)) + while (!((size_t)powerValue & HIBIT)) { powerValue <<= 1; /* bit is zero shift bits 1 to left */ NumBits--; /* one less bit. */ @@ -793,11 +793,11 @@ /* turn off this 1st 1-bit, already */ /* taken care of. Skip 1st Multiply */ - powerValue = (int) ((unsigned int)powerValue & 0x7fffffffu); + powerValue = (wholenumber_t) ((size_t)powerValue & LOWBITS); while (NumBits--) { /* while 1-bits remain in power. */ - if ((unsigned int) powerValue & 0x80000000u) + if ((size_t) powerValue & HIBIT) { /* is left most bit a 1? */ /* yes, we need to multiply number by*/ /* Acummulator. */ @@ -909,7 +909,7 @@ resultPtr--; /* Backup Result Ptr, for next digit */ } /* go do next digit. */ /* Get length of computed number. */ - AccumLen = (unsigned int)(++resultPtr - AccumPtr) + right->length; + AccumLen = (size_t)(++resultPtr - AccumPtr) + right->length; /* AccumPtr now points to result, and*/ /* the len of result is in AccumLen */ @@ -973,7 +973,7 @@ /* fill the rest of data with Zero */ memset(leftPtr + 1, '\0', totalDigits - 1); /* calculate expected resultant exp */ - CalcExp = -Accum->exp - (int)Accum->length + 1; + CalcExp = -Accum->exp - (wholenumber_t)Accum->length + 1; Num1 = leftPtr; /* Num1 will be left digit pointer. */ Num2 = AccumPtr; /* Num2 is our input digit pointer */ @@ -1026,7 +1026,7 @@ if (left->length == Accum->length) { /* yes, then compare the two numbers */ - rc = memcmp(Num1, Num2, (unsigned int)left->length); + rc = memcmp(Num1, Num2, left->length); if (rc < 0) /* is Num1(left) smaller? */ { break; /* yes, break out of inner loop. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |