COIN-OR::LEMON - Graph Library

Changeset 5:390d05b2d25c in glemon for gettext.h


Ignore:
Timestamp:
07/10/08 21:38:53 (16 years ago)
Author:
Akos Ladanyi <ladanyi@…>
Branch:
default
Phase:
public
Message:

Upgrade gettext infrastructure.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • gettext.h

    r1 r5  
    11/* Convenience header for conditional use of GNU <libintl.h>.
    2    Copyright (C) 1995-1998, 2000-2002, 2004 Free Software Foundation, Inc.
     2   Copyright (C) 1995-1998, 2000-2002, 2004-2006 Free Software Foundation, Inc.
    33
    44   This program is free software; you can redistribute it and/or modify it
    5    under the terms of the GNU Library General Public License as published
     5   under the terms of the GNU General Public License as published
    66   by the Free Software Foundation; either version 2, or (at your option)
    77   any later version.
     
    1212   Library General Public License for more details.
    1313
    14    You should have received a copy of the GNU Library General Public
     14   You should have received a copy of the GNU General Public
    1515   License along with this program; if not, write to the Free Software
    1616   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
     
    2525/* Get declarations of GNU message catalog functions.  */
    2626# include <libintl.h>
     27
     28/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
     29   the gettext() and ngettext() macros.  This is an alternative to calling
     30   textdomain(), and is useful for libraries.  */
     31# ifdef DEFAULT_TEXT_DOMAIN
     32#  undef gettext
     33#  define gettext(Msgid) \
     34     dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
     35#  undef ngettext
     36#  define ngettext(Msgid1, Msgid2, N) \
     37     dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
     38# endif
    2739
    2840#else
     
    5466   contain "#define const".  */
    5567# define gettext(Msgid) ((const char *) (Msgid))
    56 # define dgettext(Domainname, Msgid) ((const char *) (Msgid))
    57 # define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid))
     68# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
     69# define dcgettext(Domainname, Msgid, Category) \
     70    ((void) (Category), dgettext (Domainname, Msgid))
    5871# define ngettext(Msgid1, Msgid2, N) \
    59     ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
     72    ((N) == 1 \
     73     ? ((void) (Msgid2), (const char *) (Msgid1)) \
     74     : ((void) (Msgid1), (const char *) (Msgid2)))
    6075# define dngettext(Domainname, Msgid1, Msgid2, N) \
    61     ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
     76    ((void) (Domainname), ngettext (Msgid1, Msgid2, N))
    6277# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
    63     ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
     78    ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N))
    6479# define textdomain(Domainname) ((const char *) (Domainname))
    65 # define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
    66 # define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset))
     80# define bindtextdomain(Domainname, Dirname) \
     81    ((void) (Domainname), (const char *) (Dirname))
     82# define bind_textdomain_codeset(Domainname, Codeset) \
     83    ((void) (Domainname), (const char *) (Codeset))
    6784
    6885#endif
     
    7794#define gettext_noop(String) String
    7895
     96/* The separator between msgctxt and msgid in a .mo file.  */
     97#define GETTEXT_CONTEXT_GLUE "\004"
     98
     99/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
     100   MSGID.  MSGCTXT and MSGID must be string literals.  MSGCTXT should be
     101   short and rarely need to change.
     102   The letter 'p' stands for 'particular' or 'special'.  */
     103#ifdef DEFAULT_TEXT_DOMAIN
     104# define pgettext(Msgctxt, Msgid) \
     105   pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
     106#else
     107# define pgettext(Msgctxt, Msgid) \
     108   pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
     109#endif
     110#define dpgettext(Domainname, Msgctxt, Msgid) \
     111  pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
     112#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
     113  pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
     114#ifdef DEFAULT_TEXT_DOMAIN
     115# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
     116   npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
     117#else
     118# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
     119   npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
     120#endif
     121#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
     122  npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
     123#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
     124  npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
     125
     126#ifdef __GNUC__
     127__inline
     128#else
     129#ifdef __cplusplus
     130inline
     131#endif
     132#endif
     133static const char *
     134pgettext_aux (const char *domain,
     135              const char *msg_ctxt_id, const char *msgid,
     136              int category)
     137{
     138  const char *translation = dcgettext (domain, msg_ctxt_id, category);
     139  if (translation == msg_ctxt_id)
     140    return msgid;
     141  else
     142    return translation;
     143}
     144
     145#ifdef __GNUC__
     146__inline
     147#else
     148#ifdef __cplusplus
     149inline
     150#endif
     151#endif
     152static const char *
     153npgettext_aux (const char *domain,
     154               const char *msg_ctxt_id, const char *msgid,
     155               const char *msgid_plural, unsigned long int n,
     156               int category)
     157{
     158  const char *translation =
     159    dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
     160  if (translation == msg_ctxt_id || translation == msgid_plural)
     161    return (n == 1 ? msgid : msgid_plural);
     162  else
     163    return translation;
     164}
     165
     166/* The same thing extended for non-constant arguments.  Here MSGCTXT and MSGID
     167   can be arbitrary expressions.  But for string literals these macros are
     168   less efficient than those above.  */
     169
     170#include <string.h>
     171
     172#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \
     173  (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \
     174   /* || __STDC_VERSION__ >= 199901L */ )
     175
     176#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
     177#include <stdlib.h>
     178#endif
     179
     180#define pgettext_expr(Msgctxt, Msgid) \
     181  dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
     182#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
     183  dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
     184
     185#ifdef __GNUC__
     186__inline
     187#else
     188#ifdef __cplusplus
     189inline
     190#endif
     191#endif
     192static const char *
     193dcpgettext_expr (const char *domain,
     194                 const char *msgctxt, const char *msgid,
     195                 int category)
     196{
     197  size_t msgctxt_len = strlen (msgctxt) + 1;
     198  size_t msgid_len = strlen (msgid) + 1;
     199  const char *translation;
     200#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
     201  char msg_ctxt_id[msgctxt_len + msgid_len];
     202#else
     203  char buf[1024];
     204  char *msg_ctxt_id =
     205    (msgctxt_len + msgid_len <= sizeof (buf)
     206     ? buf
     207     : (char *) malloc (msgctxt_len + msgid_len));
     208  if (msg_ctxt_id != NULL)
     209#endif
     210    {
     211      memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
     212      msg_ctxt_id[msgctxt_len - 1] = '\004';
     213      memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
     214      translation = dcgettext (domain, msg_ctxt_id, category);
     215#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
     216      if (msg_ctxt_id != buf)
     217        free (msg_ctxt_id);
     218#endif
     219      if (translation != msg_ctxt_id)
     220        return translation;
     221    }
     222  return msgid;
     223}
     224
     225#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
     226  dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
     227#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
     228  dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
     229
     230#ifdef __GNUC__
     231__inline
     232#else
     233#ifdef __cplusplus
     234inline
     235#endif
     236#endif
     237static const char *
     238dcnpgettext_expr (const char *domain,
     239                  const char *msgctxt, const char *msgid,
     240                  const char *msgid_plural, unsigned long int n,
     241                  int category)
     242{
     243  size_t msgctxt_len = strlen (msgctxt) + 1;
     244  size_t msgid_len = strlen (msgid) + 1;
     245  const char *translation;
     246#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
     247  char msg_ctxt_id[msgctxt_len + msgid_len];
     248#else
     249  char buf[1024];
     250  char *msg_ctxt_id =
     251    (msgctxt_len + msgid_len <= sizeof (buf)
     252     ? buf
     253     : (char *) malloc (msgctxt_len + msgid_len));
     254  if (msg_ctxt_id != NULL)
     255#endif
     256    {
     257      memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
     258      msg_ctxt_id[msgctxt_len - 1] = '\004';
     259      memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
     260      translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
     261#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
     262      if (msg_ctxt_id != buf)
     263        free (msg_ctxt_id);
     264#endif
     265      if (!(translation == msg_ctxt_id || translation == msgid_plural))
     266        return translation;
     267    }
     268  return (n == 1 ? msgid : msgid_plural);
     269}
     270
    79271#endif /* _LIBGETTEXT_H */
Note: See TracChangeset for help on using the changeset viewer.