diff --git a/Single-Header/dn_single_header.cpp b/Single-Header/dn_single_header.cpp index f482fed..126172c 100644 --- a/Single-Header/dn_single_header.cpp +++ b/Single-Header/dn_single_header.cpp @@ -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) // #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; 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; } @@ -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")) { - 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); } diff --git a/Single-Header/dn_single_header.h b/Single-Header/dn_single_header.h index c0fe5b2..f24f32a 100644 --- a/Single-Header/dn_single_header.h +++ b/Single-Header/dn_single_header.h @@ -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) #define DN_H @@ -1401,10 +1401,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; @@ -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 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); diff --git a/Source/dn.cpp b/Source/dn.cpp index 1983ae8..2604a3e 100644 --- a/Source/dn.cpp +++ b/Source/dn.cpp @@ -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); } diff --git a/Source/dn.h b/Source/dn.h index 3ec0be6..7bdf9f2 100644 --- a/Source/dn.h +++ b/Source/dn.h @@ -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);