summaryrefslogtreecommitdiffstats
path: root/src/base/base_string.h
blob: 328cb5b0ef87d32a28101debe048f3788a797b4b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#ifndef BASE_STRING_H
#define BASE_STRING_H

// - str8
typedef struct String8  String8;
typedef struct String16 String16;
typedef struct String32 String32;

typedef struct String8Node  String8Node;
typedef struct String16Node String16Node;
typedef struct String32Node String32Node;

typedef struct String8List  String8List;
typedef struct String16List String16List;
typedef struct String32List String32List;

//- strings

struct String8
{
    u8 *data;
    u64 size;
};

struct String16
{
    u16 *data;
    u64  size;
};

struct String32
{
    u32 *data;
    u64  size;
};

//- nodes
struct String8Node
{
    String8Node *next;
    String8      value;
};

struct String16Node
{
    String16Node *next;
    String16      string;
};

struct String32Node
{
    String32Node *next;
    String32      value;
};

//- lists
struct String8List
{
    String8Node *first;
    String8Node *last;
    u64          count;
};

struct String16List
{
    String16Node *first;
    String16Node *last;
    u64           count;
};

struct String32List
{
    String32Node *first;
    String32Node *last;
    u64           count;
};

//- cstring
internal b32 cstring_is_alnum(u8 point);
internal b32 cstring_is_nil(u8 point);
internal b32 cstring_is_whitespace(u8 point);
internal b32 cstring_is_slash(u8 point);
internal b32 cstring_is_alpha(u8 point);
internal b32 cstring_is_digit(u8 point);
internal b32 cstring_is_newline(u8 point);
internal b32 cstring_is_match(u8 *a, u8 *b);

//- string8
internal u64           str8_skip_element(String8 *buffer, u64 start_pos, String8 *element);
internal u64           str8_find_element(String8 *buffer, u64 start_pos, String8 *element);
internal b32           str8_is_match(String8 a, String8 b);
internal void          str8_append_u8_element(String8 *buf, u8 c);
internal int           str8_append(String8 *a, String8 *b);
internal void          str8_trim_right();
internal String8       str8_chop_left(String8 buffer, u64 count);
internal String8       str8_chop_right(String8 buffer, u64 count);
internal String8       str8_zero();
internal void          str8_list_push_node(String8List *list, String8Node *node);

#if COMPILER_GCC
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
#endif


//-
ReadOnly global_variable String8  nil_str8  = {NULL, 0};
ReadOnly global_variable String16 nil_str16 = {NULL, 0};
ReadOnly global_variable String32 nil_str32 = {NULL, 0};

ReadOnly global_variable String8Node  nil_str8_node  = {NULL, {NULL}};
ReadOnly global_variable String16Node nil_str16_node = {NULL, {NULL}};
ReadOnly global_variable String32Node nil_str32_node = {NULL, {NULL}};


//- macros
#define PushString8(arena, count) String8 { (u8 *)(PushArrayZero(arena, u8, (count))), (u64)(count)}
#define PushString16(arena, count) String16 { (u16 *)(PushArrayZero(arena, u16, (count))), (u64)(count)}
#define PushString32(arena, count) String32 { (u32 *)(PushArrayZero(arena, u32, (count))), (u64)(count)}


#define ToString8(data)  String8  { (u8 *)(data),  (u64)(cstring8_length((u8 *)data) - 1)}
#define ToString16(data) String16 { (u16 *)(data), (u64)(sizeof(data) - 1)}
#define ToString32(data) String32 { (u32 *)(data), (u64)(sizeof(data) - 1)}

#define str8(buffer) ToString8(buffer)

#define ToString8Node(string)  String8Node  {&nil_str8_node, string}
#define ToString16Node(string) String16Node {&nil_str8_node, string}
#define ToString32Node(string) String32Node {&nil_str8_node, string}


#if COMPILER_GCC
#pragma GCC diagnostic pop
#endif


#define Str8Fmt    "%.*s"
#define Str8Arg(buffer) (u64)((buffer).size), (char *)(buffer).data

internal u64 cstring8_length(u8 *c);
internal u64 cstring16_length(u16 *c);
internal u64 cstring32_length(u32 *c);


#endif /* BASE_STRING_H */