power_play/src/base/base_string.h

161 lines
5.6 KiB
C

////////////////////////////////////////////////////////////
//~ Formatting types
#define DefaultFmtPrecision 3
#define IntChars ("0123456789abcdef")
Enum(FmtArgKind)
{
FmtArgKind_None,
/* Arbitrary magic numbers for argument validation */
FmtArgKind_Char = 0x0f5281df,
FmtArgKind_String = 0x0a5ffa9a,
FmtArgKind_Uint = 0x0746f19b,
FmtArgKind_Sint = 0x08603694,
FmtArgKind_Hex = 0x0a3d0792,
FmtArgKind_Ptr = 0x0c4519e4,
FmtArgKind_Float = 0x04814143,
FmtArgKind_Uid = 0x3d1cd407,
FmtArgKind_Handle = 0x6ead3bec,
FmtArgKind_End = 0x0ecbc5ae
};
Struct(FmtArg)
{
FmtArgKind kind;
u32 p; /* Precision */
u32 z; /* Z-fill */
union
{
u8 c;
String string;
u64 uint;
i64 sint;
void *ptr;
f64 f;
Uid uid;
struct
{
u64 h64[2];
} handle;
} value;
};
Struct(FmtArgArray)
{
u64 count;
FmtArg *args;
};
////////////////////////////////////////////////////////////
//~ Unicode types
Struct(CodepointIter)
{
u32 codepoint;
/* Internal */
String src;
u64 pos;
};
////////////////////////////////////////////////////////////
//~ Conversion helpers
String StringFromChar(Arena *arena, char c);
String StringFromU64(Arena *arena, u64 n, u64 base, u64 zfill);
String StringFromI64(Arena *arena, i64 n, u64 base, u64 zfill);
String StringFromPtr(Arena *arena, void *ptr);
String StringFromF64(Arena *arena, f64 f, u32 precision);
String StringFromhandle(Arena *arena, u64 v0, u64 v1);
String StringFromUid(Arena *arena, Uid uid);
////////////////////////////////////////////////////////////
//~ String helpers
String PushString(Arena *arena, String src);
String PushStringToBuff(String dst, String src);
String RepeatString(Arena *arena, String src, u64 count);
String CatString(Arena *arena, String str1, String str2);
StringArray SplitString(Arena *arena, String str, String delim);
String IndentString(Arena *arena, String str, u32 indent);
String LowerString(Arena *arena, String str);
b32 MatchString(String str1, String str2);
b32 StringContains(String str, String substring);
b32 StringBeginsWith(String str, String substring);
b32 StringEndsWith(String str, String substring);
////////////////////////////////////////////////////////////
//~ Trimming helpers
String TrimLeft(String s, String pattern);
String TrimRight(String s, String pattern);
String Trim(String s, String pattern);
String TrimWhitespace(String s);
////////////////////////////////////////////////////////////
//~ String list helpers
StringListNode *PushStringToList(Arena *arena, StringList *l, String s);
String StringFromList(Arena *arena, StringList l, String separator);
////////////////////////////////////////////////////////////
//~ Formatting
#define FMTARG(_kind, ...) ((FmtArg) { .kind = (_kind), .p = DefaultFmtPrecision, __VA_ARGS__ })
#define FmtChar(v, ...) FMTARG(FmtArgKind_Char, .value.c = (v), __VA_ARGS__)
#define FmtString(v, ...) FMTARG(FmtArgKind_String, .value.string = (v), __VA_ARGS__)
#define FmtUint(v, ...) FMTARG(FmtArgKind_Uint, .value.uint = (v), __VA_ARGS__)
#define FmtSint(v, ...) FMTARG(FmtArgKind_Sint, .value.sint = (v), __VA_ARGS__)
#define FmtHex(v, ...) FMTARG(FmtArgKind_Hex, .value.uint = (v), __VA_ARGS__)
#define FmtPtr(v, ...) FMTARG(FmtArgKind_Ptr, .value.ptr = (v), __VA_ARGS__)
#define FmtFloat(v, ...) FMTARG(FmtArgKind_Float, .value.f = (v), __VA_ARGS__)
#define FmtHandle(v, ...) FMTARG(FmtArgKind_Handle, .value.handle.h64[0] = (v).idx, .value.handle.h64[1] = (v).gen, __VA_ARGS__)
#define FmtUid(v, ...) FMTARG(FmtArgKind_Uid, .value.uid = (v), __VA_ARGS__)
#define FmtEnd FMTARG(FmtArgKind_End) /* Denotes end of VA list */
String FormatString(Arena *arena, String fmt, FmtArgArray args);
String StringF_(Arena *arena, String fmt, ...);
#define StringF(arena, lit, ...) StringF_((arena), Lit(lit), __VA_ARGS__, FmtEnd)
FmtArgArray FmtArgsFromVaList(Arena *arena, va_list vl);
////////////////////////////////////////////////////////////
//~ Unicode
//- Iter
CodepointIter InitCodepointIter(String str);
b32 NextCodepoint(CodepointIter *iter);
//- Decode string
String StringFromString16(Arena *arena, String16 str16);
String StringFromString32(Arena *arena, String32 str32);
//- Encode string
String16 String16FromString(Arena *arena, String str8);
String32 String32FromString(Arena *arena, String str8);
////////////////////////////////////////////////////////////
//~ Null-terminated strings
//- Narrow strings
u64 CstrLenNoLimit(char *cstr);
u64 CstrLen(char *cstr, u64 limit);
char *CstrFromString(Arena *arena, String src);
char *CstrFromStringToBuff(String dest_buff, String src);
String StringFromCstrNoLimit(char *cstr);
String StringFromCstr(char *cstr, u64 limit);
//- Wide strings
u64 WstrLenNoLimit(wchar_t *wstr);
u64 WstrLen(wchar_t *wstr, u64 limit);
wchar_t *WstrFromString(Arena *arena, String src);
wchar_t *WstrFromString16(Arena *arena, String16 src);
String StringFromWstrNoLimit(Arena *arena, wchar_t *wstr);
String StringFromWstr(Arena *arena, wchar_t *wstr, u64 limit);
String16 String16FromWstrNoLimit(wchar_t *wstr);
String16 String16FromWstr(wchar_t *wstr, u64 limit);