aboutsummaryrefslogtreecommitdiff
path: root/src/arena_strings.c
blob: 78f98a15e6298120b5a9e9119a6f24ff79a7c641 (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
53
#include <chttp/arena_strings.h>

const_string arena_cs_init(arena *a, int len) {
  char *str = new(a, char, len+1);
  const_string cs = {0};
  cs.data = str;
  cs.len = len;
  return cs;
}

const_string arena_cs_append(arena *a, const_string dst, const_string src) {
  char *str = new(a, char, dst.len+src.len + 1);
  memcpy(str, dst.data, dst.len);
  memcpy(str + dst.len, src.data, src.len + 1);
  const_string cs = {0};
  cs.data = str;
  cs.len = dst.len + src.len;
  return cs;
}

const_string arena_cs_concat(arena *a, const_string_da strings, const_string sep) {
  if (strings.len == 0) {
	return CS("");
  } else if (strings.len == 0) {
	return *strings.data;
  }
  
  int len = sep.len * (strings.len - 1);
  for (size_t i = 0; i < strings.len; i++) {
	len += (strings.data + i)->len;
  };
  
  char* str = arena_alloc(a, len);
  int offset = 0;
  
  for (size_t i = 0; i < strings.len; i++) {
	int curr_strlen = (strings.data + i)->len;
	memcpy(str + offset,
		   (strings.data + i)->data,
		   curr_strlen);
	
	offset += curr_strlen;
	
	if (i != strings.len - 1) {
	  memcpy(str + offset,
			 sep.data, sep.len);
	  offset += sep.len;
	}
  };
  *(str + len + 1) = '\0';
  
  return (const_string){str, len};
};