Code

utils strbuf: Advance buffer position in sdb_strbuf_read().
[sysdb.git] / src / utils / strbuf.c
index 993b086d0ef0adbcb060faf046cd7390f548e4bd..4d8fc8b91ba234df10edd8d15d552169bcbf9930 100644 (file)
@@ -34,6 +34,8 @@
 #include <stdarg.h>
 #include <string.h>
 
+#include <unistd.h>
+
 /*
  * private data structures
  */
@@ -233,6 +235,23 @@ sdb_strbuf_memcpy(sdb_strbuf_t *strbuf, const void *data, size_t n)
        return sdb_strbuf_memappend(strbuf, data, n);
 } /* sdb_strbuf_memcpy */
 
+ssize_t
+sdb_strbuf_read(sdb_strbuf_t *strbuf, int fd, size_t n)
+{
+       ssize_t ret;
+
+       if (! strbuf)
+               return -1;
+
+       if (strbuf_resize(strbuf, strbuf->pos + n + 1))
+               return -1;
+
+       ret = read(fd, strbuf->string + strbuf->pos, n);
+       if (ret > 0)
+               strbuf->pos += (size_t)ret;
+       return ret;
+} /* sdb_strbuf_read */
+
 ssize_t
 sdb_strbuf_chomp(sdb_strbuf_t *strbuf)
 {
@@ -254,6 +273,24 @@ sdb_strbuf_chomp(sdb_strbuf_t *strbuf)
        return ret;
 } /* sdb_strbuf_chomp */
 
+void
+sdb_strbuf_skip(sdb_strbuf_t *strbuf, size_t n)
+{
+       if ((! strbuf) || (! n))
+               return;
+
+       if (n >= strbuf->pos) {
+               strbuf->string[0] = '\0';
+               strbuf->pos = 0;
+               return;
+       }
+
+       assert(n < strbuf->pos);
+       memmove(strbuf->string, strbuf->string + n, strbuf->pos - n);
+       strbuf->pos -= n;
+       strbuf->string[strbuf->pos] = '\0';
+} /* sdb_strbuf_skip */
+
 const char *
 sdb_strbuf_string(sdb_strbuf_t *strbuf)
 {