Update impl of DN_Str8Is

This commit is contained in:
2026-07-14 21:55:46 +10:00
parent b24e1b0eb8
commit 1e4ae8138e
4 changed files with 76 additions and 48 deletions
+30 -19
View File
@@ -3262,27 +3262,38 @@ DN_API DN_Str8x32 DN_Str8x32FromU64(DN_U64 val, char separator)
}
DN_API bool DN_Str8IsAll(DN_Str8 string, DN_Str8IsAllType is_all)
DN_API bool DN_Str8Is(DN_Str8 string, DN_Str8IsFlags flags)
{
bool result = string.count;
if (!result)
return result;
switch (is_all) {
case DN_Str8IsAllType_Digits: {
for (DN_USize index = 0; result && index < string.count; index++)
result = string.data[index] >= '0' && string.data[index] <= '9';
} break;
case DN_Str8IsAllType_Hex: {
DN_Str8 trimmed = DN_Str8TrimPrefix(string, DN_Str8Lit("0x"), DN_Str8EqCase_Insensitive);
for (DN_USize index = 0; result && index < trimmed.count; index++) {
char ch = trimmed.data[index];
result = (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F');
}
} break;
if (result && (flags & DN_Str8IsFlags_Digits)) {
for (DN_USize index = 0; result && index < string.count; index++)
result = string.data[index] >= '0' && string.data[index] <= '9';
}
if (result && (flags & DN_Str8IsFlags_Hex)) {
DN_Str8 trimmed = DN_Str8TrimPrefix(string, DN_Str8Lit("0x"), DN_Str8EqCase_Insensitive);
for (DN_USize index = 0; result && index < trimmed.count; index++) {
char ch = trimmed.data[index];
result = (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F');
}
}
if (result && (flags & DN_Str8IsFlags_Lowercase)) {
for (DN_USize index = 0; result && index < string.count; index++) {
if (string.data[index] >= 'A' && string.data[index] <= 'Z')
result = false;
}
}
if (result && (flags & DN_Str8IsFlags_Uppercase)) {
for (DN_USize index = 0; result && index < string.count; index++) {
if (string.data[index] >= 'a' && string.data[index] <= 'z')
result = false;
}
}
return result;
}
@@ -10930,28 +10941,28 @@ DN_API DN_TestCore DN_TestSuite(DN_Arena *arena_)
}
for (DN_TestScopeF(&result, "[Strings] Is all digits fails on non-digit string")) {
DN_B32 str_result = DN_Str8IsAll(DN_Str8Lit("@123string"), DN_Str8IsAllType_Digits);
DN_B32 str_result = DN_Str8Is(DN_Str8Lit("@123string"), DN_Str8IsFlags_Digits);
DN_TestVerifyExpr(&result, str_result == false);
}
for (DN_TestScopeF(&result, "[Strings] Is all digits fails on nullptr")) {
DN_B32 str_result = DN_Str8IsAll(DN_Str8FromPtr(nullptr, 0), DN_Str8IsAllType_Digits);
DN_B32 str_result = DN_Str8Is(DN_Str8FromPtr(nullptr, 0), DN_Str8IsFlags_Digits);
DN_TestVerifyExpr(&result, str_result == false);
}
for (DN_TestScopeF(&result, "[Strings] Is all digits fails on string w/ 0 size")) {
char const buf[] = "@123string";
DN_B32 str_result = DN_Str8IsAll(DN_Str8FromPtr(buf, 0), DN_Str8IsAllType_Digits);
DN_B32 str_result = DN_Str8Is(DN_Str8FromPtr(buf, 0), DN_Str8IsFlags_Digits);
DN_TestVerifyExpr(&result, !str_result);
}
for (DN_TestScopeF(&result, "[Strings] Is all digits success")) {
DN_B32 str_result = DN_Str8IsAll(DN_Str8Lit("23"), DN_Str8IsAllType_Digits);
DN_B32 str_result = DN_Str8Is(DN_Str8Lit("23"), DN_Str8IsFlags_Digits);
DN_TestVerifyExpr(&result, DN_Cast(bool) str_result == true);
}
for (DN_TestScopeF(&result, "[Strings] Is all digits fails on whitespace")) {
DN_B32 str_result = DN_Str8IsAll(DN_Str8Lit("23 "), DN_Str8IsAllType_Digits);
DN_B32 str_result = DN_Str8Is(DN_Str8Lit("23 "), DN_Str8IsFlags_Digits);
DN_TestVerifyExpr(&result, DN_Cast(bool) str_result == false);
}
+7 -4
View File
@@ -1399,10 +1399,13 @@ enum DN_Str8EqCase
DN_Str8EqCase_Insensitive,
};
enum DN_Str8IsAllType
typedef DN_U32 DN_Str8IsFlags;
enum DN_Str8IsFlags_
{
DN_Str8IsAllType_Digits,
DN_Str8IsAllType_Hex,
DN_Str8IsFlags_Digits = 1 << 0,
DN_Str8IsFlags_Hex = 1 << 1, // String consists of [0x|0X] + <[digit|A-F|a-f]...>
DN_Str8IsFlags_Lowercase = 1 << 2, // String is all lowercase characters (case-ness is only checked for ASCII, non-ASCII is permitted always)
DN_Str8IsFlags_Uppercase = 1 << 3, // String is all uppercase characters (case-ness is only checked for ASCII, non-ASCII is permitted always)
};
typedef struct DN_Str8BSplitResult DN_Str8BSplitResult;
@@ -3079,7 +3082,7 @@ DN_API void DN_Str8x1024AppendFmt
DN_API void DN_Str8x1024AppendFmtV (DN_Str8x1024 *str, DN_FMT_ATTRIB char const *fmt, va_list args);
DN_API DN_Str8x32 DN_Str8x32FromU64 (DN_U64 val, char separator);
DN_API bool DN_Str8IsAll (DN_Str8 string, DN_Str8IsAllType is_all);
DN_API bool DN_Str8Is (DN_Str8 string, DN_Str8IsFlags flags);
DN_API char * DN_Str8End (DN_Str8 string);
DN_API DN_Str8 DN_Str8Subset (DN_Str8 string, DN_USize offset, DN_USize count);
DN_API DN_Str8 DN_Str8Advance (DN_Str8 string, DN_USize amount);