Skip to content

Commit 49fe3e7

Browse files
committed
Use comparison functions in value functions
1 parent 5f78df4 commit 49fe3e7

File tree

2 files changed

+10
-37
lines changed

2 files changed

+10
-37
lines changed

src/scratch/value_functions.cpp

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,7 @@ extern "C"
112112
case ValueType::Number:
113113
return value_isInf(v->numberValue);
114114
case ValueType::String:
115-
// TODO: Use a custom comparison function
116-
return utf8::utf16to8(std::u16string(v->stringValue->data)) == "Infinity";
115+
return string_compare_case_sensitive(v->stringValue, &INFINITY_STR) == 0;
117116
default:
118117
return false;
119118
}
@@ -126,8 +125,7 @@ extern "C"
126125
case ValueType::Number:
127126
return value_isNegativeInf(v->numberValue);
128127
case ValueType::String:
129-
// TODO: Use a custom comparison function
130-
return utf8::utf16to8(std::u16string(v->stringValue->data)) == "-Infinity";
128+
return string_compare_case_sensitive(v->stringValue, &NEGATIVE_INFINITY_STR) == 0;
131129
default:
132130
return false;
133131
}
@@ -140,8 +138,7 @@ extern "C"
140138
case ValueType::Number:
141139
return std::isnan(v->numberValue);
142140
case ValueType::String:
143-
// TODO: Use a custom comparison function
144-
return utf8::utf16to8(std::u16string(v->stringValue->data)) == "NaN";
141+
return string_compare_case_sensitive(v->stringValue, &NAN_STR) == 0;
145142
default:
146143
return false;
147144
}
@@ -459,10 +456,9 @@ extern "C"
459456
/*! Converts the given string to double. */
460457
double value_stringToDouble(const StringPtr *s)
461458
{
462-
// TODO: Use a custom comparison function
463-
if (utf8::utf16to8(std::u16string(s->data)) == "Infinity")
459+
if (string_compare_case_sensitive(s, &INFINITY_STR) == 0)
464460
return std::numeric_limits<double>::infinity();
465-
else if (utf8::utf16to8(std::u16string(s->data)) == "-Infinity")
461+
else if (string_compare_case_sensitive(s, &NEGATIVE_INFINITY_STR) == 0)
466462
return -std::numeric_limits<double>::infinity();
467463

468464
return value_stringToDoubleImpl(s->data, s->size);
@@ -471,9 +467,7 @@ extern "C"
471467
/*! Converts the given string to boolean. */
472468
bool value_stringToBool(const StringPtr *s)
473469
{
474-
// TODO: Use a custom comparison function
475-
return s->size != 0 && !value_u16StringsEqual(std::u16string(s->data), utf8::utf8to16(std::string("false"))) &&
476-
!value_u16StringsEqual(std::u16string(s->data), utf8::utf8to16(std::string("0")));
470+
return s->size != 0 && string_compare_case_insensitive(s, &FALSE_STR) != 0 && string_compare_case_insensitive(s, &ZERO_STR) != 0;
477471
}
478472

479473
/* operations */

src/scratch/value_functions_p.h

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ static const StringPtr FALSE_STR("false");
2626
static const StringPtr INFINITY_STR("Infinity");
2727
static const StringPtr NEGATIVE_INFINITY_STR("-Infinity");
2828
static const StringPtr NAN_STR("NaN");
29+
static const StringPtr ZERO_STR("0");
2930

3031
template<typename T>
3132
inline unsigned int value_intDigitCount(T v)
@@ -107,24 +108,6 @@ extern "C"
107108
return ret;
108109
}
109110

110-
inline bool value_u16StringsEqual(std::u16string s1, std::u16string s2)
111-
{
112-
// TODO: Rewrite this
113-
std::transform(s1.begin(), s1.end(), s1.begin(), ::tolower);
114-
std::transform(s2.begin(), s2.end(), s2.begin(), ::tolower);
115-
return (s1.compare(s2) == 0);
116-
}
117-
118-
inline bool value_stringsEqual(const char *s1, const char *s2)
119-
{
120-
// TODO: Remove this?
121-
std::string str1(s1);
122-
std::string str2(s2);
123-
std::transform(str1.begin(), str1.end(), str1.begin(), ::tolower);
124-
std::transform(str2.begin(), str2.end(), str2.begin(), ::tolower);
125-
return (str1.compare(str2) == 0);
126-
}
127-
128111
inline long value_hexToDec(const char16_t *s, int n, bool *ok)
129112
{
130113
if (ok)
@@ -349,12 +332,11 @@ extern "C"
349332
}
350333

351334
// Special values
352-
// TODO: Use a custom comparison function
353-
if (value_u16StringsEqual(std::u16string(s), utf8::utf8to16(std::string("Infinity")))) {
335+
if (string_compare_raw_case_sensitive(s, n, INFINITY_STR.data, INFINITY_STR.size) == 0) {
354336
if (ok)
355337
*ok = true;
356338
return std::numeric_limits<double>::infinity();
357-
} else if (value_u16StringsEqual(std::u16string(s), utf8::utf8to16(std::string("-Infinity")))) {
339+
} else if (string_compare_raw_case_sensitive(s, n, NEGATIVE_INFINITY_STR.data, NEGATIVE_INFINITY_STR.size) == 0) {
358340
if (ok)
359341
*ok = true;
360342
return -std::numeric_limits<double>::infinity();
@@ -500,12 +482,9 @@ extern "C"
500482
if (!ok) {
501483
// At least one argument can't be converted to a number
502484
// Scratch compares strings as case insensitive
503-
// TODO: Use a custom comparison function
504485
StringPtr *s1 = value_toStringPtr(v1);
505486
StringPtr *s2 = value_toStringPtr(v2);
506-
std::string str1 = utf8::utf16to8(std::u16string(s1->data));
507-
std::string str2 = utf8::utf16to8(std::u16string(s2->data));
508-
int ret = strcasecmp(str1.c_str(), str2.c_str());
487+
int ret = string_compare_case_insensitive(s1, s2);
509488
string_pool_free(s1);
510489
string_pool_free(s2);
511490
return ret;

0 commit comments

Comments
 (0)