Browse Source

Merge branch 'ls/mailinfo'

* ls/mailinfo:
  git-mailinfo: use strbuf's instead of fixed buffers
  Add some useful functions for strbuf manipulation.
  Make some strbuf_*() struct strbuf arguments const.

Conflicts:
	builtin-mailinfo.c
maint
Junio C Hamano 17 years ago
parent
commit
0513f241cc
  1. 749
      builtin-mailinfo.c
  2. 72
      strbuf.c
  3. 12
      strbuf.h

749
builtin-mailinfo.c

File diff suppressed because it is too large Load Diff

72
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,7 +79,65 @@ void strbuf_rtrim(struct strbuf *sb)
sb->buf[sb->len] = '\0'; sb->buf[sb->len] = '\0';
} }


int strbuf_cmp(struct strbuf *a, struct strbuf *b) 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 cmp; int cmp;
if (a->len < b->len) { if (a->len < b->len) {

12
strbuf.h

@ -61,7 +61,7 @@ static inline void strbuf_swap(struct strbuf *a, struct strbuf *b) {
} }


/*----- strbuf size related -----*/ /*----- strbuf size related -----*/
static inline size_t strbuf_avail(struct strbuf *sb) { static inline size_t strbuf_avail(const struct strbuf *sb) {
return sb->alloc ? sb->alloc - sb->len - 1 : 0; return sb->alloc ? sb->alloc - sb->len - 1 : 0;
} }


@ -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 int strbuf_cmp(struct strbuf *, struct strbuf *); extern void strbuf_ltrim(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) {
@ -98,7 +104,7 @@ extern void strbuf_add(struct strbuf *, const void *, size_t);
static inline void strbuf_addstr(struct strbuf *sb, const char *s) { static inline void strbuf_addstr(struct strbuf *sb, const char *s) {
strbuf_add(sb, s, strlen(s)); strbuf_add(sb, s, strlen(s));
} }
static inline void strbuf_addbuf(struct strbuf *sb, struct strbuf *sb2) { static inline void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2) {
strbuf_add(sb, sb2->buf, sb2->len); strbuf_add(sb, sb2->buf, sb2->len);
} }
extern void strbuf_adddup(struct strbuf *sb, size_t pos, size_t len); extern void strbuf_adddup(struct strbuf *sb, size_t pos, size_t len);

Loading…
Cancel
Save