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>
This commit is contained in:
parent
9b200fd68c
commit
eacd6dc594
70
strbuf.c
70
strbuf.c
@ -60,6 +60,18 @@ void strbuf_grow(struct strbuf *sb, size_t extra)
|
|||||||
ALLOC_GROW(sb->buf, sb->len + extra + 1, sb->alloc);
|
ALLOC_GROW(sb->buf, sb->len + extra + 1, sb->alloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void strbuf_trim(struct strbuf *sb)
|
||||||
|
{
|
||||||
|
char *b = sb->buf;
|
||||||
|
while (sb->len > 0 && isspace((unsigned char)sb->buf[sb->len - 1]))
|
||||||
|
sb->len--;
|
||||||
|
while (sb->len > 0 && isspace(*b)) {
|
||||||
|
b++;
|
||||||
|
sb->len--;
|
||||||
|
}
|
||||||
|
memmove(sb->buf, b, sb->len);
|
||||||
|
sb->buf[sb->len] = '\0';
|
||||||
|
}
|
||||||
void strbuf_rtrim(struct strbuf *sb)
|
void strbuf_rtrim(struct strbuf *sb)
|
||||||
{
|
{
|
||||||
while (sb->len > 0 && isspace((unsigned char)sb->buf[sb->len - 1]))
|
while (sb->len > 0 && isspace((unsigned char)sb->buf[sb->len - 1]))
|
||||||
@ -67,6 +79,64 @@ void strbuf_rtrim(struct strbuf *sb)
|
|||||||
sb->buf[sb->len] = '\0';
|
sb->buf[sb->len] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void strbuf_ltrim(struct strbuf *sb)
|
||||||
|
{
|
||||||
|
char *b = sb->buf;
|
||||||
|
while (sb->len > 0 && isspace(*b)) {
|
||||||
|
b++;
|
||||||
|
sb->len--;
|
||||||
|
}
|
||||||
|
memmove(sb->buf, b, sb->len);
|
||||||
|
sb->buf[sb->len] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
void strbuf_tolower(struct strbuf *sb)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < sb->len; i++)
|
||||||
|
sb->buf[i] = tolower(sb->buf[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct strbuf **strbuf_split(const struct strbuf *sb, int delim)
|
||||||
|
{
|
||||||
|
int alloc = 2, pos = 0;
|
||||||
|
char *n, *p;
|
||||||
|
struct strbuf **ret;
|
||||||
|
struct strbuf *t;
|
||||||
|
|
||||||
|
ret = xcalloc(alloc, sizeof(struct strbuf *));
|
||||||
|
p = n = sb->buf;
|
||||||
|
while (n < sb->buf + sb->len) {
|
||||||
|
int len;
|
||||||
|
n = memchr(n, delim, sb->len - (n - sb->buf));
|
||||||
|
if (pos + 1 >= alloc) {
|
||||||
|
alloc = alloc * 2;
|
||||||
|
ret = xrealloc(ret, sizeof(struct strbuf *) * alloc);
|
||||||
|
}
|
||||||
|
if (!n)
|
||||||
|
n = sb->buf + sb->len - 1;
|
||||||
|
len = n - p + 1;
|
||||||
|
t = xmalloc(sizeof(struct strbuf));
|
||||||
|
strbuf_init(t, len);
|
||||||
|
strbuf_add(t, p, len);
|
||||||
|
ret[pos] = t;
|
||||||
|
ret[++pos] = NULL;
|
||||||
|
p = ++n;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void strbuf_list_free(struct strbuf **sbs)
|
||||||
|
{
|
||||||
|
struct strbuf **s = sbs;
|
||||||
|
|
||||||
|
while (*s) {
|
||||||
|
strbuf_release(*s);
|
||||||
|
free(*s++);
|
||||||
|
}
|
||||||
|
free(sbs);
|
||||||
|
}
|
||||||
|
|
||||||
int strbuf_cmp(const struct strbuf *a, const struct strbuf *b)
|
int strbuf_cmp(const struct strbuf *a, const struct strbuf *b)
|
||||||
{
|
{
|
||||||
int cmp;
|
int cmp;
|
||||||
|
6
strbuf.h
6
strbuf.h
@ -77,8 +77,14 @@ static inline void strbuf_setlen(struct strbuf *sb, size_t len) {
|
|||||||
#define strbuf_reset(sb) strbuf_setlen(sb, 0)
|
#define strbuf_reset(sb) strbuf_setlen(sb, 0)
|
||||||
|
|
||||||
/*----- content related -----*/
|
/*----- content related -----*/
|
||||||
|
extern void strbuf_trim(struct strbuf *);
|
||||||
extern void strbuf_rtrim(struct strbuf *);
|
extern void strbuf_rtrim(struct strbuf *);
|
||||||
|
extern void strbuf_ltrim(struct strbuf *);
|
||||||
extern int strbuf_cmp(const struct strbuf *, const struct strbuf *);
|
extern int strbuf_cmp(const struct strbuf *, const struct strbuf *);
|
||||||
|
extern void strbuf_tolower(struct strbuf *);
|
||||||
|
|
||||||
|
extern struct strbuf **strbuf_split(const struct strbuf *, int delim);
|
||||||
|
extern void strbuf_list_free(struct strbuf **);
|
||||||
|
|
||||||
/*----- add data in your buffer -----*/
|
/*----- add data in your buffer -----*/
|
||||||
static inline void strbuf_addch(struct strbuf *sb, int c) {
|
static inline void strbuf_addch(struct strbuf *sb, int c) {
|
||||||
|
Loading…
Reference in New Issue
Block a user