diff --git a/src/common/strbuf.c b/src/common/strbuf.c index 6ca618d..0d3a1dd 100644 --- a/src/common/strbuf.c +++ b/src/common/strbuf.c @@ -12,6 +12,7 @@ #include #include "xalloc.h" #include "strbuf.h" +#include "debug.h" #define CHNK_SIZE 128 @@ -91,6 +92,20 @@ void strbuf_append_ch(strbuf_t *s, char ch) { s->buf[s->len] = '\0'; } +void strbuf_rchop(strbuf_t *s, char ch) { + + int i; + + for(i=s->len-1; i >= 0; i--) { + + if (s->buf[i] == ch) { + s->buf[i] = '\0'; + s->len = i; + break; + } + } +} + void strbuf_term(strbuf_t *s, char ch) { if (s->buf[s->len-1] != ch) diff --git a/src/common/strbuf.h b/src/common/strbuf.h index 4db0c88..d92f0e9 100644 --- a/src/common/strbuf.h +++ b/src/common/strbuf.h @@ -39,6 +39,8 @@ void strbuf_append_str(strbuf_t *s, const char *str); void strbuf_append_ch(strbuf_t *s, char ch); +void strbuf_rchop(strbuf_t *s, char ch); + void strbuf_term(strbuf_t *s, char ch); void strbuf_trim(strbuf_t *s); diff --git a/test/t_strbuf.c b/test/t_strbuf.c index ca41893..2139623 100644 --- a/test/t_strbuf.c +++ b/test/t_strbuf.c @@ -42,6 +42,29 @@ void test_squeeze() { strbuf_free(&b); } +void test_chop() { + + strbuf_t b = STRBUF_INIT; + + strbuf_rchop(&b, 'X'); + print_strbuf(&b); + + strbuf_append_str(&b, "X"); + + strbuf_rchop(&b, 'X'); + print_strbuf(&b); + + strbuf_append_str(&b, "123456789X123456789"); + + strbuf_rchop(&b, 'X'); + print_strbuf(&b); + + strbuf_rchop(&b, 'X'); + print_strbuf(&b); + + strbuf_free(&b); +} + void test_term() { strbuf_t b = STRBUF_INIT; @@ -109,6 +132,8 @@ int main() { test_squeeze(); test_term(); + + test_chop(); return 0; }