summaryrefslogtreecommitdiff
path: root/userland/libc/tb/sb.c
blob: 0d0ec525c6631fcd408997e2851e21a09e5d0e25 (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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <tb/sb.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

void sb_init(struct sb *ctx) {
  ctx->string = malloc(512);
  ctx->length = 0;
  ctx->capacity = 512;
}

void sb_free(struct sb *ctx) {
  ctx->length = 0;
  ctx->capacity = 0;
  free(ctx->string);
  ctx->string = NULL;
}

void sb_reset(struct sb *ctx) {
  ctx->length = 0;
}

int sb_isempty(const struct sb *ctx) {
  return (0 == ctx->length);
}

void sb_append_char(struct sb *ctx, char c) {
  if (1 > ctx->capacity - ctx->length) {
    ctx->capacity += 32;
    ctx->string = realloc(ctx->string, ctx->capacity);
  }
  memcpy(ctx->string + ctx->length, &c, 1);
  ctx->length++;
}

int sb_delete_right(struct sb *ctx, int n) {
  n = min(n, ctx->length);
  ctx->length -= n;
  return n;
}

void sb_append(struct sb *ctx, const char *s) {
  size_t l = strlen(s);
  if (l > ctx->capacity - ctx->length) {
    ctx->capacity += l;
    ctx->string = realloc(ctx->string, ctx->capacity);
  }
  memcpy(ctx->string + ctx->length, s, l);
  ctx->length += l;
}

void sb_prepend_sv(struct sb *ctx, struct sv sv) {
  if (sv.length > ctx->capacity - ctx->length) {
    ctx->capacity += sv.length;
    ctx->string = realloc(ctx->string, ctx->capacity);
  }
  memmove(ctx->string + sv.length, ctx->string, ctx->length);
  memcpy(ctx->string, sv.s, sv.length);
  ctx->length += sv.length;
}

void sb_append_sv(struct sb *ctx, struct sv sv) {
  if (sv.length > ctx->capacity - ctx->length) {
    ctx->capacity += sv.length;
    ctx->string = realloc(ctx->string, ctx->capacity);
  }
  memcpy(ctx->string + ctx->length, sv.s, sv.length);
  ctx->length += sv.length;
}