Skip to content

Commit d8b2d44

Browse files
committed
XXX add gnulib dirname.h gettext.h
1 parent c6f658e commit d8b2d44

File tree

2 files changed

+340
-0
lines changed

2 files changed

+340
-0
lines changed

src/gnulib/dirname.h

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/* Take file names apart into directory and base names.
2+
3+
Copyright (C) 1998, 2001, 2003-2006 Free Software Foundation, Inc.
4+
5+
This program is free software; you can redistribute it and/or modify
6+
it under the terms of the GNU General Public License as published by
7+
the Free Software Foundation; either version 2, or (at your option)
8+
any later version.
9+
10+
This program is distributed in the hope that it will be useful,
11+
but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
GNU General Public License for more details.
14+
15+
You should have received a copy of the GNU General Public License
16+
along with this program; if not, write to the Free Software Foundation,
17+
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
18+
19+
#ifndef DIRNAME_H_
20+
# define DIRNAME_H_ 1
21+
22+
# include <stdbool.h>
23+
# include <stddef.h>
24+
25+
# ifndef DIRECTORY_SEPARATOR
26+
# define DIRECTORY_SEPARATOR '/'
27+
# endif
28+
29+
# ifndef ISSLASH
30+
# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
31+
# endif
32+
33+
# ifndef FILE_SYSTEM_PREFIX_LEN
34+
# if FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX
35+
/* This internal macro assumes ASCII, but all hosts that support drive
36+
letters use ASCII. */
37+
# define _IS_DRIVE_LETTER(c) (((unsigned int) (c) | ('a' - 'A')) - 'a' \
38+
<= 'z' - 'a')
39+
# define FILE_SYSTEM_PREFIX_LEN(Filename) \
40+
(_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0)
41+
# else
42+
# define FILE_SYSTEM_PREFIX_LEN(Filename) 0
43+
# endif
44+
# endif
45+
46+
# ifndef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
47+
# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
48+
# endif
49+
50+
# ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
51+
# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
52+
# endif
53+
54+
# if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
55+
# define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)])
56+
# else
57+
# define IS_ABSOLUTE_FILE_NAME(F) \
58+
(ISSLASH ((F)[0]) || 0 < FILE_SYSTEM_PREFIX_LEN (F))
59+
# endif
60+
# define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F))
61+
62+
char *base_name (char const *file);
63+
char *dir_name (char const *file);
64+
size_t base_len (char const *file);
65+
size_t dir_len (char const *file);
66+
char *last_component (char const *file);
67+
68+
bool strip_trailing_slashes (char *file);
69+
70+
#endif /* not DIRNAME_H_ */

src/gnulib/gettext.h

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

0 commit comments

Comments
 (0)