From 424e5eaf4eebaee14d14c7dd04acfda2655b58ac Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 29 Nov 2021 09:40:55 +0100 Subject: [PATCH] json: Add gtk_json_parser_select_member() This is modeled after JsonReader.selectName() from the Java Moshi package, see https://square.github.io/moshi/1.x/moshi/com/squareup/moshi/JsonReader.html#selectName-com.squareup.moshi.JsonReader.Options- It returns the ID of the current member name in the passed i char array or -1 if it is not found. This allows writing code like: do { switch (gtk_json_parser_select_member (parser, { "foo", "bar", NULL }) { case 0: /* handle the "foo" member */ break; case 1: /* handle the "bar" member */ break; default: /* do nothing or complain or whatever */ break; } } while (gtk_json_parser_next (parser)); The impementation so far is the simplest one possible, but could be significantly improved. --- gtk/json/gtkjsonparser.c | 24 ++++++++++++++++++++++++ gtk/json/gtkjsonparserprivate.h | 2 ++ 2 files changed, 26 insertions(+) diff --git a/gtk/json/gtkjsonparser.c b/gtk/json/gtkjsonparser.c index 8bf929cfba..a2054c373c 100644 --- a/gtk/json/gtkjsonparser.c +++ b/gtk/json/gtkjsonparser.c @@ -873,6 +873,30 @@ gtk_json_parser_get_member_name (GtkJsonParser *self) return gtk_json_unescape_string (self->block->member_name); } +gssize +gtk_json_parser_select_member (GtkJsonParser *self, + const char * const *options) +{ + char *member_name; + gssize i; + + member_name = gtk_json_parser_get_member_name (self); + if (member_name == NULL) + return -1; + + for (i = 0; options[i]; i++) + { + if (strcmp (member_name, options[i]) == 0) + break; + } + if (options[i] == NULL) + i = -1; + + g_free (member_name); + + return i; +} + gboolean gtk_json_parser_get_boolean (GtkJsonParser *self) { diff --git a/gtk/json/gtkjsonparserprivate.h b/gtk/json/gtkjsonparserprivate.h index 854042ad71..f3ff43fd88 100644 --- a/gtk/json/gtkjsonparserprivate.h +++ b/gtk/json/gtkjsonparserprivate.h @@ -47,6 +47,8 @@ gboolean gtk_json_parser_next (GtkJsonParser GtkJsonNode gtk_json_parser_get_node (GtkJsonParser *self); const GError * gtk_json_parser_get_error (GtkJsonParser *self) G_GNUC_PURE; char * gtk_json_parser_get_member_name (GtkJsonParser *self); +gssize gtk_json_parser_select_member (GtkJsonParser *self, + const char * const *options); gboolean gtk_json_parser_get_boolean (GtkJsonParser *self); double gtk_json_parser_get_number (GtkJsonParser *self);