summaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2014-05-27 15:54:38 -0400
committerMatthias Clasen <mclasen@redhat.com>2014-05-27 17:28:10 -0400
commita28d2cb9233eff0983b7b3517a9dbb00b62fd357 (patch)
treed13aab55cfba3d005a3ed4ac214469fba0a4c6d3 /util
parentea2d20e3133dec009ea9e59a65ec85ffbce445a1 (diff)
downloadgtk+-a28d2cb9233eff0983b7b3517a9dbb00b62fd357.tar.gz
Move extract-strings to its own directory3.13.2
This will hopefully help resolve the circular dependency between libgtk linking against inspector/libgtkinspector and inspector/ needing extract-strings from gtk/. I didn't preserve the EXEEXT decorations in this operation - automake gave me stern warnings about it, so I just dropped them all. Somebody who cross-builds GTK+ will have to reconstruct this.
Diffstat (limited to 'util')
-rw-r--r--util/Makefile.am11
-rw-r--r--util/extract-strings.c176
2 files changed, 187 insertions, 0 deletions
diff --git a/util/Makefile.am b/util/Makefile.am
new file mode 100644
index 0000000000..f079800078
--- /dev/null
+++ b/util/Makefile.am
@@ -0,0 +1,11 @@
+# The extract_strings tool is a build utility that runs on the build system.
+extract_strings_sources = extract-strings.c
+extract_strings_cppflags =
+extract_strings_cflags = $(GLIB_CFLAGS_FOR_BUILD)
+extract_strings_ldadd = $(GLIB_LIBS_FOR_BUILD)
+
+extract-strings: $(extract_strings_sources)
+ @rm -f extract-strings
+ $(AM_V_CCLD)$(CC_FOR_BUILD) $(extract_strings_cppflags) $(CPPFLAGS_FOR_BUILD) $(extract_strings_cflags) $(CFLAGS_FOR_BUILD) $^ $(LDFLAGS_FOR_BUILD) $(extract_strings_ldadd) $(LIBS_FOR_BUILD) -o $@
+
+noinst_PROGRAMS = extract-strings
diff --git a/util/extract-strings.c b/util/extract-strings.c
new file mode 100644
index 0000000000..183b99a4c4
--- /dev/null
+++ b/util/extract-strings.c
@@ -0,0 +1,176 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 2013 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <glib.h>
+
+typedef struct {
+ GString *output;
+ gboolean translatable;
+ gchar *context;
+ gchar *comments;
+ GString *text;
+} ParserData;
+
+static void
+start_element_handler (GMarkupParseContext *contexts,
+ const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ gpointer user_data,
+ GError **error)
+{
+ ParserData *data = user_data;
+
+ if (g_str_equal (element_name, "property") ||
+ g_str_equal (element_name, "attribute") ||
+ g_str_equal (element_name, "item"))
+ {
+ gboolean translatable;
+ gchar *context;
+ gchar *comments;
+
+ g_markup_collect_attributes (element_name,
+ attribute_names,
+ attribute_values,
+ error,
+ G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "name", NULL,
+ G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "value", NULL,
+ G_MARKUP_COLLECT_TRISTATE, "translatable", &translatable,
+ G_MARKUP_COLLECT_STRDUP|G_MARKUP_COLLECT_OPTIONAL, "context", &context,
+ G_MARKUP_COLLECT_STRDUP|G_MARKUP_COLLECT_OPTIONAL, "comments", &comments,
+ G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "id", NULL,
+ G_MARKUP_COLLECT_INVALID);
+
+ if (translatable == TRUE)
+ {
+ data->translatable = TRUE;
+ data->context = context;
+ data->comments = comments;
+ data->text = g_string_new ("");
+ }
+ }
+}
+
+static void
+end_element_handler (GMarkupParseContext *context,
+ const gchar *element_name,
+ gpointer user_data,
+ GError **error)
+{
+ ParserData *data = user_data;
+ gchar **lines;
+ gint i;
+
+ if (!data->translatable)
+ return;
+
+ lines = g_strsplit (data->text->str, "\n", -1);
+
+ if (data->comments)
+ g_string_append_printf (data->output, "\n/* %s */\n",
+ data->comments);
+
+ if (data->context)
+ g_string_append_printf (data->output, "C_(\"%s\", ",
+ data->context);
+ else
+ g_string_append (data->output, "N_(");
+
+ for (i = 0; lines[i]; i++)
+ g_string_append_printf (data->output, "%s\"%s%s\"%s",
+ i > 0 ? " " : "",
+ lines[i],
+ lines[i+1] ? "\\n" : "",
+ lines[i+1] ? "\n" : "");
+
+ g_string_append (data->output, ");\n");
+
+ g_strfreev (lines);
+
+ g_free (data->comments);
+ g_free (data->context);
+ g_string_free (data->text, TRUE);
+
+ data->comments = NULL;
+ data->context = NULL;
+ data->text = NULL;
+ data->translatable = FALSE;
+}
+
+static void
+text_handler (GMarkupParseContext *context,
+ const gchar *text,
+ gsize text_len,
+ gpointer user_data,
+ GError **error)
+{
+ ParserData *data = user_data;
+
+ if (!data->translatable)
+ return;
+
+ g_string_append_len (data->text, text, text_len);
+}
+
+static const GMarkupParser parser = {
+ start_element_handler,
+ end_element_handler,
+ text_handler,
+ NULL,
+ NULL
+};
+
+int
+main (int argc, char *argv[])
+{
+ gchar *contents;
+ gsize length;
+ GError *error;
+ GMarkupParseContext *context;
+ ParserData data;
+
+ if (argc < 2)
+ {
+ g_printerr ("Expect a filename\n");
+ return 1;
+ }
+
+ error = NULL;
+ if (!g_file_get_contents (argv[1], &contents, &length, &error))
+ {
+ g_printerr ("%s\n", error->message);
+ g_error_free (error);
+ return 1;
+ }
+
+ data.output = g_string_new ("");
+ data.translatable = FALSE;
+
+ context = g_markup_parse_context_new (&parser, 0, &data, NULL);
+ if (!g_markup_parse_context_parse (context, contents, length, &error))
+ {
+ g_markup_parse_context_free (context);
+ g_free (contents);
+ g_printerr ("%s\n", error->message);
+ g_error_free (error);
+ return 1;
+ }
+
+ g_print ("%s", g_string_free (data.output, FALSE));
+
+ return 0;
+}