[gtk+/wip/matthiasc/emoji-picker] Add a tool to create an emoji data gvariant



commit 9a6c1728edd1ad76044b75e6e90c7ef8805cedfd
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Aug 9 22:29:55 2017 -0400

    Add a tool to create an emoji data gvariant
    
    This reads emoji data in json and generates a big gvariant.

 tests/convert.c |  104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 104 insertions(+), 0 deletions(-)
---
diff --git a/tests/convert.c b/tests/convert.c
new file mode 100644
index 0000000..e9cff68
--- /dev/null
+++ b/tests/convert.c
@@ -0,0 +1,104 @@
+#include <json-glib/json-glib.h>
+#include <string.h>
+
+gboolean
+parse_code (GVariantBuilder *b, const char *code)
+{
+        g_auto(GStrv) strv = NULL;
+        int j;
+        guint32 u1;
+
+        strv = g_strsplit (code, " ", -1);
+        for (j = 0; strv[j]; j++) {
+                guint32 u;
+                char *end;
+
+                u = (guint32) g_ascii_strtoull (strv[j], &end, 16);
+                if (*end != '\0') {
+                        g_error ("failed to parse code: %s\n", strv[j]);
+                        return FALSE;
+                }
+                if (u != 0xfe0f || u1 == 0x2764)
+                        g_variant_builder_add (b, "u", u);
+                u1 = u;
+        }
+
+        return TRUE;
+}
+
+int
+main (int argc, char *argv[])
+{
+        JsonParser *parser;
+        JsonNode *root;
+        JsonArray *array;
+        GError *error = NULL;
+        guint length, i;
+        GVariantBuilder builder;
+        GVariant *v;
+        GString *s;
+        GBytes *bytes;
+
+        parser = json_parser_new ();
+
+        if (!json_parser_load_from_file (parser, argv[1], &error)) {
+                g_error ("%s", error->message);
+                return 1;
+        }
+
+        root = json_parser_get_root (parser);
+        array = json_node_get_array (root);
+        length = json_array_get_length (array);
+
+        g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(ausaau)"));
+        i = 0;
+        while (i < length) {
+                JsonNode *node = json_array_get_element (array, i);
+                JsonObject *obj = json_node_get_object (node);
+                GVariantBuilder b1, b2;
+                const char *name;
+                const char *code;
+
+                g_variant_builder_init (&b1, G_VARIANT_TYPE ("au"));
+                g_variant_builder_init (&b2, G_VARIANT_TYPE ("aau"));
+
+                name = json_object_get_string_member (obj, "name");
+                code = json_object_get_string_member (obj, "code");
+
+                if (!parse_code (&b1, code))
+                        return 1;
+
+                i++;
+                while (i < length) {
+                        JsonNode *node2 = json_array_get_element (array, i);
+                        JsonObject *obj2 = json_node_get_object (node2);
+                        const char *name2;
+                        const char *code2;
+                        GVariantBuilder b22;
+
+                        name2 = json_object_get_string_member (obj2, "name");
+                        code2 = json_object_get_string_member (obj2, "code");
+
+                        if (!strstr (name2, "skin tone") || !g_str_has_prefix (name2, name))
+                                break;
+
+                        g_variant_builder_init (&b22, G_VARIANT_TYPE ("au"));
+                        if (!parse_code (&b22, code2))
+                                return 1;
+
+                        g_variant_builder_add (&b2, "au", &b22);
+                        i++;
+                }
+
+                g_variant_builder_add (&builder, "(ausaau)", &b1, name, &b2);
+        }
+
+        v = g_variant_builder_end (&builder);
+        bytes = g_variant_get_data_as_bytes (v);
+        if (!g_file_set_contents (argv[2], g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes), 
&error)) {
+                g_error ("%s", error->message);
+                return 1;
+        }
+
+        return 0;
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]