summaryrefslogtreecommitdiff
path: root/src/string.h
blob: a2e69c96c66841a1110247846868fc65bdf150cb (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
46
47
48
49
50
51
52
#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;

typedef struct {
       u64   start;
       u64     end;
       u64     max;
char const *string;
} strng_view_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);
// Append to strng, returns -1 if no space, new len otherwise
    i32   strng_app(strng_t *dest, strng_t const *source);
// Append char* to strng, returns -1 if no space, new len otherwise
    i32 strng_app_c(strng_t *dest, char const *source);
// Append sv to strng, returns -1 if no space, new len otherwise
    i32 strng_app_v(strng_t *dest, strng_view_t const *source);
   void strng_clear(strng_t *string);

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

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)