From 03c830be75b986386b4a72938af1eca23d2f04aa Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 4 Oct 2010 22:20:54 +0200 Subject: [PATCH] common/strbuf.c: fixing up squeeze. --- src/common/strbuf.c | 18 ++++++++++-------- test/t_strbuf.c | 7 ++++++- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/common/strbuf.c b/src/common/strbuf.c index 0a64884..19d8e29 100644 --- a/src/common/strbuf.c +++ b/src/common/strbuf.c @@ -163,19 +163,21 @@ void strbuf_squeeze(strbuf_t *s, char ch) { size_t p; - if (s->len <= 1) - return; + for(p=s->len; p; p--) { - for(p=s->len-1; p; p--) { - - if (s->buf[p] != ch) + if (s->buf[p-1] != ch) continue; size_t np = p, of = 0; - for(; np && s->buf[np-1] == ch; np--) + for(; np-1 && s->buf[np-2] == ch; np--) of++; - for(s->len -= of; np <= s->len; np++) - s->buf[np] = s->buf[np + of]; + + if (of) { + + p = np; + for(s->len -= of; np <= s->len; np++) + s->buf[np] = s->buf[np + of]; + } } } diff --git a/test/t_strbuf.c b/test/t_strbuf.c index 2139623..5fde886 100644 --- a/test/t_strbuf.c +++ b/test/t_strbuf.c @@ -31,7 +31,7 @@ void test_squeeze() { strbuf_squeeze(&b, 'X'); - strbuf_append_str(&b, "aaabXXXcdefXXXXghijklXXmmmnopXXXXXqrstuXXvwxyXXzXX"); + strbuf_append_str(&b, "aaabXXXcdefXXXXghijklXXmmmnopXXXXXqrXstuXXvwxyXXzXX"); strbuf_squeeze(&b, 'X'); print_strbuf(&b); strbuf_free(&b); @@ -40,6 +40,11 @@ void test_squeeze() { strbuf_squeeze(&b, 'X'); print_strbuf(&b); strbuf_free(&b); + + strbuf_append_str(&b, "A"); + strbuf_squeeze(&b, 'X'); + print_strbuf(&b); + strbuf_free(&b); } void test_chop() {