From 482840e61f86ca321838a91e902c41d40c098bbb Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Wed, 24 Dec 2014 07:38:37 +0000 Subject: Imported from /home/lorry/working-area/delta_gettext-tarball/gettext-0.19.4.tar.xz. --- gettext-tools/src/x-desktop.c | 193 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 gettext-tools/src/x-desktop.c (limited to 'gettext-tools/src/x-desktop.c') diff --git a/gettext-tools/src/x-desktop.c b/gettext-tools/src/x-desktop.c new file mode 100644 index 0000000..320266e --- /dev/null +++ b/gettext-tools/src/x-desktop.c @@ -0,0 +1,193 @@ +/* xgettext Desktop Entry backend. + Copyright (C) 2014 Free Software Foundation, Inc. + + This file was written by Daiki Ueno , 2014. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +/* Specification. */ +#include "x-desktop.h" + +#include +#include +#include +#include +#include + +#include "message.h" +#include "xgettext.h" +#include "error.h" +#include "error-progname.h" +#include "xalloc.h" +#include "xvasprintf.h" +#include "hash.h" +#include "gettext.h" +#include "read-desktop.h" +#include "po-charset.h" +#include "c-ctype.h" + +#define _(s) gettext(s) + +#define SIZEOF(a) (sizeof(a) / sizeof(a[0])) + +/* ====================== Keyword set customization. ====================== */ + +/* The syntax of a Desktop Entry file is defined at + http://standards.freedesktop.org/desktop-entry-spec/latest/index.html + + Basically, values with 'localestring' type can be translated. + + The type of a value is determined by looking at the key associated + with it. The list of available keys are listed on: + http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s05.html */ + +static hash_table keywords; +static bool default_keywords = true; + +static void +add_keyword (const char *name, hash_table *keywords, bool is_list) +{ + if (name == NULL) + default_keywords = false; + else + { + if (keywords->table == NULL) + hash_init (keywords, 100); + + desktop_add_keyword (keywords, name, is_list); + } +} + +void +x_desktop_keyword (const char *name) +{ + add_keyword (name, &keywords, false); +} + +static void +init_keywords (void) +{ + if (default_keywords) + { + if (keywords.table == NULL) + hash_init (&keywords, 100); + + desktop_add_default_keywords (&keywords); + default_keywords = false; + } +} + +typedef struct extract_desktop_reader_ty extract_desktop_reader_ty; +struct extract_desktop_reader_ty +{ + DESKTOP_READER_TY + + message_list_ty *mlp; +}; + +static void +extract_desktop_handle_group (struct desktop_reader_ty *reader, + const char *group) +{ + savable_comment_reset (); +} + +static void +extract_desktop_handle_pair (struct desktop_reader_ty *reader, + lex_pos_ty *key_pos, + const char *key, + const char *locale, + const char *value) +{ + extract_desktop_reader_ty *extract_reader = + (extract_desktop_reader_ty *) reader; + void *keyword_value; + + if (!locale /* Skip already translated entry. */ + && hash_find_entry (&keywords, key, strlen (key), &keyword_value) == 0) + { + bool is_list = (bool) keyword_value; + + remember_a_message (extract_reader->mlp, NULL, + desktop_unescape_string (value, is_list), + null_context, key_pos, + NULL, savable_comment); + } + savable_comment_reset (); +} + +static void +extract_desktop_handle_comment (struct desktop_reader_ty *reader, + const char *buffer) +{ + size_t buflen = strlen (buffer); + size_t bufpos = 0; + + while (bufpos < buflen + && c_isspace (buffer[bufpos])) + ++bufpos; + while (buflen >= bufpos + && c_isspace (buffer[buflen - 1])) + --buflen; + if (bufpos < buflen) + { + char *comment = xstrdup (buffer); + comment[buflen] = 0; + savable_comment_add (&comment[bufpos]); + free (comment); + } +} + +static void +extract_desktop_handle_blank (struct desktop_reader_ty *reader, + const char *s) +{ + savable_comment_reset (); +} + +desktop_reader_class_ty extract_methods = + { + sizeof (extract_desktop_reader_ty), + NULL, + NULL, + extract_desktop_handle_group, + extract_desktop_handle_pair, + extract_desktop_handle_comment, + extract_desktop_handle_blank + }; + +void +extract_desktop (FILE *f, + const char *real_filename, const char *logical_filename, + flag_context_list_table_ty *flag_table, + msgdomain_list_ty *mdlp) +{ + desktop_reader_ty *reader = desktop_reader_alloc (&extract_methods); + extract_desktop_reader_ty *extract_reader = + (extract_desktop_reader_ty *) reader; + + init_keywords (); + xgettext_current_source_encoding = po_charset_utf8; + + extract_reader->mlp = mdlp->item[0]->messages; + + desktop_parse (reader, f, real_filename, logical_filename); + desktop_reader_free (reader); + + reader = NULL; +} -- cgit v1.2.1