forked from joefutrelle/rmutt
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgstr.c
81 lines (71 loc) · 1.57 KB
/
gstr.c
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
70
71
72
73
74
75
76
77
78
79
80
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "gstr.h"
#define GROW_BY 128
GSTR *gstr_new(char *d) {
GSTR *g = (GSTR *) malloc(sizeof(GSTR));
g->size = 0;
g->len = 0;
g->buf = NULL;
gstr_append(g, d);
return g;
}
void gstr_appendn(GSTR *g, char *b, size_t len) {
if (!b)
return;
if (!g->buf) {
g->buf = malloc(len);
g->size = len;
g->len = len;
strncpy(g->buf, b, len);
} else {
if (g->size < g->len + len + 1) {
g->buf = realloc(g->buf, (g->size = g->len + len + GROW_BY));
}
strncpy(g->buf + g->len, b, len);
g->len += len;
}
}
void gstr_append(GSTR *g, char *d) {
size_t len;
if (!d)
return;
len = strlen(d);
if (!g->buf) {
g->buf = strdup(d);
g->size = len + 1;
g->len = len;
} else {
if (g->size < g->len + len + 1) {
g->buf = realloc(g->buf, (g->size = g->len + len + GROW_BY));
}
strcpy(g->buf + g->len, d);
g->len += len;
}
}
void gstr_appendc(GSTR *g, char c) {
char cs[2];
cs[0] = c;
cs[1] = '\0';
gstr_append(g, cs);
}
char *gstr_detach(GSTR *g) {
char *result;
result = realloc(g->buf, g->len + 1);
free(g);
return result;
}
char *gstr_cat(char *a, char *b) {
GSTR *g = gstr_new(a);
gstr_append(g, b);
return gstr_detach(g);
}
/* concatenate and free */
char *gstr_catf(char *a, char *b) {
GSTR *g = gstr_new(a);
gstr_append(g, b);
return gstr_detach(g);
free(a);
free(b);
}