105 lines
3.1 KiB
C
105 lines
3.1 KiB
C
#pragma once
|
|
|
|
// =============================================================================
|
|
// String Types
|
|
|
|
typedef struct String8 String8;
|
|
struct String8
|
|
{
|
|
uint8* str;
|
|
uint64 size;
|
|
};
|
|
|
|
typedef struct String16 String16;
|
|
struct String16
|
|
{
|
|
uint16* str;
|
|
uint64 size;
|
|
};
|
|
|
|
typedef struct String32 String32;
|
|
struct String32
|
|
{
|
|
uint32* str;
|
|
uint64 size;
|
|
};
|
|
|
|
// =============================================================================
|
|
// String Matching Types
|
|
|
|
typedef uint32 StringMatchFlags;
|
|
enum
|
|
{
|
|
StringMatchFlag_CaseInsensitive = (1 << 0),
|
|
StringMatchFlag_RightSideSloppy = (1 << 1),
|
|
StringMatchFlag_SlashInsensitive = (1 << 2),
|
|
};
|
|
|
|
// =============================================================================
|
|
// Unicode decoding Types
|
|
|
|
typedef struct UnicodeDecode UnicodeDecode;
|
|
struct UnicodeDecode
|
|
{
|
|
uint32 increment;
|
|
uint32 codepoint;
|
|
};
|
|
|
|
// =============================================================================
|
|
// String conversions
|
|
|
|
internal bool32 char_is_upper(uint8 c);
|
|
internal bool32 char_is_lower(uint8 c);
|
|
internal bool32 char_is_slash(uint8 c);
|
|
internal uint8 lower_from_char(uint8 c);
|
|
internal uint8 upper_from_char(uint8 c);
|
|
internal uint8 correct_slash_from_char(uint8 c);
|
|
|
|
// =============================================================================
|
|
// String Length
|
|
|
|
internal uint64 cstring8_length(uint8* cstring);
|
|
internal uint64 cstring16_length(uint16* cstring);
|
|
internal uint64 cstring32_length(uint32* cstring);
|
|
|
|
// =============================================================================
|
|
// String Constructor
|
|
|
|
#define str8_literal(S) str8((uint8*)(S), sizeof(S) - 1)
|
|
|
|
#define str8_struct(S) str8((uint8*)(S), sizeof(*(S)))
|
|
|
|
internal String8 str8(uint8* str, uint64 size);
|
|
internal String8 str8_zero();
|
|
internal String16 str16(uint16* str, uint64 size);
|
|
internal String16 str16_zero();
|
|
internal String8 str8_cstring(const char* cstring);
|
|
internal String16 str16_cstring(uint16* cstring);
|
|
internal String32 str32_cstring(uint32* cstring);
|
|
|
|
// =============================================================================
|
|
// String Matching
|
|
|
|
internal bool32 str8_match(String8 a, String8 b, StringMatchFlags flags);
|
|
#define str8_matchi(a, b) str8_match(a, b, StringMatchFlag_CaseInsensitive)
|
|
|
|
// =============================================================================
|
|
// String Formatting & Copying
|
|
|
|
internal String8 str8_copy(Arena* arena, String8 in);
|
|
internal String8 str8fv(Arena* arena, char* fmt, va_list args);
|
|
|
|
// =============================================================================
|
|
// Unicode String Encode/Decode
|
|
|
|
internal UnicodeDecode utf8_decode(uint8* str, uint64 max);
|
|
internal UnicodeDecode utf16_decode(uint16* str, uint64 max);
|
|
internal uint32 utf8_encode(uint8* str, uint32 codepoint);
|
|
internal uint32 utf16_encode(uint16* str, uint32 codepoint);
|
|
|
|
// =============================================================================
|
|
// Unicode String Conversions
|
|
|
|
internal String8 str8_from_16(Arena* arena, String16 in);
|
|
internal String16 str16_from_8(Arena* arena, String8 in);
|