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/json/encode.c b/src/json/encode.c
new file mode 100644
index 0000000..fa56de3
--- /dev/null
+++ b/src/json/encode.c
@@ -0,0 +1,99 @@
+/**
+ * @file json/encode.c  JSON encoder
+ *
+ * Copyright (C) 2010 - 2015 Creytiv.com
+ */
+#include <re_types.h>
+#include <re_fmt.h>
+#include <re_list.h>
+#include <re_odict.h>
+#include <re_json.h>
+
+
+static int encode_entry(struct re_printf *pf, const struct odict_entry *e)
+{
+	struct odict *array;
+	struct le *le;
+	int err;
+
+	if (!e)
+		return 0;
+
+	switch (e->type) {
+
+	case ODICT_OBJECT:
+		err = json_encode_odict(pf, e->u.odict);
+		break;
+
+	case ODICT_ARRAY:
+		array = e->u.odict;
+		if (!array)
+			return 0;
+
+		err = re_hprintf(pf, "[");
+
+		for (le=array->lst.head; le; le=le->next) {
+
+			const struct odict_entry *ae = le->data;
+
+			err |= re_hprintf(pf, "%H%s",
+					  encode_entry, ae,
+					  le->next ? "," : "");
+		}
+
+		err |= re_hprintf(pf, "]");
+		break;
+
+	case ODICT_INT:
+		err = re_hprintf(pf, "%lld", e->u.integer);
+		break;
+
+	case ODICT_DOUBLE:
+		err = re_hprintf(pf, "%f", e->u.dbl);
+		break;
+
+	case ODICT_STRING:
+		err = re_hprintf(pf, "\"%H\"", utf8_encode, e->u.str);
+		break;
+
+	case ODICT_BOOL:
+		err = re_hprintf(pf, "%s", e->u.boolean ? "true" : "false");
+		break;
+
+	case ODICT_NULL:
+		err = re_hprintf(pf, "null");
+		break;
+
+	default:
+		re_fprintf(stderr, "json: unsupported type %d\n", e->type);
+		err = EINVAL;
+	}
+
+	return err;
+}
+
+
+int json_encode_odict(struct re_printf *pf, const struct odict *o)
+{
+	struct le *le;
+	int err;
+
+	if (!o)
+		return 0;
+
+	err = re_hprintf(pf, "{");
+
+	for (le=o->lst.head; le; le=le->next) {
+
+		const struct odict_entry *e = le->data;
+
+		err |= re_hprintf(pf, "\"%H\":%H%s",
+				  utf8_encode, e->key,
+				  encode_entry, e,
+				  le->next ? "," : "");
+	}
+
+	err |= re_hprintf(pf, "}");
+
+	return err;
+}