]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: chunks: add chunk_strcat() and chunk_newstr()
authorWilly Tarreau <w@1wt.eu>
Mon, 4 Jan 2016 19:13:55 +0000 (20:13 +0100)
committerWilly Tarreau <w@1wt.eu>
Wed, 6 Jan 2016 12:53:37 +0000 (13:53 +0100)
These two new functions will make it easier to manipulate small strings
from within functions, because at many places, multiple short strings
are needed which do not deserve a malloc() nor a free(), and alloca()
is often discouraged. Since we already have trash chunks, it's convenient
to be able to allocate substrings from a chunk and use them later since
our functions already perform all the length checks. chunk_newstr() adds
a trailing zero at the end of a chunk and returns the pointer to the next
character, which can be used as an independant string. chunk_strcat()
does what it says.

include/common/chunk.h

index 00f0489113949ac540404d2b144741604ce3c490..35bf219da22323aa3be583ab0f4a89d8f3b935da 100644 (file)
@@ -102,6 +102,44 @@ static inline int chunk_strcpy(struct chunk *chk, const char *str)
        return 1;
 }
 
+/* appends str after <chk> followed by a trailing zero. Returns 0 in
+ * case of failure.
+ */
+static inline int chunk_strcat(struct chunk *chk, const char *str)
+{
+       size_t len;
+
+       len = strlen(str);
+
+       if (unlikely(chk->len + len >= chk->size))
+               return 0;
+
+       memcpy(chk->str + chk->len, str, len + 1);
+       chk->len += len;
+       return 1;
+}
+
+/* Adds a trailing zero to the current chunk and returns the pointer to the
+ * following part. The purpose is to be able to use a chunk as a series of
+ * short independant strings with chunk_* functions, which do not need to be
+ * released. Returns NULL if no space is available to ensure that the new
+ * string will have its own trailing zero. For example :
+ *   chunk_init(&trash);
+ *   pid = chunk_newstr(&trash);
+ *   chunk_appendf(&trash, "%d", getpid()));
+ *   name = chunk_newstr(&trash);
+ *   chunk_appendf(&trash, "%s", gethosname());
+ *   printf("hostname=<%s>, pid=<%d>\n", name, pid);
+ */
+static inline char *chunk_newstr(struct chunk *chk)
+{
+       if (chk->len + 1 >= chk->size)
+               return NULL;
+
+       chk->str[chk->len++] = 0;
+       return chk->str + chk->len;
+}
+
 static inline void chunk_drop(struct chunk *chk)
 {
        chk->str  = NULL;