Squashed 'third_party/rawrtc/re/' content from commit f3163ce8b

Change-Id: I6a235e6ac0f03269d951026f9d195da05c40fdab
git-subtree-dir: third_party/rawrtc/re
git-subtree-split: f3163ce8b526a13b35ef71ce4dd6f43585064d8a
diff --git a/src/fmt/str.c b/src/fmt/str.c
new file mode 100644
index 0000000..37981af
--- /dev/null
+++ b/src/fmt/str.c
@@ -0,0 +1,142 @@
+/**
+ * @file fmt/str.c String format functions
+ *
+ * Copyright (C) 2010 Creytiv.com
+ */
+#undef __STRICT_ANSI__ /* for mingw32 */
+#include <string.h>
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#include <re_types.h>
+#include <re_mem.h>
+#include <re_fmt.h>
+
+
+/**
+ * Convert a ascii hex string to binary format
+ *
+ * @param hex Destinatin binary buffer
+ * @param len Length of binary buffer
+ * @param str Source ascii string
+ *
+ * @return 0 if success, otherwise errorcode
+ */
+int str_hex(uint8_t *hex, size_t len, const char *str)
+{
+	size_t i;
+
+	if (!hex || !str || (strlen(str) != (2 * len)))
+		return EINVAL;
+
+	for (i=0; i<len*2; i+=2) {
+		hex[i/2]  = ch_hex(str[i]) << 4;
+		hex[i/2] += ch_hex(str[i+1]);
+	}
+
+	return 0;
+}
+
+
+/**
+ * Copy a 0-terminated string with maximum length
+ *
+ * @param dst Destinatin string
+ * @param src Source string
+ * @param n   Maximum size of destination, including 0-terminator
+ */
+void str_ncpy(char *dst, const char *src, size_t n)
+{
+	if (!dst || !src || !n)
+		return;
+
+	(void)strncpy(dst, src, n-1);
+	dst[n-1] = '\0'; /* strncpy does not null terminate if overflow */
+}
+
+
+/**
+ * Duplicate a 0-terminated string
+ *
+ * @param dst Pointer to destination string (set on return)
+ * @param src Source string
+ *
+ * @return 0 if success, otherwise errorcode
+ */
+int str_dup(char **dst, const char *src)
+{
+	char *p;
+	size_t sz;
+
+	if (!dst || !src)
+		return EINVAL;
+
+	sz = strlen(src) + 1;
+
+	p = mem_alloc(sz, NULL);
+	if (!p)
+		return ENOMEM;
+
+	memcpy(p, src, sz);
+
+	*dst = p;
+
+	return 0;
+}
+
+
+/**
+ * Compare two 0-terminated strings
+ *
+ * @param s1 First string
+ * @param s2 Second string
+ *
+ * @return an integer less than, equal to, or greater than zero if s1 is found
+ *         respectively, to be less than, to match, or be greater than s2
+ */
+int str_cmp(const char *s1, const char *s2)
+{
+	if (!s1 || !s2)
+		return 1;
+
+	return strcmp(s1, s2);
+}
+
+
+/**
+ * Compare two 0-terminated strings, ignoring case
+ *
+ * @param s1 First string
+ * @param s2 Second string
+ *
+ * @return an integer less than, equal to, or greater than zero if s1 is found
+ *         respectively, to be less than, to match, or be greater than s2
+ */
+int str_casecmp(const char *s1, const char *s2)
+{
+	/* Same strings -> equal */
+	if (s1 == s2)
+		return 0;
+
+	if (!s1 || !s2)
+		return 1;
+
+#ifdef WIN32
+	return _stricmp(s1, s2);
+#else
+	return strcasecmp(s1, s2);
+#endif
+}
+
+
+/**
+ * Calculate the length of a string, safe version.
+ *
+ * @param s String
+ *
+ * @return Length of the string
+ */
+size_t str_len(const char *s)
+{
+	return s ? strlen(s) : 0;
+}