summaryrefslogtreecommitdiffstats
path: root/src/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.c')
-rw-r--r--src/utils.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/utils.c b/src/utils.c
index 109aac08..32ea87c3 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -554,4 +554,42 @@ const char *osmo_escape_str(const char *str, int in_len)
return osmo_escape_str_buf(str, in_len, namebuf, sizeof(namebuf));
}
+/*! Like osmo_escape_str(), but returns double-quotes around a string, or "NULL" for a NULL string.
+ * This allows passing any char* value and get its C representation as string.
+ * \param[in] str A string that may contain any characters.
+ * \param[in] len Pass -1 to print until nul char, or >= 0 to force a length.
+ * \returns buf containing an escaped representation, possibly truncated, or str itself.
+ */
+const char *osmo_quote_str_buf(const char *str, int in_len, char *buf, size_t bufsize)
+{
+ const char *res;
+ int l;
+ if (!str)
+ return "NULL";
+ if (bufsize < 3)
+ return "<buf-too-small>";
+ buf[0] = '"';
+ res = osmo_escape_str_buf(str, in_len, buf + 1, bufsize - 2);
+ /* if osmo_escape_str_buf() returned the str itself, we need to copy it to buf to be able to
+ * quote it. */
+ if (res == str) {
+ /* max_len = bufsize - two quotes - nul term */
+ int max_len = bufsize - 2 - 1;
+ if (in_len >= 0)
+ max_len = OSMO_MIN(in_len, max_len);
+ /* It is not allowed to pass unterminated strings into osmo_strlcpy() :/ */
+ strncpy(buf + 1, str, max_len);
+ buf[1 + max_len] = '\0';
+ }
+ l = strlen(buf);
+ buf[l] = '"';
+ buf[l+1] = '\0'; /* both osmo_escape_str_buf() and max_len above ensure room for '\0' */
+ return buf;
+}
+
+const char *osmo_quote_str(const char *str, int in_len)
+{
+ return osmo_quote_str_buf(str, in_len, namebuf, sizeof(namebuf));
+}
+
/*! @} */