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/sip/addr.c b/src/sip/addr.c
new file mode 100644
index 0000000..72ab21f
--- /dev/null
+++ b/src/sip/addr.c
@@ -0,0 +1,56 @@
+/**
+ * @file sip/addr.c  SIP Address decode
+ *
+ * Copyright (C) 2010 Creytiv.com
+ */
+#include <string.h>
+#include <re_types.h>
+#include <re_fmt.h>
+#include <re_mbuf.h>
+#include <re_uri.h>
+#include <re_list.h>
+#include <re_sa.h>
+#include <re_msg.h>
+#include <re_sip.h>
+
+
+/**
+ * Decode a pointer-length string into a SIP Address object
+ *
+ * @param addr SIP Address object
+ * @param pl   Pointer-length string
+ *
+ * @return 0 for success, otherwise errorcode
+ */
+int sip_addr_decode(struct sip_addr *addr, const struct pl *pl)
+{
+	int err;
+
+	if (!addr || !pl)
+		return EINVAL;
+
+	memset(addr, 0, sizeof(*addr));
+
+	if (0 == re_regex(pl->p, pl->l, "[~ \t\r\n<]*[ \t\r\n]*<[^>]+>[^]*",
+			  &addr->dname, NULL, &addr->auri, &addr->params)) {
+
+		if (!addr->dname.l)
+			addr->dname.p = NULL;
+
+		if (!addr->params.l)
+			addr->params.p = NULL;
+	}
+	else {
+		memset(addr, 0, sizeof(*addr));
+
+		if (re_regex(pl->p, pl->l, "[^;]+[^]*",
+			     &addr->auri, &addr->params))
+			return EBADMSG;
+	}
+
+	err = uri_decode(&addr->uri, &addr->auri);
+	if (err)
+		memset(addr, 0, sizeof(*addr));
+
+	return err;
+}