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;
+}