cGit-UI for Git Repositories

cGit-UI – is a web interface for Git Repositories. cGit CGI script is writen in C and therefore it's fast enough

3 Commits   0 Branches   1 Tag
05d292b2 (kx 2023-03-24 03:51:10 +0300   1) /* Convenience header for conditional use of GNU <libintl.h>.
05d292b2 (kx 2023-03-24 03:51:10 +0300   2)    Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2016 Free Software
05d292b2 (kx 2023-03-24 03:51:10 +0300   3)    Foundation, Inc.
05d292b2 (kx 2023-03-24 03:51:10 +0300   4) 
05d292b2 (kx 2023-03-24 03:51:10 +0300   5)    This program is free software: you can redistribute it and/or modify
05d292b2 (kx 2023-03-24 03:51:10 +0300   6)    it under the terms of the GNU General Public License as published by
05d292b2 (kx 2023-03-24 03:51:10 +0300   7)    the Free Software Foundation; either version 3 of the License, or
05d292b2 (kx 2023-03-24 03:51:10 +0300   8)    (at your option) any later version.
05d292b2 (kx 2023-03-24 03:51:10 +0300   9) 
05d292b2 (kx 2023-03-24 03:51:10 +0300  10)    This program is distributed in the hope that it will be useful,
05d292b2 (kx 2023-03-24 03:51:10 +0300  11)    but WITHOUT ANY WARRANTY; without even the implied warranty of
05d292b2 (kx 2023-03-24 03:51:10 +0300  12)    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
05d292b2 (kx 2023-03-24 03:51:10 +0300  13)    GNU General Public License for more details.
05d292b2 (kx 2023-03-24 03:51:10 +0300  14) 
05d292b2 (kx 2023-03-24 03:51:10 +0300  15)    You should have received a copy of the GNU General Public License
05d292b2 (kx 2023-03-24 03:51:10 +0300  16)    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
05d292b2 (kx 2023-03-24 03:51:10 +0300  17) 
05d292b2 (kx 2023-03-24 03:51:10 +0300  18) #ifndef _LIBGETTEXT_H
05d292b2 (kx 2023-03-24 03:51:10 +0300  19) #define _LIBGETTEXT_H 1
05d292b2 (kx 2023-03-24 03:51:10 +0300  20) 
05d292b2 (kx 2023-03-24 03:51:10 +0300  21) /* NLS can be disabled through the configure --disable-nls option.  */
05d292b2 (kx 2023-03-24 03:51:10 +0300  22) #if ENABLE_NLS
05d292b2 (kx 2023-03-24 03:51:10 +0300  23) 
05d292b2 (kx 2023-03-24 03:51:10 +0300  24) /* Get declarations of GNU message catalog functions.  */
05d292b2 (kx 2023-03-24 03:51:10 +0300  25) # include <libintl.h>
05d292b2 (kx 2023-03-24 03:51:10 +0300  26) 
05d292b2 (kx 2023-03-24 03:51:10 +0300  27) /* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
05d292b2 (kx 2023-03-24 03:51:10 +0300  28)    the gettext() and ngettext() macros.  This is an alternative to calling
05d292b2 (kx 2023-03-24 03:51:10 +0300  29)    textdomain(), and is useful for libraries.  */
05d292b2 (kx 2023-03-24 03:51:10 +0300  30) # ifdef DEFAULT_TEXT_DOMAIN
05d292b2 (kx 2023-03-24 03:51:10 +0300  31) #  undef gettext
05d292b2 (kx 2023-03-24 03:51:10 +0300  32) #  define gettext(Msgid) \
05d292b2 (kx 2023-03-24 03:51:10 +0300  33)      dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
05d292b2 (kx 2023-03-24 03:51:10 +0300  34) #  undef ngettext
05d292b2 (kx 2023-03-24 03:51:10 +0300  35) #  define ngettext(Msgid1, Msgid2, N) \
05d292b2 (kx 2023-03-24 03:51:10 +0300  36)      dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
05d292b2 (kx 2023-03-24 03:51:10 +0300  37) # endif
05d292b2 (kx 2023-03-24 03:51:10 +0300  38) 
05d292b2 (kx 2023-03-24 03:51:10 +0300  39) #else
05d292b2 (kx 2023-03-24 03:51:10 +0300  40) 
05d292b2 (kx 2023-03-24 03:51:10 +0300  41) /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
05d292b2 (kx 2023-03-24 03:51:10 +0300  42)    chokes if dcgettext is defined as a macro.  So include it now, to make
05d292b2 (kx 2023-03-24 03:51:10 +0300  43)    later inclusions of <locale.h> a NOP.  We don't include <libintl.h>
05d292b2 (kx 2023-03-24 03:51:10 +0300  44)    as well because people using "gettext.h" will not include <libintl.h>,
05d292b2 (kx 2023-03-24 03:51:10 +0300  45)    and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
05d292b2 (kx 2023-03-24 03:51:10 +0300  46)    is OK.  */
05d292b2 (kx 2023-03-24 03:51:10 +0300  47) #if defined(__sun)
05d292b2 (kx 2023-03-24 03:51:10 +0300  48) # include <locale.h>
05d292b2 (kx 2023-03-24 03:51:10 +0300  49) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300  50) 
05d292b2 (kx 2023-03-24 03:51:10 +0300  51) /* Many header files from the libstdc++ coming with g++ 3.3 or newer include
05d292b2 (kx 2023-03-24 03:51:10 +0300  52)    <libintl.h>, which chokes if dcgettext is defined as a macro.  So include
05d292b2 (kx 2023-03-24 03:51:10 +0300  53)    it now, to make later inclusions of <libintl.h> a NOP.  */
05d292b2 (kx 2023-03-24 03:51:10 +0300  54) #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
05d292b2 (kx 2023-03-24 03:51:10 +0300  55) # include <cstdlib>
05d292b2 (kx 2023-03-24 03:51:10 +0300  56) # if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H
05d292b2 (kx 2023-03-24 03:51:10 +0300  57) #  include <libintl.h>
05d292b2 (kx 2023-03-24 03:51:10 +0300  58) # endif
05d292b2 (kx 2023-03-24 03:51:10 +0300  59) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300  60) 
05d292b2 (kx 2023-03-24 03:51:10 +0300  61) /* Disabled NLS.
05d292b2 (kx 2023-03-24 03:51:10 +0300  62)    The casts to 'const char *' serve the purpose of producing warnings
05d292b2 (kx 2023-03-24 03:51:10 +0300  63)    for invalid uses of the value returned from these functions.
05d292b2 (kx 2023-03-24 03:51:10 +0300  64)    On pre-ANSI systems without 'const', the config.h file is supposed to
05d292b2 (kx 2023-03-24 03:51:10 +0300  65)    contain "#define const".  */
05d292b2 (kx 2023-03-24 03:51:10 +0300  66) # undef gettext
05d292b2 (kx 2023-03-24 03:51:10 +0300  67) # define gettext(Msgid) ((const char *) (Msgid))
05d292b2 (kx 2023-03-24 03:51:10 +0300  68) # undef dgettext
05d292b2 (kx 2023-03-24 03:51:10 +0300  69) # define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
05d292b2 (kx 2023-03-24 03:51:10 +0300  70) # undef dcgettext
05d292b2 (kx 2023-03-24 03:51:10 +0300  71) # define dcgettext(Domainname, Msgid, Category) \
05d292b2 (kx 2023-03-24 03:51:10 +0300  72)     ((void) (Category), dgettext (Domainname, Msgid))
05d292b2 (kx 2023-03-24 03:51:10 +0300  73) # undef ngettext
05d292b2 (kx 2023-03-24 03:51:10 +0300  74) # define ngettext(Msgid1, Msgid2, N) \
05d292b2 (kx 2023-03-24 03:51:10 +0300  75)     ((N) == 1 \
05d292b2 (kx 2023-03-24 03:51:10 +0300  76)      ? ((void) (Msgid2), (const char *) (Msgid1)) \
05d292b2 (kx 2023-03-24 03:51:10 +0300  77)      : ((void) (Msgid1), (const char *) (Msgid2)))
05d292b2 (kx 2023-03-24 03:51:10 +0300  78) # undef dngettext
05d292b2 (kx 2023-03-24 03:51:10 +0300  79) # define dngettext(Domainname, Msgid1, Msgid2, N) \
05d292b2 (kx 2023-03-24 03:51:10 +0300  80)     ((void) (Domainname), ngettext (Msgid1, Msgid2, N))
05d292b2 (kx 2023-03-24 03:51:10 +0300  81) # undef dcngettext
05d292b2 (kx 2023-03-24 03:51:10 +0300  82) # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
05d292b2 (kx 2023-03-24 03:51:10 +0300  83)     ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N))
05d292b2 (kx 2023-03-24 03:51:10 +0300  84) # undef textdomain
05d292b2 (kx 2023-03-24 03:51:10 +0300  85) # define textdomain(Domainname) ((const char *) (Domainname))
05d292b2 (kx 2023-03-24 03:51:10 +0300  86) # undef bindtextdomain
05d292b2 (kx 2023-03-24 03:51:10 +0300  87) # define bindtextdomain(Domainname, Dirname) \
05d292b2 (kx 2023-03-24 03:51:10 +0300  88)     ((void) (Domainname), (const char *) (Dirname))
05d292b2 (kx 2023-03-24 03:51:10 +0300  89) # undef bind_textdomain_codeset
05d292b2 (kx 2023-03-24 03:51:10 +0300  90) # define bind_textdomain_codeset(Domainname, Codeset) \
05d292b2 (kx 2023-03-24 03:51:10 +0300  91)     ((void) (Domainname), (const char *) (Codeset))
05d292b2 (kx 2023-03-24 03:51:10 +0300  92) 
05d292b2 (kx 2023-03-24 03:51:10 +0300  93) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300  94) 
05d292b2 (kx 2023-03-24 03:51:10 +0300  95) /* Prefer gnulib's setlocale override over libintl's setlocale override.  */
05d292b2 (kx 2023-03-24 03:51:10 +0300  96) #ifdef GNULIB_defined_setlocale
05d292b2 (kx 2023-03-24 03:51:10 +0300  97) # undef setlocale
05d292b2 (kx 2023-03-24 03:51:10 +0300  98) # define setlocale rpl_setlocale
05d292b2 (kx 2023-03-24 03:51:10 +0300  99) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 100) 
05d292b2 (kx 2023-03-24 03:51:10 +0300 101) /* A pseudo function call that serves as a marker for the automated
05d292b2 (kx 2023-03-24 03:51:10 +0300 102)    extraction of messages, but does not call gettext().  The run-time
05d292b2 (kx 2023-03-24 03:51:10 +0300 103)    translation is done at a different place in the code.
05d292b2 (kx 2023-03-24 03:51:10 +0300 104)    The argument, String, should be a literal string.  Concatenated strings
05d292b2 (kx 2023-03-24 03:51:10 +0300 105)    and other string expressions won't work.
05d292b2 (kx 2023-03-24 03:51:10 +0300 106)    The macro's expansion is not parenthesized, so that it is suitable as
05d292b2 (kx 2023-03-24 03:51:10 +0300 107)    initializer for static 'char[]' or 'const char[]' variables.  */
05d292b2 (kx 2023-03-24 03:51:10 +0300 108) #define gettext_noop(String) String
05d292b2 (kx 2023-03-24 03:51:10 +0300 109) 
05d292b2 (kx 2023-03-24 03:51:10 +0300 110) /* The separator between msgctxt and msgid in a .mo file.  */
05d292b2 (kx 2023-03-24 03:51:10 +0300 111) #define GETTEXT_CONTEXT_GLUE "\004"
05d292b2 (kx 2023-03-24 03:51:10 +0300 112) 
05d292b2 (kx 2023-03-24 03:51:10 +0300 113) /* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
05d292b2 (kx 2023-03-24 03:51:10 +0300 114)    MSGID.  MSGCTXT and MSGID must be string literals.  MSGCTXT should be
05d292b2 (kx 2023-03-24 03:51:10 +0300 115)    short and rarely need to change.
05d292b2 (kx 2023-03-24 03:51:10 +0300 116)    The letter 'p' stands for 'particular' or 'special'.  */
05d292b2 (kx 2023-03-24 03:51:10 +0300 117) #ifdef DEFAULT_TEXT_DOMAIN
05d292b2 (kx 2023-03-24 03:51:10 +0300 118) # define pgettext(Msgctxt, Msgid) \
05d292b2 (kx 2023-03-24 03:51:10 +0300 119)    pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
05d292b2 (kx 2023-03-24 03:51:10 +0300 120) #else
05d292b2 (kx 2023-03-24 03:51:10 +0300 121) # define pgettext(Msgctxt, Msgid) \
05d292b2 (kx 2023-03-24 03:51:10 +0300 122)    pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
05d292b2 (kx 2023-03-24 03:51:10 +0300 123) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 124) #define dpgettext(Domainname, Msgctxt, Msgid) \
05d292b2 (kx 2023-03-24 03:51:10 +0300 125)   pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
05d292b2 (kx 2023-03-24 03:51:10 +0300 126) #define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
05d292b2 (kx 2023-03-24 03:51:10 +0300 127)   pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
05d292b2 (kx 2023-03-24 03:51:10 +0300 128) #ifdef DEFAULT_TEXT_DOMAIN
05d292b2 (kx 2023-03-24 03:51:10 +0300 129) # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
05d292b2 (kx 2023-03-24 03:51:10 +0300 130)    npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
05d292b2 (kx 2023-03-24 03:51:10 +0300 131) #else
05d292b2 (kx 2023-03-24 03:51:10 +0300 132) # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
05d292b2 (kx 2023-03-24 03:51:10 +0300 133)    npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
05d292b2 (kx 2023-03-24 03:51:10 +0300 134) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 135) #define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
05d292b2 (kx 2023-03-24 03:51:10 +0300 136)   npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
05d292b2 (kx 2023-03-24 03:51:10 +0300 137) #define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
05d292b2 (kx 2023-03-24 03:51:10 +0300 138)   npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
05d292b2 (kx 2023-03-24 03:51:10 +0300 139) 
05d292b2 (kx 2023-03-24 03:51:10 +0300 140) #ifdef __GNUC__
05d292b2 (kx 2023-03-24 03:51:10 +0300 141) __inline
05d292b2 (kx 2023-03-24 03:51:10 +0300 142) #else
05d292b2 (kx 2023-03-24 03:51:10 +0300 143) #ifdef __cplusplus
05d292b2 (kx 2023-03-24 03:51:10 +0300 144) inline
05d292b2 (kx 2023-03-24 03:51:10 +0300 145) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 146) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 147) static const char *
05d292b2 (kx 2023-03-24 03:51:10 +0300 148) pgettext_aux (const char *domain,
05d292b2 (kx 2023-03-24 03:51:10 +0300 149)               const char *msg_ctxt_id, const char *msgid,
05d292b2 (kx 2023-03-24 03:51:10 +0300 150)               int category)
05d292b2 (kx 2023-03-24 03:51:10 +0300 151) {
05d292b2 (kx 2023-03-24 03:51:10 +0300 152)   const char *translation = dcgettext (domain, msg_ctxt_id, category);
05d292b2 (kx 2023-03-24 03:51:10 +0300 153)   if (translation == msg_ctxt_id)
05d292b2 (kx 2023-03-24 03:51:10 +0300 154)     return msgid;
05d292b2 (kx 2023-03-24 03:51:10 +0300 155)   else
05d292b2 (kx 2023-03-24 03:51:10 +0300 156)     return translation;
05d292b2 (kx 2023-03-24 03:51:10 +0300 157) }
05d292b2 (kx 2023-03-24 03:51:10 +0300 158) 
05d292b2 (kx 2023-03-24 03:51:10 +0300 159) #ifdef __GNUC__
05d292b2 (kx 2023-03-24 03:51:10 +0300 160) __inline
05d292b2 (kx 2023-03-24 03:51:10 +0300 161) #else
05d292b2 (kx 2023-03-24 03:51:10 +0300 162) #ifdef __cplusplus
05d292b2 (kx 2023-03-24 03:51:10 +0300 163) inline
05d292b2 (kx 2023-03-24 03:51:10 +0300 164) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 165) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 166) static const char *
05d292b2 (kx 2023-03-24 03:51:10 +0300 167) npgettext_aux (const char *domain,
05d292b2 (kx 2023-03-24 03:51:10 +0300 168)                const char *msg_ctxt_id, const char *msgid,
05d292b2 (kx 2023-03-24 03:51:10 +0300 169)                const char *msgid_plural, unsigned long int n,
05d292b2 (kx 2023-03-24 03:51:10 +0300 170)                int category)
05d292b2 (kx 2023-03-24 03:51:10 +0300 171) {
05d292b2 (kx 2023-03-24 03:51:10 +0300 172)   const char *translation =
05d292b2 (kx 2023-03-24 03:51:10 +0300 173)     dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
05d292b2 (kx 2023-03-24 03:51:10 +0300 174)   if (translation == msg_ctxt_id || translation == msgid_plural)
05d292b2 (kx 2023-03-24 03:51:10 +0300 175)     return (n == 1 ? msgid : msgid_plural);
05d292b2 (kx 2023-03-24 03:51:10 +0300 176)   else
05d292b2 (kx 2023-03-24 03:51:10 +0300 177)     return translation;
05d292b2 (kx 2023-03-24 03:51:10 +0300 178) }
05d292b2 (kx 2023-03-24 03:51:10 +0300 179) 
05d292b2 (kx 2023-03-24 03:51:10 +0300 180) /* The same thing extended for non-constant arguments.  Here MSGCTXT and MSGID
05d292b2 (kx 2023-03-24 03:51:10 +0300 181)    can be arbitrary expressions.  But for string literals these macros are
05d292b2 (kx 2023-03-24 03:51:10 +0300 182)    less efficient than those above.  */
05d292b2 (kx 2023-03-24 03:51:10 +0300 183) 
05d292b2 (kx 2023-03-24 03:51:10 +0300 184) #include <string.h>
05d292b2 (kx 2023-03-24 03:51:10 +0300 185) 
05d292b2 (kx 2023-03-24 03:51:10 +0300 186) #if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \
05d292b2 (kx 2023-03-24 03:51:10 +0300 187)      /* || __STDC_VERSION__ >= 199901L */ )
05d292b2 (kx 2023-03-24 03:51:10 +0300 188) # define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
05d292b2 (kx 2023-03-24 03:51:10 +0300 189) #else
05d292b2 (kx 2023-03-24 03:51:10 +0300 190) # define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0
05d292b2 (kx 2023-03-24 03:51:10 +0300 191) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 192) 
05d292b2 (kx 2023-03-24 03:51:10 +0300 193) #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
05d292b2 (kx 2023-03-24 03:51:10 +0300 194) #include <stdlib.h>
05d292b2 (kx 2023-03-24 03:51:10 +0300 195) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 196) 
05d292b2 (kx 2023-03-24 03:51:10 +0300 197) #define pgettext_expr(Msgctxt, Msgid) \
05d292b2 (kx 2023-03-24 03:51:10 +0300 198)   dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
05d292b2 (kx 2023-03-24 03:51:10 +0300 199) #define dpgettext_expr(Domainname, Msgctxt, Msgid) \
05d292b2 (kx 2023-03-24 03:51:10 +0300 200)   dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
05d292b2 (kx 2023-03-24 03:51:10 +0300 201) 
05d292b2 (kx 2023-03-24 03:51:10 +0300 202) #ifdef __GNUC__
05d292b2 (kx 2023-03-24 03:51:10 +0300 203) __inline
05d292b2 (kx 2023-03-24 03:51:10 +0300 204) #else
05d292b2 (kx 2023-03-24 03:51:10 +0300 205) #ifdef __cplusplus
05d292b2 (kx 2023-03-24 03:51:10 +0300 206) inline
05d292b2 (kx 2023-03-24 03:51:10 +0300 207) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 208) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 209) static const char *
05d292b2 (kx 2023-03-24 03:51:10 +0300 210) dcpgettext_expr (const char *domain,
05d292b2 (kx 2023-03-24 03:51:10 +0300 211)                  const char *msgctxt, const char *msgid,
05d292b2 (kx 2023-03-24 03:51:10 +0300 212)                  int category)
05d292b2 (kx 2023-03-24 03:51:10 +0300 213) {
05d292b2 (kx 2023-03-24 03:51:10 +0300 214)   size_t msgctxt_len = strlen (msgctxt) + 1;
05d292b2 (kx 2023-03-24 03:51:10 +0300 215)   size_t msgid_len = strlen (msgid) + 1;
05d292b2 (kx 2023-03-24 03:51:10 +0300 216)   const char *translation;
05d292b2 (kx 2023-03-24 03:51:10 +0300 217) #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
05d292b2 (kx 2023-03-24 03:51:10 +0300 218)   char msg_ctxt_id[msgctxt_len + msgid_len];
05d292b2 (kx 2023-03-24 03:51:10 +0300 219) #else
05d292b2 (kx 2023-03-24 03:51:10 +0300 220)   char buf[1024];
05d292b2 (kx 2023-03-24 03:51:10 +0300 221)   char *msg_ctxt_id =
05d292b2 (kx 2023-03-24 03:51:10 +0300 222)     (msgctxt_len + msgid_len <= sizeof (buf)
05d292b2 (kx 2023-03-24 03:51:10 +0300 223)      ? buf
05d292b2 (kx 2023-03-24 03:51:10 +0300 224)      : (char *) malloc (msgctxt_len + msgid_len));
05d292b2 (kx 2023-03-24 03:51:10 +0300 225)   if (msg_ctxt_id != NULL)
05d292b2 (kx 2023-03-24 03:51:10 +0300 226) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 227)     {
05d292b2 (kx 2023-03-24 03:51:10 +0300 228)       int found_translation;
05d292b2 (kx 2023-03-24 03:51:10 +0300 229)       memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
05d292b2 (kx 2023-03-24 03:51:10 +0300 230)       msg_ctxt_id[msgctxt_len - 1] = '\004';
05d292b2 (kx 2023-03-24 03:51:10 +0300 231)       memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
05d292b2 (kx 2023-03-24 03:51:10 +0300 232)       translation = dcgettext (domain, msg_ctxt_id, category);
05d292b2 (kx 2023-03-24 03:51:10 +0300 233)       found_translation = (translation != msg_ctxt_id);
05d292b2 (kx 2023-03-24 03:51:10 +0300 234) #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
05d292b2 (kx 2023-03-24 03:51:10 +0300 235)       if (msg_ctxt_id != buf)
05d292b2 (kx 2023-03-24 03:51:10 +0300 236)         free (msg_ctxt_id);
05d292b2 (kx 2023-03-24 03:51:10 +0300 237) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 238)       if (found_translation)
05d292b2 (kx 2023-03-24 03:51:10 +0300 239)         return translation;
05d292b2 (kx 2023-03-24 03:51:10 +0300 240)     }
05d292b2 (kx 2023-03-24 03:51:10 +0300 241)   return msgid;
05d292b2 (kx 2023-03-24 03:51:10 +0300 242) }
05d292b2 (kx 2023-03-24 03:51:10 +0300 243) 
05d292b2 (kx 2023-03-24 03:51:10 +0300 244) #define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
05d292b2 (kx 2023-03-24 03:51:10 +0300 245)   dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
05d292b2 (kx 2023-03-24 03:51:10 +0300 246) #define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
05d292b2 (kx 2023-03-24 03:51:10 +0300 247)   dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
05d292b2 (kx 2023-03-24 03:51:10 +0300 248) 
05d292b2 (kx 2023-03-24 03:51:10 +0300 249) #ifdef __GNUC__
05d292b2 (kx 2023-03-24 03:51:10 +0300 250) __inline
05d292b2 (kx 2023-03-24 03:51:10 +0300 251) #else
05d292b2 (kx 2023-03-24 03:51:10 +0300 252) #ifdef __cplusplus
05d292b2 (kx 2023-03-24 03:51:10 +0300 253) inline
05d292b2 (kx 2023-03-24 03:51:10 +0300 254) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 255) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 256) static const char *
05d292b2 (kx 2023-03-24 03:51:10 +0300 257) dcnpgettext_expr (const char *domain,
05d292b2 (kx 2023-03-24 03:51:10 +0300 258)                   const char *msgctxt, const char *msgid,
05d292b2 (kx 2023-03-24 03:51:10 +0300 259)                   const char *msgid_plural, unsigned long int n,
05d292b2 (kx 2023-03-24 03:51:10 +0300 260)                   int category)
05d292b2 (kx 2023-03-24 03:51:10 +0300 261) {
05d292b2 (kx 2023-03-24 03:51:10 +0300 262)   size_t msgctxt_len = strlen (msgctxt) + 1;
05d292b2 (kx 2023-03-24 03:51:10 +0300 263)   size_t msgid_len = strlen (msgid) + 1;
05d292b2 (kx 2023-03-24 03:51:10 +0300 264)   const char *translation;
05d292b2 (kx 2023-03-24 03:51:10 +0300 265) #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
05d292b2 (kx 2023-03-24 03:51:10 +0300 266)   char msg_ctxt_id[msgctxt_len + msgid_len];
05d292b2 (kx 2023-03-24 03:51:10 +0300 267) #else
05d292b2 (kx 2023-03-24 03:51:10 +0300 268)   char buf[1024];
05d292b2 (kx 2023-03-24 03:51:10 +0300 269)   char *msg_ctxt_id =
05d292b2 (kx 2023-03-24 03:51:10 +0300 270)     (msgctxt_len + msgid_len <= sizeof (buf)
05d292b2 (kx 2023-03-24 03:51:10 +0300 271)      ? buf
05d292b2 (kx 2023-03-24 03:51:10 +0300 272)      : (char *) malloc (msgctxt_len + msgid_len));
05d292b2 (kx 2023-03-24 03:51:10 +0300 273)   if (msg_ctxt_id != NULL)
05d292b2 (kx 2023-03-24 03:51:10 +0300 274) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 275)     {
05d292b2 (kx 2023-03-24 03:51:10 +0300 276)       int found_translation;
05d292b2 (kx 2023-03-24 03:51:10 +0300 277)       memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
05d292b2 (kx 2023-03-24 03:51:10 +0300 278)       msg_ctxt_id[msgctxt_len - 1] = '\004';
05d292b2 (kx 2023-03-24 03:51:10 +0300 279)       memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
05d292b2 (kx 2023-03-24 03:51:10 +0300 280)       translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
05d292b2 (kx 2023-03-24 03:51:10 +0300 281)       found_translation = !(translation == msg_ctxt_id || translation == msgid_plural);
05d292b2 (kx 2023-03-24 03:51:10 +0300 282) #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
05d292b2 (kx 2023-03-24 03:51:10 +0300 283)       if (msg_ctxt_id != buf)
05d292b2 (kx 2023-03-24 03:51:10 +0300 284)         free (msg_ctxt_id);
05d292b2 (kx 2023-03-24 03:51:10 +0300 285) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 286)       if (found_translation)
05d292b2 (kx 2023-03-24 03:51:10 +0300 287)         return translation;
05d292b2 (kx 2023-03-24 03:51:10 +0300 288)     }
05d292b2 (kx 2023-03-24 03:51:10 +0300 289)   return (n == 1 ? msgid : msgid_plural);
05d292b2 (kx 2023-03-24 03:51:10 +0300 290) }
05d292b2 (kx 2023-03-24 03:51:10 +0300 291) 
05d292b2 (kx 2023-03-24 03:51:10 +0300 292) #endif /* _LIBGETTEXT_H */