diff options
Diffstat (limited to 'gettext-tools/src/message.h')
-rw-r--r-- | gettext-tools/src/message.h | 370 |
1 files changed, 370 insertions, 0 deletions
diff --git a/gettext-tools/src/message.h b/gettext-tools/src/message.h new file mode 100644 index 0000000..bf2215a --- /dev/null +++ b/gettext-tools/src/message.h @@ -0,0 +1,370 @@ +/* GNU gettext - internationalization aids + Copyright (C) 1995-1998, 2000-2009 Free Software Foundation, Inc. + + This file was written by Peter Miller <millerp@canb.auug.org.au> + + 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 <http://www.gnu.org/licenses/>. */ + +#ifndef _MESSAGE_H +#define _MESSAGE_H + +#include "str-list.h" +#include "pos.h" +#include "hash.h" + +#include <stdbool.h> + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* According to Sun's Uniforum proposal the default message domain is + named 'messages'. */ +#define MESSAGE_DOMAIN_DEFAULT "messages" + + +/* Separator between msgctxt and msgid in .mo files. */ +#define MSGCTXT_SEPARATOR '\004' /* EOT */ + + +/* Kinds of format strings. */ +enum format_type +{ + format_c, + format_objc, + format_sh, + format_python, + format_python_brace, + format_lisp, + format_elisp, + format_librep, + format_scheme, + format_smalltalk, + format_java, + format_csharp, + format_awk, + format_pascal, + format_ycp, + format_tcl, + format_perl, + format_perl_brace, + format_php, + format_gcc_internal, + format_gfc_internal, + format_qt, + format_qt_plural, + format_kde, + format_boost, + format_lua, + format_javascript +}; +#define NFORMATS 27 /* Number of format_type enum values. */ +extern DLL_VARIABLE const char *const format_language[NFORMATS]; +extern DLL_VARIABLE const char *const format_language_pretty[NFORMATS]; + +/* Is current msgid a format string? */ +enum is_format +{ + undecided, + yes, + no, + yes_according_to_context, + possible, + impossible +}; + +extern bool + possible_format_p (enum is_format); + + +/* Range of an unsigned integer argument. */ +struct argument_range +{ + int min; + int max; +}; + +/* Tests whether a range is present. */ +#define has_range_p(range) ((range).min >= 0 && (range).max >= 0) + + +/* Is current msgid wrappable? */ +#if 0 +enum is_wrap +{ + undecided, + yes, + no +}; +#else /* HACK - C's enum concept is so stupid */ +#define is_wrap is_format +#endif + + +struct altstr +{ + const char *msgstr; + size_t msgstr_len; + const char *msgstr_end; + string_list_ty *comment; + string_list_ty *comment_dot; + char *id; +}; + + +typedef struct message_ty message_ty; +struct message_ty +{ + /* The msgctxt string, if present. */ + const char *msgctxt; + + /* The msgid string. */ + const char *msgid; + + /* The msgid's plural, if present. */ + const char *msgid_plural; + + /* The msgstr strings. */ + const char *msgstr; + /* The number of bytes in msgstr, including the terminating NUL. */ + size_t msgstr_len; + + /* Position in the source PO file. */ + lex_pos_ty pos; + + /* Plain comments (#) appearing before the message. */ + string_list_ty *comment; + + /* Extracted comments (#.) appearing before the message. */ + string_list_ty *comment_dot; + + /* File position comments (#:) appearing before the message, one for + each unique file position instance, sorted by file name and then + by line. */ + size_t filepos_count; + lex_pos_ty *filepos; + + /* Informations from special comments (#,). + Some of them come from extracted comments. They are manipulated by + the tools, e.g. msgmerge. */ + + /* Fuzzy means "needs translator review". */ + bool is_fuzzy; + + /* Designation of format string syntax requirements for specific + programming languages. */ + enum is_format is_format[NFORMATS]; + + /* Lower and upper bound for the argument whose format directive can be + omitted in specific cases of singular or plural. */ + struct argument_range range; + + /* Do we want the string to be wrapped in the emitted PO file? */ + enum is_wrap do_wrap; + + /* The prev_msgctxt, prev_msgid and prev_msgid_plural strings appearing + before the message, if present. Generated by msgmerge. */ + const char *prev_msgctxt; + const char *prev_msgid; + const char *prev_msgid_plural; + + /* If set the message is obsolete and while writing out it should be + commented out. */ + bool obsolete; + + /* Used for checking that messages have been used, in the msgcmp, + msgmerge, msgcomm and msgcat programs. */ + int used; + + /* Used for looking up the target message, in the msgcat program. */ + message_ty *tmp; + + /* Used for combining alternative translations, in the msgcat program. */ + int alternative_count; + struct altstr *alternative; +}; + +extern message_ty * + message_alloc (const char *msgctxt, + const char *msgid, const char *msgid_plural, + const char *msgstr, size_t msgstr_len, + const lex_pos_ty *pp); +#define is_header(mp) ((mp)->msgctxt == NULL && (mp)->msgid[0] == '\0') +extern void + message_free (message_ty *mp); +extern void + message_comment_append (message_ty *mp, const char *comment); +extern void + message_comment_dot_append (message_ty *mp, const char *comment); +extern void + message_comment_filepos (message_ty *mp, const char *name, size_t line); +extern message_ty * + message_copy (message_ty *mp); + + +typedef struct message_list_ty message_list_ty; +struct message_list_ty +{ + message_ty **item; + size_t nitems; + size_t nitems_max; + bool use_hashtable; + hash_table htable; /* Table mapping msgid to 'message_ty *'. */ +}; + +/* Create a fresh message list. + If USE_HASHTABLE is true, a hash table will be used to speed up + message_list_search(). USE_HASHTABLE can only be set to true if it is + known that the message list will not contain duplicate msgids. */ +extern message_list_ty * + message_list_alloc (bool use_hashtable); +/* Free a message list. + If keep_messages = 0, also free the messages. If keep_messages = 1, don't + free the messages. */ +extern void + message_list_free (message_list_ty *mlp, int keep_messages); +extern void + message_list_append (message_list_ty *mlp, message_ty *mp); +extern void + message_list_prepend (message_list_ty *mlp, message_ty *mp); +extern void + message_list_insert_at (message_list_ty *mlp, size_t n, message_ty *mp); +extern void + message_list_delete_nth (message_list_ty *mlp, size_t n); +typedef bool message_predicate_ty (const message_ty *mp); +extern void + message_list_remove_if_not (message_list_ty *mlp, + message_predicate_ty *predicate); +/* Recompute the hash table of a message list after the msgids or msgctxts + changed. */ +extern bool + message_list_msgids_changed (message_list_ty *mlp); +/* Copy a message list. + If copy_level = 0, also copy the messages. If copy_level = 1, share the + messages. */ +extern message_list_ty * + message_list_copy (message_list_ty *mlp, int copy_level); +extern message_ty * + message_list_search (message_list_ty *mlp, + const char *msgctxt, const char *msgid); +/* Return the message in MLP which maximizes the fuzzy_search_goal_function. + Only messages with a fuzzy_search_goal_function > FUZZY_THRESHOLD are + considered. In case of several messages with the same goal function value, + the one with the smaller index is returned. */ +extern message_ty * + message_list_search_fuzzy (message_list_ty *mlp, + const char *msgctxt, const char *msgid); + + +typedef struct message_list_list_ty message_list_list_ty; +struct message_list_list_ty +{ + message_list_ty **item; + size_t nitems; + size_t nitems_max; +}; + +extern message_list_list_ty * + message_list_list_alloc (void); +/* Free a list of message lists. + If keep_level = 0, also free the messages. If keep_level = 1, don't free + the messages but free the lists. If keep_level = 2, don't free the + the messages and the lists. */ +extern void + message_list_list_free (message_list_list_ty *mllp, int keep_level); +extern void + message_list_list_append (message_list_list_ty *mllp, + message_list_ty *mlp); +extern void + message_list_list_append_list (message_list_list_ty *mllp, + message_list_list_ty *mllp2); +extern message_ty * + message_list_list_search (message_list_list_ty *mllp, + const char *msgctxt, const char *msgid); +extern message_ty * + message_list_list_search_fuzzy (message_list_list_ty *mllp, + const char *msgctxt, const char *msgid); + + +typedef struct msgdomain_ty msgdomain_ty; +struct msgdomain_ty +{ + const char *domain; + message_list_ty *messages; +}; + +extern msgdomain_ty * + msgdomain_alloc (const char *domain, bool use_hashtable); +extern void + msgdomain_free (msgdomain_ty *mdp); + + +typedef struct msgdomain_list_ty msgdomain_list_ty; +struct msgdomain_list_ty +{ + msgdomain_ty **item; + size_t nitems; + size_t nitems_max; + bool use_hashtable; + const char *encoding; /* canonicalized encoding or NULL if unknown */ +}; + +extern msgdomain_list_ty * + msgdomain_list_alloc (bool use_hashtable); +extern void + msgdomain_list_free (msgdomain_list_ty *mdlp); +extern void + msgdomain_list_append (msgdomain_list_ty *mdlp, msgdomain_ty *mdp); +extern void + msgdomain_list_append_list (msgdomain_list_ty *mdlp, + msgdomain_list_ty *mdlp2); +extern message_list_ty * + msgdomain_list_sublist (msgdomain_list_ty *mdlp, const char *domain, + bool create); +/* Copy a message domain list. + If copy_level = 0, also copy the messages. If copy_level = 1, share the + messages but copy the domains. If copy_level = 2, share the domains. */ +extern msgdomain_list_ty * + msgdomain_list_copy (msgdomain_list_ty *mdlp, int copy_level); +extern message_ty * + msgdomain_list_search (msgdomain_list_ty *mdlp, + const char *msgctxt, const char *msgid); +extern message_ty * + msgdomain_list_search_fuzzy (msgdomain_list_ty *mdlp, + const char *msgctxt, const char *msgid); + + +/* The goal function used in fuzzy search. + Higher values indicate a closer match. + If the result is < LOWER_BOUND, an arbitrary other value < LOWER_BOUND can + be returned. */ +extern double + fuzzy_search_goal_function (const message_ty *mp, + const char *msgctxt, const char *msgid, + double lower_bound); + +/* The threshold for fuzzy-searching. + A message is considered only if + fuzzy_search_goal_function (mp, given, 0.0) > FUZZY_THRESHOLD. */ +#define FUZZY_THRESHOLD 0.6 + + +#ifdef __cplusplus +} +#endif + + +#endif /* message.h */ |