fix other mandelbrot variants
[mu.git] / tools / termbox / bytebuffer.inl
blobaae8f073720f9c6ea4f09f6edba1691feb8be39c
1 struct bytebuffer {
2   char *buf;
3   int len;
4   int cap;
5 };
7 static void bytebuffer_reserve(struct bytebuffer *b, int cap) {
8   if (b->cap >= cap) {
9     return;
10   }
12   // prefer doubling capacity
13   if (b->cap * 2 >= cap) {
14     cap = b->cap * 2;
15   }
17   char *newbuf = malloc(cap);
18   if (b->len > 0) {
19     // copy what was there, b->len > 0 assumes b->buf != null
20     memcpy(newbuf, b->buf, b->len);
21   }
22   if (b->buf) {
23     // in case there was an allocated buffer, free it
24     free(b->buf);
25   }
26   b->buf = newbuf;
27   b->cap = cap;
30 static void bytebuffer_init(struct bytebuffer *b, int cap) {
31   b->cap = 0;
32   b->len = 0;
33   b->buf = 0;
35   if (cap > 0) {
36     b->cap = cap;
37     b->buf = malloc(cap); // just assume malloc works always
38   }
41 static void bytebuffer_free(struct bytebuffer *b) {
42   if (b->buf)
43     free(b->buf);
46 static void bytebuffer_clear(struct bytebuffer *b) {
47   b->len = 0;
50 static void bytebuffer_append(struct bytebuffer *b, const char *data, int len) {
51   bytebuffer_reserve(b, b->len + len);
52   memcpy(b->buf + b->len, data, len);
53   b->len += len;
56 static void bytebuffer_puts(struct bytebuffer *b, const char *str) {
57   bytebuffer_append(b, str, strlen(str));
60 static void bytebuffer_resize(struct bytebuffer *b, int len) {
61   bytebuffer_reserve(b, len);
62   b->len = len;
65 static void bytebuffer_flush(struct bytebuffer *b, int fd) {
66   int yyy = write(fd, b->buf, b->len);
67   (void) yyy;
68   bytebuffer_clear(b);
71 static void bytebuffer_truncate(struct bytebuffer *b, int n) {
72   if (n <= 0)
73     return;
74   if (n > b->len)
75     n = b->len;
76   const int nmove = b->len - n;
77   memmove(b->buf, b->buf+n, nmove);
78   b->len -= n;