27 #pragma warning (push)
28 #pragma warning (disable: 4514 4996)
33 return (juce_wchar) towupper ((wint_t) character);
38 return (juce_wchar) towlower ((wint_t) character);
44 return iswupper ((wint_t) character) != 0;
46 return toLowerCase (character) != character;
53 return iswlower ((wint_t) character) != 0;
55 return toUpperCase (character) != character;
66 return character ==
' ' || (character <= 13 && character >= 9);
71 return iswspace ((wint_t) character) != 0;
76 return (character >=
'0' && character <=
'9');
81 return iswdigit ((wint_t) character) != 0;
86 return (character >=
'a' && character <=
'z')
87 || (character >=
'A' && character <=
'Z');
92 return iswalpha ((wint_t) character) != 0;
97 return (character >=
'a' && character <=
'z')
98 || (character >=
'A' && character <=
'Z')
99 || (character >=
'0' && character <=
'9');
104 return iswalnum ((wint_t) character) != 0;
109 return (character >=
' ' && character <=
'~');
114 return iswprint ((wint_t) character) != 0;
119 auto d = (
unsigned int) (digit -
'0');
121 if (d < (
unsigned int) 10)
124 d += (
unsigned int) (
'0' -
'a');
126 if (d < (
unsigned int) 6)
129 d += (
unsigned int) (
'a' -
'A');
131 if (d < (
unsigned int) 6)
137 double CharacterFunctions::mulexp10 (
const double value,
int exponent) noexcept
145 const bool negative = (exponent < 0);
148 exponent = -exponent;
150 double result = 1.0, power = 10.0;
152 for (
int bit = 1; exponent != 0; bit <<= 1)
154 if ((exponent & bit) != 0)
166 return negative ? (value / result) : (value * result);
171 if (c < 0x80 || c >= 0xa0)
172 return (juce_wchar) c;
174 static const uint16 lookup[] = { 0x20AC, 0x0007, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
175 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0007, 0x017D, 0x0007,
176 0x0007, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
177 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0007, 0x017E, 0x0178 };
179 return (juce_wchar) lookup[c - 0x80];
188 #define STR(value) QUOTE(value)
189 #define ASYM_STRING_DOUBLE_PAIR(str, value) std::pair<String, double> (STR(str), value)
190 #define STRING_DOUBLE_PAIR(value) ASYM_STRING_DOUBLE_PAIR(value, value)
191 #define STRING_DOUBLE_PAIR_COMBOS(value) \
192 STRING_DOUBLE_PAIR(value), \
193 STRING_DOUBLE_PAIR(-value), \
194 ASYM_STRING_DOUBLE_PAIR(+value, value), \
195 ASYM_STRING_DOUBLE_PAIR(000000 ## value, value), \
196 ASYM_STRING_DOUBLE_PAIR(+000 ## value, value), \
197 ASYM_STRING_DOUBLE_PAIR(-0 ## value, -value)
199 class CharacterFunctionsTests :
public UnitTest
202 CharacterFunctionsTests()
203 :
UnitTest (
"CharacterFunctions", UnitTestCategories::text)
206 void runTest()
override
208 beginTest (
"readDoubleValue");
210 static const std::pair<String, double> testValues[] =
213 STRING_DOUBLE_PAIR_COMBOS (0),
214 STRING_DOUBLE_PAIR_COMBOS (3),
215 STRING_DOUBLE_PAIR_COMBOS (4931),
216 STRING_DOUBLE_PAIR_COMBOS (5000),
217 STRING_DOUBLE_PAIR_COMBOS (9862097),
220 STRING_DOUBLE_PAIR_COMBOS (7.000),
221 STRING_DOUBLE_PAIR_COMBOS (0.2),
222 STRING_DOUBLE_PAIR_COMBOS (.298630),
223 STRING_DOUBLE_PAIR_COMBOS (1.118),
224 STRING_DOUBLE_PAIR_COMBOS (0.9000),
225 STRING_DOUBLE_PAIR_COMBOS (0.0000001),
226 STRING_DOUBLE_PAIR_COMBOS (500.0000001),
227 STRING_DOUBLE_PAIR_COMBOS (9862098.2398604),
230 STRING_DOUBLE_PAIR_COMBOS (0e0),
231 STRING_DOUBLE_PAIR_COMBOS (0.e0),
232 STRING_DOUBLE_PAIR_COMBOS (0.00000e0),
233 STRING_DOUBLE_PAIR_COMBOS (.0e7),
234 STRING_DOUBLE_PAIR_COMBOS (0e-5),
235 STRING_DOUBLE_PAIR_COMBOS (2E0),
236 STRING_DOUBLE_PAIR_COMBOS (4.E0),
237 STRING_DOUBLE_PAIR_COMBOS (1.2000000E0),
238 STRING_DOUBLE_PAIR_COMBOS (1.2000000E6),
239 STRING_DOUBLE_PAIR_COMBOS (.398e3),
240 STRING_DOUBLE_PAIR_COMBOS (10e10),
241 STRING_DOUBLE_PAIR_COMBOS (1.4962e+2),
242 STRING_DOUBLE_PAIR_COMBOS (3198693.0973e4),
243 STRING_DOUBLE_PAIR_COMBOS (10973097.2087E-4),
244 STRING_DOUBLE_PAIR_COMBOS (1.3986e00006),
245 STRING_DOUBLE_PAIR_COMBOS (2087.3087e+00006),
246 STRING_DOUBLE_PAIR_COMBOS (6.0872e-00006),
250 STRING_DOUBLE_PAIR_COMBOS (17654321098765432.9),
251 STRING_DOUBLE_PAIR_COMBOS (183456789012345678.9),
252 STRING_DOUBLE_PAIR_COMBOS (1934567890123456789.9),
253 STRING_DOUBLE_PAIR_COMBOS (20345678901234567891.9),
254 STRING_DOUBLE_PAIR_COMBOS (10000000000000000303786028427003666890752.000000),
255 STRING_DOUBLE_PAIR_COMBOS (10000000000000000303786028427003666890752e3),
256 STRING_DOUBLE_PAIR_COMBOS (10000000000000000303786028427003666890752e100),
257 STRING_DOUBLE_PAIR_COMBOS (10000000000000000303786028427003666890752.000000e-5),
258 STRING_DOUBLE_PAIR_COMBOS (10000000000000000303786028427003666890752.000000e-40),
260 STRING_DOUBLE_PAIR_COMBOS (1.23456789012345678901234567890),
261 STRING_DOUBLE_PAIR_COMBOS (1.23456789012345678901234567890e-111)
265 , STRING_DOUBLE_PAIR (DBL_MAX),
266 STRING_DOUBLE_PAIR (-DBL_MAX),
267 STRING_DOUBLE_PAIR (DBL_MIN)
271 for (
auto trial : testValues)
273 auto charPtr = trial.first.getCharPointer();
278 String nans[] = {
"NaN",
"-nan",
"+NAN",
"1.0E1024",
"-1.0E-999",
"1.23456789012345678901234567890e123456789"};
280 for (
auto nan : nans)
282 auto charPtr = nan.getCharPointer();
288 String infs[] = {
"Inf",
"-inf",
"INF"};
290 for (
auto inf : infs)
292 auto charPtr = inf.getCharPointer();
299 static CharacterFunctionsTests characterFunctionsTests;
static juce_wchar toLowerCase(juce_wchar character) noexcept
static bool isDigit(char character) noexcept
static bool isLowerCase(juce_wchar character) noexcept
static bool isLetter(char character) noexcept
static double readDoubleValue(CharPointerType &text) noexcept
static int getHexDigitValue(juce_wchar digit) noexcept
static bool isWhitespace(char character) noexcept
static bool isLetterOrDigit(char character) noexcept
static juce_wchar toUpperCase(juce_wchar character) noexcept
static bool isUpperCase(juce_wchar character) noexcept
static bool isPrintable(char character) noexcept
static juce_wchar getUnicodeCharFromWindows1252Codepage(uint8 windows1252Char) noexcept