1#pragma once
2
3#include <string.h>
4
5#include "globals.h"
6
7// No allocs, all inplace, so scoped to caller.
8// Don't use out of scope, unless using a custom allocator or you malloc outside
9
10typedef struct {
11 char *str;
12 u64 size;
13} string;
14
15inline string string_from_cstr(char *cstr) {
16 string s = {};
17 if (cstr) {
18 s.str = cstr;
19 s.size = (u32)strlen(cstr);
20 }
21 return s;
22}
23
24inline void string_trim(string *s) {
25 usize start = 0;
26 usize end = s->size;
27 while (start < end &&
28 (s->str[start] == ' ' || s->str[start] == '\t' ||
29 s->str[start] == '\r' || s->str[start] == '\n')) {
30 start++;
31 }
32 while (end > start &&
33 (s->str[end - 1] == ' ' || s->str[end - 1] == '\t' ||
34 s->str[end - 1] == '\r' || s->str[end - 1] == '\n')) {
35 end--;
36 }
37 s->str += start;
38 s->size = end - start;
39}
40
41inline bool string_starts_with(const string &s, const char *prefix) {
42 usize len = strlen(prefix);
43 if (s.size < len) {
44 return false;
45 }
46 return strncmp(s.str, prefix, len) == 0;
47}
48
49inline bool string_equals(string a, string b) {
50 if (a.size != b.size) {
51 return false;
52 }
53 for (u32 i = 0; i < a.size; ++i) {
54 if (a.str[i] != b.str[i]) {
55 return false;
56 }
57 }
58 return true;
59}