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
+23 -12
View File
@@ -1,4 +1,4 @@
// Generated by the DN single header generator 2026-07-14 16:32:48 // Generated by the DN single header generator 2026-07-14 21:55:23
// DN: Single header generator commented out => #if defined(_CLANGD) // DN: Single header generator commented out => #if defined(_CLANGD)
// #define DN_WITH_TESTS 1 // #define DN_WITH_TESTS 1
@@ -3264,27 +3264,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; bool result = string.count;
if (!result) if (!result)
return result; return result;
switch (is_all) { if (result && (flags & DN_Str8IsFlags_Digits)) {
case DN_Str8IsAllType_Digits: {
for (DN_USize index = 0; result && index < string.count; index++) for (DN_USize index = 0; result && index < string.count; index++)
result = string.data[index] >= '0' && string.data[index] <= '9'; result = string.data[index] >= '0' && string.data[index] <= '9';
} break; }
case DN_Str8IsAllType_Hex: { if (result && (flags & DN_Str8IsFlags_Hex)) {
DN_Str8 trimmed = DN_Str8TrimPrefix(string, DN_Str8Lit("0x"), DN_Str8EqCase_Insensitive); DN_Str8 trimmed = DN_Str8TrimPrefix(string, DN_Str8Lit("0x"), DN_Str8EqCase_Insensitive);
for (DN_USize index = 0; result && index < trimmed.count; index++) { for (DN_USize index = 0; result && index < trimmed.count; index++) {
char ch = trimmed.data[index]; char ch = trimmed.data[index];
result = (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F'); result = (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F');
} }
} break;
} }
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; return result;
} }
@@ -10932,28 +10943,28 @@ DN_API DN_TestCore DN_TestSuite(DN_Arena *arena_)
} }
for (DN_TestScopeF(&result, "[Strings] Is all digits fails on non-digit string")) { 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); DN_TestVerifyExpr(&result, str_result == false);
} }
for (DN_TestScopeF(&result, "[Strings] Is all digits fails on nullptr")) { 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); DN_TestVerifyExpr(&result, str_result == false);
} }
for (DN_TestScopeF(&result, "[Strings] Is all digits fails on string w/ 0 size")) { for (DN_TestScopeF(&result, "[Strings] Is all digits fails on string w/ 0 size")) {
char const buf[] = "@123string"; 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); DN_TestVerifyExpr(&result, !str_result);
} }
for (DN_TestScopeF(&result, "[Strings] Is all digits success")) { 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); DN_TestVerifyExpr(&result, DN_Cast(bool) str_result == true);
} }
for (DN_TestScopeF(&result, "[Strings] Is all digits fails on whitespace")) { 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); DN_TestVerifyExpr(&result, DN_Cast(bool) str_result == false);
} }
+8 -5
View File
@@ -1,4 +1,4 @@
// Generated by the DN single header generator 2026-07-14 16:32:48 // Generated by the DN single header generator 2026-07-14 21:55:22
#if !defined(DN_H) #if !defined(DN_H)
#define DN_H #define DN_H
@@ -1401,10 +1401,13 @@ enum DN_Str8EqCase
DN_Str8EqCase_Insensitive, DN_Str8EqCase_Insensitive,
}; };
enum DN_Str8IsAllType typedef DN_U32 DN_Str8IsFlags;
enum DN_Str8IsFlags_
{ {
DN_Str8IsAllType_Digits, DN_Str8IsFlags_Digits = 1 << 0,
DN_Str8IsAllType_Hex, 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; typedef struct DN_Str8BSplitResult DN_Str8BSplitResult;
@@ -5009,7 +5012,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 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 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 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_Str8Subset (DN_Str8 string, DN_USize offset, DN_USize count);
DN_API DN_Str8 DN_Str8Advance (DN_Str8 string, DN_USize amount); DN_API DN_Str8 DN_Str8Advance (DN_Str8 string, DN_USize amount);
+22 -11
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; bool result = string.count;
if (!result) if (!result)
return result; return result;
switch (is_all) { if (result && (flags & DN_Str8IsFlags_Digits)) {
case DN_Str8IsAllType_Digits: {
for (DN_USize index = 0; result && index < string.count; index++) for (DN_USize index = 0; result && index < string.count; index++)
result = string.data[index] >= '0' && string.data[index] <= '9'; result = string.data[index] >= '0' && string.data[index] <= '9';
} break; }
case DN_Str8IsAllType_Hex: { if (result && (flags & DN_Str8IsFlags_Hex)) {
DN_Str8 trimmed = DN_Str8TrimPrefix(string, DN_Str8Lit("0x"), DN_Str8EqCase_Insensitive); DN_Str8 trimmed = DN_Str8TrimPrefix(string, DN_Str8Lit("0x"), DN_Str8EqCase_Insensitive);
for (DN_USize index = 0; result && index < trimmed.count; index++) { for (DN_USize index = 0; result && index < trimmed.count; index++) {
char ch = trimmed.data[index]; char ch = trimmed.data[index];
result = (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F'); result = (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F');
} }
} break;
} }
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; 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")) { 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); DN_TestVerifyExpr(&result, str_result == false);
} }
for (DN_TestScopeF(&result, "[Strings] Is all digits fails on nullptr")) { 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); DN_TestVerifyExpr(&result, str_result == false);
} }
for (DN_TestScopeF(&result, "[Strings] Is all digits fails on string w/ 0 size")) { for (DN_TestScopeF(&result, "[Strings] Is all digits fails on string w/ 0 size")) {
char const buf[] = "@123string"; 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); DN_TestVerifyExpr(&result, !str_result);
} }
for (DN_TestScopeF(&result, "[Strings] Is all digits success")) { 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); DN_TestVerifyExpr(&result, DN_Cast(bool) str_result == true);
} }
for (DN_TestScopeF(&result, "[Strings] Is all digits fails on whitespace")) { 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); DN_TestVerifyExpr(&result, DN_Cast(bool) str_result == false);
} }
+7 -4
View File
@@ -1399,10 +1399,13 @@ enum DN_Str8EqCase
DN_Str8EqCase_Insensitive, DN_Str8EqCase_Insensitive,
}; };
enum DN_Str8IsAllType typedef DN_U32 DN_Str8IsFlags;
enum DN_Str8IsFlags_
{ {
DN_Str8IsAllType_Digits, DN_Str8IsFlags_Digits = 1 << 0,
DN_Str8IsAllType_Hex, 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; 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 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 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 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_Str8Subset (DN_Str8 string, DN_USize offset, DN_USize count);
DN_API DN_Str8 DN_Str8Advance (DN_Str8 string, DN_USize amount); DN_API DN_Str8 DN_Str8Advance (DN_Str8 string, DN_USize amount);