@matheusbsbs / matheus-bagliano / commits / eacd6dc594
Fork 0

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) {