Code

store: Handle cname translation centrally.
[sysdb.git] / src / utils / strbuf.c
index df3ee4b236d7f41b716cec4ca6edb1f090086286..bc24fef5e54c19781c5cd4bef7c3a1036e897945 100644 (file)
@@ -105,6 +105,7 @@ sdb_strbuf_destroy(sdb_strbuf_t *strbuf)
 ssize_t
 sdb_strbuf_vappend(sdb_strbuf_t *strbuf, const char *fmt, va_list ap)
 {
+       va_list aq;
        int status;
 
        if ((! strbuf) || (! fmt))
@@ -116,21 +117,27 @@ sdb_strbuf_vappend(sdb_strbuf_t *strbuf, const char *fmt, va_list ap)
                if (strbuf_resize(strbuf))
                        return -1;
 
+       /* 'ap' is invalid after calling vsnprintf; thus copy before using it */
+       va_copy(aq, ap);
        status = vsnprintf(strbuf->string + strbuf->pos,
                        strbuf->size - strbuf->pos, fmt, ap);
 
-       if (status < 0)
+       if (status < 0) {
+               va_end(aq);
                return status;
+       }
 
        if ((size_t)status >= strbuf->size - strbuf->pos) {
                strbuf_resize(strbuf);
 
                /* reset string and try again */
                strbuf->string[strbuf->pos] = '\0';
-               return sdb_strbuf_vappend(strbuf, fmt, ap);
+               status = (int)sdb_strbuf_vappend(strbuf, fmt, aq);
        }
+       else
+               strbuf->pos += (size_t)status;
 
-       strbuf->pos += (size_t)status;
+       va_end(aq);
        return (ssize_t)status;
 } /* sdb_strbuf_vappend */
 
@@ -172,6 +179,24 @@ sdb_strbuf_sprintf(sdb_strbuf_t *strbuf, const char *fmt, ...)
        return status;
 } /* sdb_strbuf_sprintf */
 
+ssize_t
+sdb_strbuf_chomp(sdb_strbuf_t *strbuf)
+{
+       ssize_t ret = 0;
+
+       if (! strbuf)
+               return -1;
+
+       while ((strbuf->pos > 0)
+                       && (strbuf->string[strbuf->pos - 1] == '\n')) {
+               --strbuf->pos;
+               strbuf->string[strbuf->pos] = '\0';
+               ++ret;
+       }
+
+       return ret;
+} /* sdb_strbuf_chomp */
+
 const char *
 sdb_strbuf_string(sdb_strbuf_t *strbuf)
 {