Lines Matching +full:sign +full:-
2 * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
7 * http://www.apache.org/licenses/LICENSE-2.0
26 #include "ecmascript/ecma_string-inl.h"
29 #include "ecmascript/js_tagged_value-inl.h"
34 enum class Sign { NONE, NEG, POS }; enum
36 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
42 constexpr char CHARS[] = "0123456789abcdefghijklmnopqrstuvwxyz"; // NOLINT (modernize-avoid-c-arra…
73 const CString NumberHelper::MINUS_INFINITY_STR = "-Infinity";
79 return c - '0'; in ToDigit()
82 return c - 'A' + DECIMAL; in ToDigit()
85 return c - 'a' + DECIMAL; in ToDigit()
102 if (common::utf_helper::ConvertRegionUtf8ToUtf16(*ptr, &c, end - *ptr, 1) <= 0) { in GotoNonspace()
109 *ptr += size; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic) in GotoNonspace()
114 static inline double SignedZero(Sign sign) in SignedZero() argument
116 return sign == Sign::NEG ? -0.0 : 0.0; in SignedZero()
126 * This Function Translate from number 0-9 to number '0'-'9'
127 * number 10-35 to number 'a'-'z'
131 ASSERT(number < 36); // 36 == total number of '0'-'9' + 'a' -'z' in ToCharCode()
132 return number < 10 ? (number + 48): // 48 == '0'; 10: '0' - '9'; in ToCharCode()
133 (number - 10 + 97); // 97 == 'a'; 'a' - 'z' in ToCharCode()
144 return thread->GlobalConstants()->GetHandledZeroString().GetTaggedValue(); in Int32ToString()
146 JSHandle<SingleCharTable> singleCharTable(thread, thread->GetSingleCharTable()); in Int32ToString()
147 return singleCharTable->GetStringFromSingleCharTable(thread, ToCharCode(n)); in Int32ToString()
150 n = static_cast<uint32_t>(-number); in Int32ToString()
162 uint32_t index = length - 1; in Int32ToString()
168 index--; in Int32ToString()
172 buf[index] = '-'; in Int32ToString()
174 return thread->GetEcmaVM()->GetFactory()->NewFromUtf8(buf).GetTaggedValue(); in Int32ToString()
187 number = -number; in DoubleToString()
191 double fraction = number - integer; in DoubleToString()
195 double delta = HALF * (bit_cast<double>(value) - number); in DoubleToString()
203 fraction -= digit; in DoubleToString()
207 size_t fractionEnd = fractionCursor - 1; in DoubleToString()
209 for (; fractionEnd > HALF_BUFFER_SIZE; fractionEnd--) { in DoubleToString()
211 buffer[fractionEnd - 1] = Carry(buffer[fractionEnd - 1], radix); in DoubleToString()
223 size_t fractionEnd = fractionCursor - 1; in DoubleToString()
225 --fractionEnd; in DoubleToString()
233 buffer[--integerCursor] = '0'; in DoubleToString()
237 buffer[--integerCursor] = CHARS[static_cast<int>(remainder)]; in DoubleToString()
238 integer = (integer - remainder) / radix; in DoubleToString()
242 buffer[--integerCursor] = '-'; in DoubleToString()
246 size_t size = fractionCursor - integerCursor; in DoubleToString()
257 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); in DoubleToFixedString()
263 result += "-"; in DoubleToFixedString()
264 absValue = -valueNumber; in DoubleToFixedString()
279 zeroPrefixLen = -decimalPoint + 1; in DoubleToFixedString()
283 zeroPostfixLen = decimalPoint + digitNumber - length - zeroPrefixLen; in DoubleToFixedString()
295 return factory->NewFromASCII(result.c_str()).GetTaggedValue(); in DoubleToFixedString()
302 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); in DoubleToASCII()
303 return factory->NewFromASCII(buffer.c_str()).GetTaggedValue(); in DoubleToASCII()
307 … std::string& buf1, int buf1Size, int roundingMode, int *sign) in GetBaseForRoundingMode() argument
312 … int result = snprintf_s(&buf1[0], buf1Size, buf1Size - 1, "%+.*e", digitNumber - 1, valueNumber); in GetBaseForRoundingMode()
313 if (result == -1) { in GetBaseForRoundingMode()
320 *sign = (buf1[0] == '-'); in GetBaseForRoundingMode()
323 if (memcpy_s(&buf[1], digitNumber - 1, &buf1[POINT_INDEX], digitNumber - 1) != EOK) { in GetBaseForRoundingMode()
332 …CustomEcvtIsFixed(double &valueNumber, int &digits, int *decimalPoint, std::string& buf, int *sign) in CustomEcvtIsFixed() argument
340 …RoundingMode(valueNumber, digits, decimalPoint, buf, buffer, JS_DTOA_BUF_SIZE, FE_TONEAREST, sign); in CustomEcvtIsFixed()
342 while (digits >= MIN_RADIX && buf[digits - 1] == '0') { in CustomEcvtIsFixed()
343 digits--; in CustomEcvtIsFixed()
354 std::string& buf, bool isFixed, int *sign) in CustomEcvt() argument
359 CustomEcvtIsFixed(valueNumber, digits, decimalPoint, buf, sign); in CustomEcvt()
382 …RoundingMode(valueNumber, digits, decimalPoint, buf, buffer, JS_DTOA_BUF_SIZE, roundingMode, sign); in CustomEcvt()
392 if (result == -1) { in CustomFcvtHelper()
411 if (tmpbuf1[number - 1] == HALFCHAR) { in CustomFcvt()
415 if (tmpbuf1[0] == '-') { in CustomFcvt()
428 return DoubleToFixedString(thread, number, digit - 1); in DoubleToPrecisionString()
430 double positiveNumber = number > 0 ? number : -number; in DoubleToPrecisionString()
432 int radixDigit = digit - logDigit - 1; in DoubleToPrecisionString()
433 const int MIN_EXPONENT_DIGIT = -6; in DoubleToPrecisionString()
450 res += "-"; in DoubleToExponential()
451 number = -number; in DoubleToExponential()
457 base.erase(1, k - 1); in DoubleToExponential()
461 base += "e" + (n >= 1 ? std::string("+") : "") + std::to_string(n - 1); in DoubleToExponential()
465 … int result = snprintf_s(tmpbuf, sizeof(tmpbuf), sizeof(tmpbuf) - 1, "%.*e", digit - 1, number); in DoubleToExponential()
466 if (result == -1) { in DoubleToExponential()
473 …if (found != CString::npos && found < result.size() - 2 && result[found + 2] == '0') { // 2:offset… in DoubleToExponential()
478 while (--found > 0) { in DoubleToExponential()
484 found--; in DoubleToExponential()
486 if (found < end - 1) { in DoubleToExponential()
487 result.erase(found + 1, end - found - 1); in DoubleToExponential()
503 int sign = 0; in DoubleToASCIIWithFlag() local
507 int digitNumber = CustomEcvt(valueNumber, digits, &decimalPoint, buf1, fixed, &sign); in DoubleToASCIIWithFlag()
511 if (sign) { in DoubleToASCIIWithFlag()
512 tmpbuf += '-'; in DoubleToASCIIWithFlag()
519 for (i = 0; i < -number; i++) { in DoubleToASCIIWithFlag()
534 tmpbuf += std::string(number - digitNumber, '0'); in ToASCIIWithGreatThanZero()
539 tmpbuf += buf.substr(number, digitNumber - number); in ToASCIIWithGreatThanZero()
554 int p = n - 1; in ToASCIIWithNegative()
568 return JSTaggedValue(-0.0); in StringToNumber()
578 return JSTaggedValue(-0.0); in StringToNumber()
592 // 2. sign bit in StringToDoubleWithRadix()
593 if (*p == '-') { in StringToDoubleWithRadix()
659 result = -result; in StringToDoubleWithRadix()
666 int digit = static_cast<int>((current > '9') ? (current - 'a' + DECIMAL) : (current - '0')); in Carry()
667 digit = (digit == (radix - 1)) ? 0 : digit + 1; in Carry()
682 number = (number - remainder) / radix; in IntegerToString()
694 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); in IntToEcmaString()
695 return factory->NewFromASCII(ToCString(number)); in IntToEcmaString()
716 d = -d; in DoubleToCString()
733 --result; in DoubleToCString()
742 result -= (-n + prefixLen); in DoubleToCString()
745 for (int i = prefixLen; i < -n + prefixLen; ++i) { in DoubleToCString()
752 --result; in DoubleToCString()
761 auto expo = std::to_string(n - 1); in DoubleToCString()
768 --result; in DoubleToCString()
769 result[0] = '-'; in DoubleToCString()
778 …JSHandle<NumberToStringResultCache> cacheTable(thread->GetGlobalEnv()->GetNumberToStringResultCach… in NumberToString()
779 int entry = cacheTable->GetNumberHash(number); in NumberToString()
780 JSTaggedValue cacheResult = cacheTable->FindCachedResult(thread, entry, number); in NumberToString()
789 … resultJSHandle = JSHandle<EcmaString>::Cast(thread->GlobalConstants()->GetHandledZeroString()); in NumberToString()
794 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); in NumberToString()
795 … resultJSHandle = factory->NewFromASCIISkippingStringTable(DoubleToCString(number.GetDouble())); in NumberToString()
798 cacheTable->SetCachedResult(thread, entry, number, resultJSHandle); in NumberToString()
810 // -0 to +0 in TruncateDouble()
841 int len = end - start; in IsDigitalString()
852 int num = *start - '0'; in StringToInt()
853 for (int i = 1; i < (end - start); i++) { in StringToInt()
854 num = 10 * num + (*(start + i) - '0'); // 10 : 10 represents the base of the decimal system in StringToInt()
865 bool minus = (start[0] == '-'); in FastStringToNumber()
868 if (pos == (end - start)) { in FastStringToNumber()
872 // valid number's codes not longer than '9', except 'I' and non-breaking space. in FastStringToNumber()
876 …} else if ((end - (start + pos)) <= MAX_ELEMENT_INDEX_LEN && IsDigitalString((start + pos), end)) { in FastStringToNumber()
880 cache->SetInteger(num); in FastStringToNumber()
885 return {true, JSTaggedNumber(SignedZero(Sign::NEG))}; in FastStringToNumber()
887 num = -num; in FastStringToNumber()
902 // 2. get number sign in StringToDouble()
903 Sign sign = Sign::NONE; in StringToDouble() local
906 sign = Sign::POS; in StringToDouble()
907 } else if (*p == '-') { in StringToDouble()
909 sign = Sign::NEG; in StringToDouble()
914 static const char INF[] = "Infinity"; // NOLINT(modernize-avoid-c-arrays) in StringToDouble()
916 // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic) in StringToDouble()
926 return sign == Sign::NEG ? -POSITIVE_INFINITY : POSITIVE_INFINITY; in StringToDouble()
933 RETURN_IF_CONVERSION_END(++p, end, SignedZero(sign)); in StringToDouble()
936 return ignoreTrailing ? SignedZero(sign) : NAN_VALUE; in StringToDouble()
939 if (sign != Sign::NONE) { in StringToDouble()
946 return ignoreTrailing ? SignedZero(sign) : NAN_VALUE; in StringToDouble()
949 if (sign != Sign::NONE) { in StringToDouble()
956 return ignoreTrailing ? SignedZero(sign) : NAN_VALUE; in StringToDouble()
959 if (sign != Sign::NONE) { in StringToDouble()
975 RETURN_IF_CONVERSION_END(++p, end, SignedZero(sign)); in StringToDouble()
980 uint64_t numberMax = (UINT64_MAX - (radix - 1)) / radix; in StringToDouble()
1001 if (sign == Sign::NEG) { in StringToDouble()
1003 number = -0.0; in StringToDouble()
1005 number = -number; in StringToDouble()
1024 --exponent; in StringToDouble()
1037 // 9. parse 'e/E' with '+/-' in StringToDouble()
1045 if (*p == '+' || *p == '-') { in StringToDouble()
1061 exponent += (exponentSign == '-' ? -additionalExponent : additionalExponent); in StringToDouble()
1068 if (sign == Sign::NEG) { in StringToDouble()
1069 buffer += "-"; in StringToDouble()
1071 …for (uint8_t *i = pStart; i < pEnd; ++i) { // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithme… in StringToDouble()
1077 // 11. convert none-prefix radix string in StringToDouble()
1086 Sign sign = Sign::NONE; in Strtod() local
1088 uint64_t numberMax = (UINT64_MAX - (radix - 1)) / radix; in Strtod()
1090 if (*p == '-') { in Strtod()
1091 sign = Sign::NEG; in Strtod()
1111 int exponentAbs = exponent < 0 ? -exponent : exponent; in Strtod()
1119 return sign == Sign::NEG ? -result : result; in Strtod()
1126 …int exp = static_cast<int>((u64 & DOUBLE_EXPONENT_MASK) >> DOUBLE_SIGNIFICAND_SIZE) - DOUBLE_EXPON… in DoubleToInt()
1127 if (exp < static_cast<int>(bits - 1)) { in DoubleToInt()
1132 // Get low <bits> bits by shift left <64 - bits> and shift right <64 - bits> in DoubleToInt()
1134 … << (static_cast<uint32_t>(exp) - DOUBLE_SIGNIFICAND_SIZE + INT64_BITS - bits)) >> in DoubleToInt()
1135 (INT64_BITS - bits); in DoubleToInt()
1138 ret = -ret; in DoubleToInt()
1160 if (std::isnan(d) || d == -base::POSITIVE_INFINITY) { in SaturateTruncDoubleToInt32()
1168 auto strObj = static_cast<EcmaString *>(strVal->GetTaggedObject()); in StringToBigInt()
1182 // 2. get bigint sign in StringToBigInt()
1183 Sign sign = Sign::NONE; in StringToBigInt() local
1186 sign = Sign::POS; in StringToBigInt()
1187 } else if (*p == '-') { in StringToBigInt()
1189 sign = Sign::NEG; in StringToBigInt()
1203 if (sign != Sign::NONE) { in StringToBigInt()
1209 if (sign != Sign::NONE) { in StringToBigInt()
1215 if (sign != Sign::NONE) { in StringToBigInt()
1243 if (sign == Sign::NEG) { in StringToBigInt()
1244 return BigIntHelper::SetBigInt(thread, "-" + buffer, radix).GetTaggedValue(); in StringToBigInt()
1251 int result = snprintf_s(bufTmp, size, size - 1, "%+.*e", digits - 1, d); in GetBase()
1252 if (result == -1) { in GetBase()
1283 digits--; in GetMinmumDigits()
1314 // If the character string contains non-digit chaaracters in StringToInt64()
1341 thread->SetRandomStatePtr(&randomState_); in InitRandom()
1353 return base::bit_cast<double>(random) - 1; in ToDouble()
1359 return static_cast<int32_t>(val >> (INT64_BITS - bits)); in Next()