Files
Juliet/Juliet/core/core_string.h
T

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);