Add some useful functions for strbuf manipulation.
Signed-off-by: Lukas Sandström <lukass@etek.chalmers.se> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Lukas Sandström committed
Jul 13, 2008 at 20:29 UTC
eacd6dc59411964cc025ba8a9897faa1fb1e6bc6
2 files changed
+76
strbuf.c
+70
@@ -60,6 +60,18 @@ void strbuf_grow(struct strbuf *sb, size_t extra)
60
ALLOC_GROW(sb->buf, sb->len + extra + 1, sb->alloc);
61
}
62
63
+void strbuf_trim(struct strbuf *sb)
64
+{
65
+ char *b = sb->buf;
66
+ while (sb->len > 0 && isspace((unsigned char)sb->buf[sb->len - 1]))
67
+ sb->len--;
68
+ while (sb->len > 0 && isspace(*b)) {
69
+ b++;
70
+ sb->len--;
71
+ }
72
+ memmove(sb->buf, b, sb->len);
73
+ sb->buf[sb->len] = '\0';
74
+}
75
void strbuf_rtrim(struct strbuf *sb)
76
{
77
while (sb->len > 0 && isspace((unsigned char)sb->buf[sb->len - 1]))
@@ -67,6 +79,64 @@ void strbuf_rtrim(struct strbuf *sb)
79
sb->buf[sb->len] = '\0';
80
}
81
82
+void strbuf_ltrim(struct strbuf *sb)
83
+{
84
+ char *b = sb->buf;
85
+ while (sb->len > 0 && isspace(*b)) {
86
+ b++;
87
+ sb->len--;
88
+ }
89
+ memmove(sb->buf, b, sb->len);
90
+ sb->buf[sb->len] = '\0';
91
+}
92
+
93
+void strbuf_tolower(struct strbuf *sb)
94
+{
95
+ int i;
96
+ for (i = 0; i < sb->len; i++)
97
+ sb->buf[i] = tolower(sb->buf[i]);
98
+}
99
+
100
+struct strbuf **strbuf_split(const struct strbuf *sb, int delim)
101
+{
102
+ int alloc = 2, pos = 0;
103
+ char *n, *p;
104
+ struct strbuf **ret;
105
+ struct strbuf *t;
106
+
107
+ ret = xcalloc(alloc, sizeof(struct strbuf *));
108
+ p = n = sb->buf;
109
+ while (n < sb->buf + sb->len) {
110
+ int len;
111
+ n = memchr(n, delim, sb->len - (n - sb->buf));
112
+ if (pos + 1 >= alloc) {
113
+ alloc = alloc * 2;
114
+ ret = xrealloc(ret, sizeof(struct strbuf *) * alloc);
115
+ }
116
+ if (!n)
117
+ n = sb->buf + sb->len - 1;
118
+ len = n - p + 1;
119
+ t = xmalloc(sizeof(struct strbuf));
120
+ strbuf_init(t, len);
121
+ strbuf_add(t, p, len);
122
+ ret[pos] = t;
123
+ ret[++pos] = NULL;
124
+ p = ++n;
125
+ }
126
+ return ret;
127
+}
128
+
129
+void strbuf_list_free(struct strbuf **sbs)
130
+{
131
+ struct strbuf **s = sbs;
132
+
133
+ while (*s) {
134
+ strbuf_release(*s);
135
+ free(*s++);
136
+ }
137
+ free(sbs);
138
+}
139
+
140
int strbuf_cmp(const struct strbuf *a, const struct strbuf *b)
141
{
142
int cmp;
strbuf.h
+6
@@ -77,8 +77,14 @@ static inline void strbuf_setlen(struct strbuf *sb, size_t len) {
77
#define strbuf_reset(sb) strbuf_setlen(sb, 0)
78
79
/*----- content related -----*/
80
+extern void strbuf_trim(struct strbuf *);
81
extern void strbuf_rtrim(struct strbuf *);
82
+extern void strbuf_ltrim(struct strbuf *);
83
extern int strbuf_cmp(const struct strbuf *, const struct strbuf *);
84
+extern void strbuf_tolower(struct strbuf *);
85
+
86
+extern struct strbuf **strbuf_split(const struct strbuf *, int delim);
87
+extern void strbuf_list_free(struct strbuf **);
88
89
/*----- add data in your buffer -----*/
90
static inline void strbuf_addch(struct strbuf *sb, int c) {