summaryrefslogtreecommitdiff
path: root/src/string.h
blob: 999add83f05160dd17876398791b70bb42c2bcae (plain)
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
#pragma once

#include "common.h"
#include "smrt_arena.h"

#define STRNG_BASE_POS (sizeof(strng_t))

typedef struct {
    u64 alloc_size;
    u64 len;
} strng_t;

strng_t * strng_new(smrt_arena_t *arena, u64 size);
strng_t *strng_from(smrt_arena_t *arena, char const *c);
strng_t * strng_dup(smrt_arena_t *arena, strng_t const *src);
   char * strng_str(smrt_arena_t *arena, strng_t const *string);
    i32   strng_set(strng_t *string, char const *c);
   void strng_clear(strng_t *string);

#define STRNG_FMT(s) (i32)s->len, (char *)((u8*)s+STRNG_BASE_POS)

typedef struct {
       u64   start;
       u64     end;
       u64     max;
char const *string;
} strng_view_t;

static inline strng_view_t sv_from(strng_t *string) {
    return (strng_view_t){
        .string=(char*)((u8*)string+STRNG_BASE_POS),
        .start=0,
        .end=string->len,
        .max=string->len,
    };
}
strng_view_t sv_from_chars(char const* c);

void  sv_trim_left(strng_view_t *sv);
void sv_trim_right(strng_view_t *sv);
void       sv_trim(strng_view_t *sv);
void      sv_reset(strng_view_t *sv);

#define SV_FMT(sv) (i32)((sv)->end - (sv)->start), (char *)((u8*)((sv)->string) + (sv)->start)