git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@108 3789f03b-4d11-0410-bbf8-ca57d06f2519tags/v0.0.90
Notes on the Free Translation Project | |||||
************************************* | |||||
Free software is going international! The Free Translation Project is | |||||
a way to get maintainers of free software, translators, and users all | |||||
together, so that will gradually become able to speak many languages. | |||||
A few packages already provide translations for their messages. | |||||
If you found this `ABOUT-NLS' file inside a distribution, you may | |||||
assume that the distributed package does use GNU `gettext' internally, | |||||
itself available at your nearest GNU archive site. But you do _not_ | |||||
need to install GNU `gettext' prior to configuring, installing or using | |||||
this package with messages translated. | |||||
Installers will find here some useful hints. These notes also | |||||
explain how users should proceed for getting the programs to use the | |||||
available translations. They tell how people wanting to contribute and | |||||
work at translations should contact the appropriate team. | |||||
When reporting bugs in the `intl/' directory or bugs which may be | |||||
related to internationalization, you should tell about the version of | |||||
`gettext' which is used. The information can be found in the | |||||
`intl/VERSION' file, in internationalized packages. | |||||
Quick configuration advice | |||||
========================== | |||||
If you want to exploit the full power of internationalization, you | |||||
should configure it using | |||||
./configure --with-included-gettext | |||||
to force usage of internationalizing routines provided within this | |||||
package, despite the existence of internationalizing capabilities in the | |||||
operating system where this package is being installed. So far, only | |||||
the `gettext' implementation in the GNU C library version 2 provides as | |||||
many features (such as locale alias, message inheritance, automatic | |||||
charset conversion or plural form handling) as the implementation here. | |||||
It is also not possible to offer this additional functionality on top | |||||
of a `catgets' implementation. Future versions of GNU `gettext' will | |||||
very likely convey even more functionality. So it might be a good idea | |||||
to change to GNU `gettext' as soon as possible. | |||||
So you need _not_ provide this option if you are using GNU libc 2 or | |||||
you have installed a recent copy of the GNU gettext package with the | |||||
included `libintl'. | |||||
INSTALL Matters | |||||
=============== | |||||
Some packages are "localizable" when properly installed; the programs | |||||
they contain can be made to speak your own native language. Most such | |||||
packages use GNU `gettext'. Other packages have their own ways to | |||||
internationalization, predating GNU `gettext'. | |||||
By default, this package will be installed to allow translation of | |||||
messages. It will automatically detect whether the system already | |||||
provides the GNU `gettext' functions. If not, the GNU `gettext' own | |||||
library will be used. This library is wholly contained within this | |||||
package, usually in the `intl/' subdirectory, so prior installation of | |||||
the GNU `gettext' package is _not_ required. Installers may use | |||||
special options at configuration time for changing the default | |||||
behaviour. The commands: | |||||
./configure --with-included-gettext | |||||
./configure --disable-nls | |||||
will respectively bypass any pre-existing `gettext' to use the | |||||
internationalizing routines provided within this package, or else, | |||||
_totally_ disable translation of messages. | |||||
When you already have GNU `gettext' installed on your system and run | |||||
configure without an option for your new package, `configure' will | |||||
probably detect the previously built and installed `libintl.a' file and | |||||
will decide to use this. This might be not what is desirable. You | |||||
should use the more recent version of the GNU `gettext' library. I.e. | |||||
if the file `intl/VERSION' shows that the library which comes with this | |||||
package is more recent, you should use | |||||
./configure --with-included-gettext | |||||
to prevent auto-detection. | |||||
The configuration process will not test for the `catgets' function | |||||
and therefore it will not be used. The reason is that even an | |||||
emulation of `gettext' on top of `catgets' could not provide all the | |||||
extensions of the GNU `gettext' library. | |||||
Internationalized packages have usually many `po/LL.po' files, where | |||||
LL gives an ISO 639 two-letter code identifying the language. Unless | |||||
translations have been forbidden at `configure' time by using the | |||||
`--disable-nls' switch, all available translations are installed | |||||
together with the package. However, the environment variable `LINGUAS' | |||||
may be set, prior to configuration, to limit the installed set. | |||||
`LINGUAS' should then contain a space separated list of two-letter | |||||
codes, stating which languages are allowed. | |||||
Using This Package | |||||
================== | |||||
As a user, if your language has been installed for this package, you | |||||
only have to set the `LANG' environment variable to the appropriate | |||||
`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, | |||||
and `CC' is an ISO 3166 two-letter country code. For example, let's | |||||
suppose that you speak German and live in Germany. At the shell | |||||
prompt, merely execute `setenv LANG de_DE' (in `csh'), | |||||
`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). | |||||
This can be done from your `.login' or `.profile' file, once and for | |||||
all. | |||||
You might think that the country code specification is redundant. | |||||
But in fact, some languages have dialects in different countries. For | |||||
example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The | |||||
country code serves to distinguish the dialects. | |||||
The locale naming convention of `LL_CC', with `LL' denoting the | |||||
language and `CC' denoting the country, is the one use on systems based | |||||
on GNU libc. On other systems, some variations of this scheme are | |||||
used, such as `LL' or `LL_CC.ENCODING'. You can get the list of | |||||
locales supported by your system for your country by running the command | |||||
`locale -a | grep '^LL''. | |||||
Not all programs have translations for all languages. By default, an | |||||
English message is shown in place of a nonexistent translation. If you | |||||
understand other languages, you can set up a priority list of languages. | |||||
This is done through a different environment variable, called | |||||
`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' | |||||
for the purpose of message handling, but you still need to have `LANG' | |||||
set to the primary language; this is required by other parts of the | |||||
system libraries. For example, some Swedish users who would rather | |||||
read translations in German than English for when Swedish is not | |||||
available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. | |||||
Special advice for Norwegian users: The language code for Norwegian | |||||
bokma*l changed from `no' to `nb' recently (in 2003). During the | |||||
transition period, while some message catalogs for this language are | |||||
installed under `nb' and some older ones under `no', it's recommended | |||||
for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and | |||||
older translations are used. | |||||
In the `LANGUAGE' environment variable, but not in the `LANG' | |||||
environment variable, `LL_CC' combinations can be abbreviated as `LL' | |||||
to denote the language's main dialect. For example, `de' is equivalent | |||||
to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' | |||||
(Portuguese as spoken in Portugal) in this context. | |||||
Translating Teams | |||||
================= | |||||
For the Free Translation Project to be a success, we need interested | |||||
people who like their own language and write it well, and who are also | |||||
able to synergize with other translators speaking the same language. | |||||
Each translation team has its own mailing list. The up-to-date list of | |||||
teams can be found at the Free Translation Project's homepage, | |||||
`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" | |||||
area. | |||||
If you'd like to volunteer to _work_ at translating messages, you | |||||
should become a member of the translating team for your own language. | |||||
The subscribing address is _not_ the same as the list itself, it has | |||||
`-request' appended. For example, speakers of Swedish can send a | |||||
message to `sv-request@li.org', having this message body: | |||||
subscribe | |||||
Keep in mind that team members are expected to participate | |||||
_actively_ in translations, or at solving translational difficulties, | |||||
rather than merely lurking around. If your team does not exist yet and | |||||
you want to start one, or if you are unsure about what to do or how to | |||||
get started, please write to `translation@iro.umontreal.ca' to reach the | |||||
coordinator for all translator teams. | |||||
The English team is special. It works at improving and uniformizing | |||||
the terminology in use. Proven linguistic skill are praised more than | |||||
programming skill, here. | |||||
Available Packages | |||||
================== | |||||
Languages are not equally supported in all packages. The following | |||||
matrix shows the current state of internationalization, as of January | |||||
2004. The matrix shows, in regard of each package, for which languages | |||||
PO files have been submitted to translation coordination, with a | |||||
translation percentage of at least 50%. | |||||
Ready PO files af am ar az be bg bs ca cs da de el en en_GB eo es | |||||
+----------------------------------------------------+ | |||||
a2ps | [] [] [] [] | | |||||
aegis | () | | |||||
ant-phone | () | | |||||
anubis | | | |||||
ap-utils | | | |||||
aspell | [] | | |||||
bash | [] [] [] [] | | |||||
batchelor | | | |||||
bfd | [] [] | | |||||
binutils | [] [] | | |||||
bison | [] [] [] | | |||||
bluez-pin | [] [] [] | | |||||
clisp | | | |||||
clisp | [] [] [] | | |||||
console-tools | [] [] | | |||||
coreutils | [] [] [] [] | | |||||
cpio | [] [] [] | | |||||
darkstat | [] () [] | | |||||
diffutils | [] [] [] [] [] [] [] | | |||||
e2fsprogs | [] [] [] | | |||||
enscript | [] [] [] [] | | |||||
error | [] [] [] [] [] | | |||||
fetchmail | [] () [] [] [] [] | | |||||
fileutils | [] [] [] | | |||||
findutils | [] [] [] [] [] [] [] | | |||||
flex | [] [] [] [] | | |||||
fslint | | | |||||
gas | [] | | |||||
gawk | [] [] [] [] | | |||||
gbiff | [] | | |||||
gcal | [] | | |||||
gcc | [] [] | | |||||
gettext | [] [] [] [] [] | | |||||
gettext-examples | [] [] [] [] | | |||||
gettext-runtime | [] [] [] [] [] | | |||||
gettext-tools | [] [] [] | | |||||
gimp-print | [] [] [] [] [] | | |||||
gliv | | | |||||
glunarclock | [] [] | | |||||
gnubiff | [] | | |||||
gnucash | [] () [] [] | | |||||
gnucash-glossary | [] () [] | | |||||
gnupg | [] () [] [] [] [] | | |||||
gpe-aerial | [] | | |||||
gpe-beam | [] [] | | |||||
gpe-calendar | [] [] | | |||||
gpe-clock | [] [] | | |||||
gpe-conf | [] [] | | |||||
gpe-contacts | [] [] | | |||||
gpe-edit | [] | | |||||
gpe-go | [] | | |||||
gpe-login | [] [] | | |||||
gpe-ownerinfo | [] [] | | |||||
gpe-sketchbook | [] [] | | |||||
gpe-su | [] [] | | |||||
gpe-taskmanager | [] [] | | |||||
gpe-timesheet | [] | | |||||
gpe-today | [] [] | | |||||
gpe-todo | [] [] | | |||||
gphoto2 | [] [] [] [] | | |||||
gprof | [] [] [] | | |||||
gpsdrive | () () () | | |||||
gramadoir | [] | | |||||
grep | [] [] [] [] [] [] | | |||||
gretl | [] | | |||||
gtick | [] () | | |||||
hello | [] [] [] [] [] [] | | |||||
id-utils | [] [] | | |||||
indent | [] [] [] [] | | |||||
iso_3166 | [] [] [] [] [] [] [] [] [] [] | | |||||
iso_3166_1 | [] [] [] [] [] [] | | |||||
iso_3166_2 | | | |||||
iso_3166_3 | [] | | |||||
iso_4217 | [] [] [] [] | | |||||
iso_639 | | | |||||
jpilot | [] [] [] | | |||||
jtag | | | |||||
jwhois | [] | | |||||
kbd | [] [] [] [] [] | | |||||
latrine | () | | |||||
ld | [] [] | | |||||
libc | [] [] [] [] [] [] | | |||||
libgpewidget | [] [] | | |||||
libiconv | [] [] [] [] [] | | |||||
lifelines | [] () | | |||||
lilypond | [] | | |||||
lingoteach | | | |||||
lingoteach_lessons | () () | | |||||
lynx | [] [] [] [] | | |||||
m4 | [] [] [] [] | | |||||
mailutils | [] [] | | |||||
make | [] [] [] | | |||||
man-db | [] () [] [] () | | |||||
minicom | [] [] [] | | |||||
mysecretdiary | [] [] [] | | |||||
nano | [] () [] [] [] | | |||||
nano_1_0 | [] () [] [] [] | | |||||
opcodes | [] | | |||||
parted | [] [] [] [] [] | | |||||
ptx | [] [] [] [] [] | | |||||
python | | | |||||
radius | [] | | |||||
recode | [] [] [] [] [] [] [] | | |||||
rpm | [] [] | | |||||
screem | | | |||||
scrollkeeper | [] [] [] [] [] [] | | |||||
sed | [] [] [] [] [] [] | | |||||
sh-utils | [] [] [] | | |||||
shared-mime-info | | | |||||
sharutils | [] [] [] [] [] [] | | |||||
silky | () | | |||||
skencil | [] () [] | | |||||
sketch | [] () [] | | |||||
soundtracker | [] [] [] | | |||||
sp | [] | | |||||
tar | [] [] [] [] | | |||||
texinfo | [] [] [] | | |||||
textutils | [] [] [] [] | | |||||
tin | () () | | |||||
tp-robot | | | |||||
tuxpaint | [] [] [] [] [] [] [] | | |||||
unicode-han-tra... | | | |||||
unicode-transla... | | | |||||
util-linux | [] [] [] [] [] | | |||||
vorbis-tools | [] [] [] [] | | |||||
wastesedge | () | | |||||
wdiff | [] [] [] [] | | |||||
wget | [] [] [] [] [] [] | | |||||
xchat | [] [] [] [] | | |||||
xfree86_xkb_xml | [] [] | | |||||
xpad | [] | | |||||
+----------------------------------------------------+ | |||||
af am ar az be bg bs ca cs da de el en en_GB eo es | |||||
4 0 0 1 9 4 1 40 41 60 78 17 1 5 13 68 | |||||
et eu fa fi fr ga gl he hr hu id is it ja ko lg | |||||
+-------------------------------------------------+ | |||||
a2ps | [] [] [] () () | | |||||
aegis | | | |||||
ant-phone | [] | | |||||
anubis | [] | | |||||
ap-utils | [] | | |||||
aspell | [] [] | | |||||
bash | [] [] | | |||||
batchelor | [] [] | | |||||
bfd | [] | | |||||
binutils | [] [] | | |||||
bison | [] [] [] [] | | |||||
bluez-pin | [] [] [] [] [] | | |||||
clisp | | | |||||
clisp | [] | | |||||
console-tools | | | |||||
coreutils | [] [] [] [] [] [] | | |||||
cpio | [] [] [] [] | | |||||
darkstat | () [] [] [] | | |||||
diffutils | [] [] [] [] [] [] [] | | |||||
e2fsprogs | | | |||||
enscript | [] [] | | |||||
error | [] [] [] [] | | |||||
fetchmail | [] | | |||||
fileutils | [] [] [] [] [] [] | | |||||
findutils | [] [] [] [] [] [] [] [] [] [] [] | | |||||
flex | [] [] [] | | |||||
fslint | [] | | |||||
gas | [] | | |||||
gawk | [] [] [] | | |||||
gbiff | [] | | |||||
gcal | [] | | |||||
gcc | [] | | |||||
gettext | [] [] [] | | |||||
gettext-examples | [] [] | | |||||
gettext-runtime | [] [] [] [] [] | | |||||
gettext-tools | [] [] [] | | |||||
gimp-print | [] [] | | |||||
gliv | () | | |||||
glunarclock | [] [] [] [] | | |||||
gnubiff | [] | | |||||
gnucash | () [] | | |||||
gnucash-glossary | [] | | |||||
gnupg | [] [] [] [] [] [] [] | | |||||
gpe-aerial | [] | | |||||
gpe-beam | [] | | |||||
gpe-calendar | [] [] [] | | |||||
gpe-clock | [] | | |||||
gpe-conf | [] | | |||||
gpe-contacts | [] [] | | |||||
gpe-edit | [] [] | | |||||
gpe-go | [] | | |||||
gpe-login | [] [] | | |||||
gpe-ownerinfo | [] [] [] | | |||||
gpe-sketchbook | [] | | |||||
gpe-su | [] | | |||||
gpe-taskmanager | [] | | |||||
gpe-timesheet | [] [] [] | | |||||
gpe-today | [] [] | | |||||
gpe-todo | [] [] | | |||||
gphoto2 | [] [] [] | | |||||
gprof | [] [] | | |||||
gpsdrive | () () () | | |||||
gramadoir | [] [] | | |||||
grep | [] [] [] [] [] [] [] [] [] [] [] | | |||||
gretl | [] [] | | |||||
gtick | [] [] [] | | |||||
hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | | |||||
id-utils | [] [] [] [] | | |||||
indent | [] [] [] [] [] [] [] [] [] | | |||||
iso_3166 | [] [] [] [] [] [] [] | | |||||
iso_3166_1 | [] [] [] [] [] | | |||||
iso_3166_2 | | | |||||
iso_3166_3 | | | |||||
iso_4217 | [] [] [] [] [] [] | | |||||
iso_639 | | | |||||
jpilot | [] () | | |||||
jtag | [] | | |||||
jwhois | [] [] [] [] | | |||||
kbd | [] | | |||||
latrine | [] | | |||||
ld | [] | | |||||
libc | [] [] [] [] [] [] | | |||||
libgpewidget | [] [] [] [] | | |||||
libiconv | [] [] [] [] [] [] [] [] [] | | |||||
lifelines | () | | |||||
lilypond | [] | | |||||
lingoteach | [] [] | | |||||
lingoteach_lessons | | | |||||
lynx | [] [] [] [] | | |||||
m4 | [] [] [] [] | | |||||
mailutils | | | |||||
make | [] [] [] [] [] [] | | |||||
man-db | () () | | |||||
minicom | [] [] [] [] | | |||||
mysecretdiary | [] [] | | |||||
nano | [] [] [] [] | | |||||
nano_1_0 | [] [] [] [] | | |||||
opcodes | [] | | |||||
parted | [] [] [] | | |||||
ptx | [] [] [] [] [] [] [] | | |||||
python | | | |||||
radius | [] | | |||||
recode | [] [] [] [] [] [] | | |||||
rpm | [] [] | | |||||
screem | | | |||||
scrollkeeper | [] | | |||||
sed | [] [] [] [] [] [] [] [] [] | | |||||
sh-utils | [] [] [] [] [] [] [] | | |||||
shared-mime-info | [] [] [] | | |||||
sharutils | [] [] [] [] [] | | |||||
silky | () [] () () | | |||||
skencil | [] | | |||||
sketch | [] | | |||||
soundtracker | [] [] | | |||||
sp | [] () | | |||||
tar | [] [] [] [] [] [] [] [] [] | | |||||
texinfo | [] [] [] [] | | |||||
textutils | [] [] [] [] [] [] | | |||||
tin | [] () | | |||||
tp-robot | [] | | |||||
tuxpaint | [] [] [] [] [] [] [] [] [] | | |||||
unicode-han-tra... | | | |||||
unicode-transla... | [] [] | | |||||
util-linux | [] [] [] [] () [] | | |||||
vorbis-tools | [] | | |||||
wastesedge | () | | |||||
wdiff | [] [] [] [] [] [] | | |||||
wget | [] [] [] [] [] [] [] | | |||||
xchat | [] [] [] | | |||||
xfree86_xkb_xml | [] [] | | |||||
xpad | [] [] | | |||||
+-------------------------------------------------+ | |||||
et eu fa fi fr ga gl he hr hu id is it ja ko lg | |||||
22 2 1 26 106 28 24 8 10 41 33 1 26 33 12 0 | |||||
lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru | |||||
+-----------------------------------------------------+ | |||||
a2ps | [] [] () () [] [] [] | | |||||
aegis | () () () | | |||||
ant-phone | [] [] | | |||||
anubis | [] [] [] [] [] [] | | |||||
ap-utils | [] () [] | | |||||
aspell | [] | | |||||
bash | [] [] [] | | |||||
batchelor | [] | | |||||
bfd | [] | | |||||
binutils | [] | | |||||
bison | [] [] [] [] [] | | |||||
bluez-pin | [] [] [] | | |||||
clisp | | | |||||
clisp | [] | | |||||
console-tools | [] | | |||||
coreutils | [] [] | | |||||
cpio | [] [] [] [] [] | | |||||
darkstat | [] [] [] [] | | |||||
diffutils | [] [] [] [] [] [] | | |||||
e2fsprogs | [] | | |||||
enscript | [] [] [] [] | | |||||
error | [] [] [] | | |||||
fetchmail | [] [] () [] | | |||||
fileutils | [] [] [] | | |||||
findutils | [] [] [] [] [] | | |||||
flex | [] [] [] [] | | |||||
fslint | [] [] | | |||||
gas | | | |||||
gawk | [] [] [] | | |||||
gbiff | [] [] | | |||||
gcal | | | |||||
gcc | | | |||||
gettext | [] [] [] | | |||||
gettext-examples | [] [] [] | | |||||
gettext-runtime | [] [] [] [] | | |||||
gettext-tools | [] [] | | |||||
gimp-print | [] | | |||||
gliv | [] [] [] | | |||||
glunarclock | [] [] [] [] | | |||||
gnubiff | [] | | |||||
gnucash | [] [] () [] | | |||||
gnucash-glossary | [] [] | | |||||
gnupg | [] | | |||||
gpe-aerial | [] [] [] [] | | |||||
gpe-beam | [] [] [] [] | | |||||
gpe-calendar | [] [] [] [] | | |||||
gpe-clock | [] [] [] [] | | |||||
gpe-conf | [] [] [] [] | | |||||
gpe-contacts | [] [] [] [] | | |||||
gpe-edit | [] [] [] [] | | |||||
gpe-go | [] [] [] | | |||||
gpe-login | [] [] [] [] | | |||||
gpe-ownerinfo | [] [] [] [] | | |||||
gpe-sketchbook | [] [] [] [] | | |||||
gpe-su | [] [] [] [] | | |||||
gpe-taskmanager | [] [] [] [] | | |||||
gpe-timesheet | [] [] [] [] | | |||||
gpe-today | [] [] [] [] | | |||||
gpe-todo | [] [] [] [] | | |||||
gphoto2 | [] | | |||||
gprof | [] [] | | |||||
gpsdrive | () () [] | | |||||
gramadoir | () [] | | |||||
grep | [] [] [] [] [] | | |||||
gretl | | | |||||
gtick | [] [] [] | | |||||
hello | [] [] [] [] [] [] [] [] [] [] | | |||||
id-utils | [] [] [] [] | | |||||
indent | [] [] [] [] | | |||||
iso_3166 | [] [] [] | | |||||
iso_3166_1 | [] [] | | |||||
iso_3166_2 | | | |||||
iso_3166_3 | [] | | |||||
iso_4217 | [] [] [] [] [] [] [] [] | | |||||
iso_639 | [] | | |||||
jpilot | () () | | |||||
jtag | | | |||||
jwhois | [] [] [] [] () | | |||||
kbd | [] [] [] | | |||||
latrine | [] | | |||||
ld | | | |||||
libc | [] [] [] [] | | |||||
libgpewidget | [] [] [] | | |||||
libiconv | [] [] [] [] [] | | |||||
lifelines | | | |||||
lilypond | | | |||||
lingoteach | | | |||||
lingoteach_lessons | | | |||||
lynx | [] [] [] | | |||||
m4 | [] [] [] [] [] | | |||||
mailutils | [] [] [] | | |||||
make | [] [] [] [] | | |||||
man-db | [] | | |||||
minicom | [] [] [] [] | | |||||
mysecretdiary | [] [] [] | | |||||
nano | [] [] [] [] [] | | |||||
nano_1_0 | [] [] [] [] [] [] | | |||||
opcodes | [] [] | | |||||
parted | [] [] [] [] | | |||||
ptx | [] [] [] [] [] [] [] [] | | |||||
python | | | |||||
radius | [] [] | | |||||
recode | [] [] [] [] | | |||||
rpm | [] [] [] | | |||||
screem | | | |||||
scrollkeeper | [] [] [] [] [] | | |||||
sed | [] [] [] | | |||||
sh-utils | [] [] | | |||||
shared-mime-info | [] [] | | |||||
sharutils | [] [] | | |||||
silky | () | | |||||
skencil | [] [] | | |||||
sketch | [] [] | | |||||
soundtracker | | | |||||
sp | | | |||||
tar | [] [] [] [] [] [] | | |||||
texinfo | [] [] [] [] | | |||||
textutils | [] [] | | |||||
tin | | | |||||
tp-robot | [] | | |||||
tuxpaint | [] [] [] [] [] [] [] [] | | |||||
unicode-han-tra... | | | |||||
unicode-transla... | | | |||||
util-linux | [] [] [] | | |||||
vorbis-tools | [] [] [] | | |||||
wastesedge | | | |||||
wdiff | [] [] [] [] [] | | |||||
wget | [] [] [] | | |||||
xchat | [] [] [] | | |||||
xfree86_xkb_xml | [] [] | | |||||
xpad | [] [] | | |||||
+-----------------------------------------------------+ | |||||
lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru | |||||
1 2 0 3 12 0 10 69 6 7 1 40 26 36 76 63 | |||||
sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu | |||||
+-----------------------------------------------------+ | |||||
a2ps | [] [] [] [] | 16 | |||||
aegis | | 0 | |||||
ant-phone | | 3 | |||||
anubis | [] [] | 9 | |||||
ap-utils | () | 3 | |||||
aspell | | 4 | |||||
bash | | 9 | |||||
batchelor | | 3 | |||||
bfd | [] [] | 6 | |||||
binutils | [] [] [] | 8 | |||||
bison | [] [] | 14 | |||||
bluez-pin | [] [] [] | 14 | |||||
clisp | | 0 | |||||
clisp | | 5 | |||||
console-tools | | 3 | |||||
coreutils | [] [] [] [] | 16 | |||||
cpio | [] [] | 14 | |||||
darkstat | [] [] [] () () | 12 | |||||
diffutils | [] [] [] | 23 | |||||
e2fsprogs | [] [] | 6 | |||||
enscript | [] [] | 12 | |||||
error | [] [] [] | 15 | |||||
fetchmail | [] [] | 11 | |||||
fileutils | [] [] [] [] [] | 17 | |||||
findutils | [] [] [] [] [] [] | 29 | |||||
flex | [] [] | 13 | |||||
fslint | | 3 | |||||
gas | [] | 3 | |||||
gawk | [] [] | 12 | |||||
gbiff | | 4 | |||||
gcal | [] [] | 4 | |||||
gcc | [] | 4 | |||||
gettext | [] [] [] [] [] | 16 | |||||
gettext-examples | [] [] [] [] [] | 14 | |||||
gettext-runtime | [] [] [] [] [] [] [] [] | 22 | |||||
gettext-tools | [] [] [] [] [] [] | 14 | |||||
gimp-print | [] [] | 10 | |||||
gliv | | 3 | |||||
glunarclock | [] [] [] | 13 | |||||
gnubiff | | 3 | |||||
gnucash | [] [] | 9 | |||||
gnucash-glossary | [] [] [] | 8 | |||||
gnupg | [] [] [] [] | 17 | |||||
gpe-aerial | [] | 7 | |||||
gpe-beam | [] | 8 | |||||
gpe-calendar | [] [] [] [] | 13 | |||||
gpe-clock | [] [] [] | 10 | |||||
gpe-conf | [] [] | 9 | |||||
gpe-contacts | [] [] [] | 11 | |||||
gpe-edit | [] [] [] [] [] | 12 | |||||
gpe-go | | 5 | |||||
gpe-login | [] [] [] [] [] | 13 | |||||
gpe-ownerinfo | [] [] [] [] | 13 | |||||
gpe-sketchbook | [] [] | 9 | |||||
gpe-su | [] [] [] | 10 | |||||
gpe-taskmanager | [] [] [] | 10 | |||||
gpe-timesheet | [] [] [] [] | 12 | |||||
gpe-today | [] [] [] [] [] | 13 | |||||
gpe-todo | [] [] [] [] | 12 | |||||
gphoto2 | [] [] [] | 11 | |||||
gprof | [] [] | 9 | |||||
gpsdrive | [] [] | 3 | |||||
gramadoir | [] | 5 | |||||
grep | [] [] [] [] | 26 | |||||
gretl | | 3 | |||||
gtick | | 7 | |||||
hello | [] [] [] [] [] | 34 | |||||
id-utils | [] [] | 12 | |||||
indent | [] [] [] [] | 21 | |||||
iso_3166 | [] [] [] [] [] [] [] | 27 | |||||
iso_3166_1 | [] [] [] | 16 | |||||
iso_3166_2 | | 0 | |||||
iso_3166_3 | | 2 | |||||
iso_4217 | [] [] [] [] [] [] | 24 | |||||
iso_639 | | 1 | |||||
jpilot | [] [] [] [] [] | 9 | |||||
jtag | [] | 2 | |||||
jwhois | () [] [] | 11 | |||||
kbd | [] [] | 11 | |||||
latrine | | 2 | |||||
ld | [] [] | 5 | |||||
libc | [] [] [] [] | 20 | |||||
libgpewidget | [] [] [] [] | 13 | |||||
libiconv | [] [] [] [] [] [] [] [] | 27 | |||||
lifelines | [] | 2 | |||||
lilypond | [] | 3 | |||||
lingoteach | | 2 | |||||
lingoteach_lessons | () | 0 | |||||
lynx | [] [] [] | 14 | |||||
m4 | [] [] | 15 | |||||
mailutils | | 5 | |||||
make | [] [] [] | 16 | |||||
man-db | [] | 5 | |||||
minicom | | 11 | |||||
mysecretdiary | [] [] | 10 | |||||
nano | [] [] [] [] | 17 | |||||
nano_1_0 | [] [] [] | 17 | |||||
opcodes | [] [] | 6 | |||||
parted | [] [] [] | 15 | |||||
ptx | [] [] | 22 | |||||
python | | 0 | |||||
radius | | 4 | |||||
recode | [] [] [] | 20 | |||||
rpm | [] [] | 9 | |||||
screem | [] [] | 2 | |||||
scrollkeeper | [] [] [] | 15 | |||||
sed | [] [] [] [] [] [] | 24 | |||||
sh-utils | [] [] | 14 | |||||
shared-mime-info | [] [] | 7 | |||||
sharutils | [] [] [] [] | 17 | |||||
silky | () | 3 | |||||
skencil | [] | 6 | |||||
sketch | [] | 6 | |||||
soundtracker | [] [] | 7 | |||||
sp | [] | 3 | |||||
tar | [] [] [] [] [] | 24 | |||||
texinfo | [] [] [] | 14 | |||||
textutils | [] [] [] [] | 16 | |||||
tin | | 1 | |||||
tp-robot | | 2 | |||||
tuxpaint | [] [] [] [] [] | 29 | |||||
unicode-han-tra... | | 0 | |||||
unicode-transla... | | 2 | |||||
util-linux | [] [] | 15 | |||||
vorbis-tools | | 8 | |||||
wastesedge | | 0 | |||||
wdiff | [] [] [] | 18 | |||||
wget | [] [] [] [] [] [] [] [] | 24 | |||||
xchat | [] [] [] [] [] | 15 | |||||
xfree86_xkb_xml | [] [] [] [] [] | 11 | |||||
xpad | | 5 | |||||
+-----------------------------------------------------+ | |||||
63 teams sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu | |||||
131 domains 47 19 28 83 0 0 59 13 1 1 11 0 22 22 0 1373 | |||||
Some counters in the preceding matrix are higher than the number of | |||||
visible blocks let us expect. This is because a few extra PO files are | |||||
used for implementing regional variants of languages, or language | |||||
dialects. | |||||
For a PO file in the matrix above to be effective, the package to | |||||
which it applies should also have been internationalized and | |||||
distributed as such by its maintainer. There might be an observable | |||||
lag between the mere existence a PO file and its wide availability in a | |||||
distribution. | |||||
If January 2004 seems to be old, you may fetch a more recent copy of | |||||
this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date | |||||
matrix with full percentage details can be found at | |||||
`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. | |||||
Using `gettext' in new packages | |||||
=============================== | |||||
If you are writing a freely available program and want to | |||||
internationalize it you are welcome to use GNU `gettext' in your | |||||
package. Of course you have to respect the GNU Library General Public | |||||
License which covers the use of the GNU `gettext' library. This means | |||||
in particular that even non-free programs can use `libintl' as a shared | |||||
library, whereas only free software can use `libintl' as a static | |||||
library or use modified versions of `libintl'. | |||||
Once the sources are changed appropriately and the setup can handle | |||||
the use of `gettext' the only thing missing are the translations. The | |||||
Free Translation Project is also available for packages which are not | |||||
developed inside the GNU project. Therefore the information given above | |||||
applies also for every other Free Software Project. Contact | |||||
`translation@iro.umontreal.ca' to make the `.pot' files available to | |||||
the translation teams. | |||||
SUBDIRS = @ZLIB_DIR@ @JPEG_DIR@ rdr network Xregion rfb tx x0vncserver vncviewer_unix \ | |||||
vncconfig_unix vncpasswd | |||||
PACKAGE = @PACKAGE@ | |||||
VERSION = @VERSION@ | |||||
SUBDIRS = @ZLIB_DIR@ @JPEG_DIR@ intl rdr network Xregion rfb tx x0vncserver \ | |||||
vncviewer_unix po vncconfig_unix vncpasswd | |||||
# followed by boilerplate.mk | # followed by boilerplate.mk |
#! /bin/sh | |||||
# Output a system dependent set of variables, describing how to set the | |||||
# run time search path of shared libraries in an executable. | |||||
# | |||||
# Copyright 1996-2003 Free Software Foundation, Inc. | |||||
# Taken from GNU libtool, 2001 | |||||
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 | |||||
# | |||||
# 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 2 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, write to the Free Software | |||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
# | |||||
# As a special exception to the GNU General Public License, if you | |||||
# distribute this file as part of a program that contains a | |||||
# configuration script generated by Autoconf, you may include it under | |||||
# the same distribution terms that you use for the rest of that program. | |||||
# | |||||
# The first argument passed to this file is the canonical host specification, | |||||
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM | |||||
# or | |||||
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM | |||||
# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld | |||||
# should be set by the caller. | |||||
# | |||||
# The set of defined variables is at the end of this script. | |||||
# Known limitations: | |||||
# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer | |||||
# than 256 bytes, otherwise the compiler driver will dump core. The only | |||||
# known workaround is to choose shorter directory names for the build | |||||
# directory and/or the installation directory. | |||||
# All known linkers require a `.a' archive for static linking (except M$VC, | |||||
# which needs '.lib'). | |||||
libext=a | |||||
shrext=.so | |||||
host="$1" | |||||
host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` | |||||
host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` | |||||
host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` | |||||
# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. | |||||
wl= | |||||
if test "$GCC" = yes; then | |||||
wl='-Wl,' | |||||
else | |||||
case "$host_os" in | |||||
aix*) | |||||
wl='-Wl,' | |||||
;; | |||||
mingw* | pw32* | os2*) | |||||
;; | |||||
hpux9* | hpux10* | hpux11*) | |||||
wl='-Wl,' | |||||
;; | |||||
irix5* | irix6* | nonstopux*) | |||||
wl='-Wl,' | |||||
;; | |||||
newsos6) | |||||
;; | |||||
linux*) | |||||
case $CC in | |||||
icc|ecc) | |||||
wl='-Wl,' | |||||
;; | |||||
ccc) | |||||
wl='-Wl,' | |||||
;; | |||||
esac | |||||
;; | |||||
osf3* | osf4* | osf5*) | |||||
wl='-Wl,' | |||||
;; | |||||
sco3.2v5*) | |||||
;; | |||||
solaris*) | |||||
wl='-Wl,' | |||||
;; | |||||
sunos4*) | |||||
wl='-Qoption ld ' | |||||
;; | |||||
sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) | |||||
wl='-Wl,' | |||||
;; | |||||
sysv4*MP*) | |||||
;; | |||||
uts4*) | |||||
;; | |||||
esac | |||||
fi | |||||
# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. | |||||
hardcode_libdir_flag_spec= | |||||
hardcode_libdir_separator= | |||||
hardcode_direct=no | |||||
hardcode_minus_L=no | |||||
case "$host_os" in | |||||
cygwin* | mingw* | pw32*) | |||||
# FIXME: the MSVC++ port hasn't been tested in a loooong time | |||||
# When not using gcc, we currently assume that we are using | |||||
# Microsoft Visual C++. | |||||
if test "$GCC" != yes; then | |||||
with_gnu_ld=no | |||||
fi | |||||
;; | |||||
openbsd*) | |||||
with_gnu_ld=no | |||||
;; | |||||
esac | |||||
ld_shlibs=yes | |||||
if test "$with_gnu_ld" = yes; then | |||||
case "$host_os" in | |||||
aix3* | aix4* | aix5*) | |||||
# On AIX/PPC, the GNU linker is very broken | |||||
if test "$host_cpu" != ia64; then | |||||
ld_shlibs=no | |||||
fi | |||||
;; | |||||
amigaos*) | |||||
hardcode_libdir_flag_spec='-L$libdir' | |||||
hardcode_minus_L=yes | |||||
# Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports | |||||
# that the semantics of dynamic libraries on AmigaOS, at least up | |||||
# to version 4, is to share data among multiple programs linked | |||||
# with the same dynamic library. Since this doesn't match the | |||||
# behavior of shared libraries on other platforms, we can use | |||||
# them. | |||||
ld_shlibs=no | |||||
;; | |||||
beos*) | |||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then | |||||
: | |||||
else | |||||
ld_shlibs=no | |||||
fi | |||||
;; | |||||
cygwin* | mingw* | pw32*) | |||||
# hardcode_libdir_flag_spec is actually meaningless, as there is | |||||
# no search path for DLLs. | |||||
hardcode_libdir_flag_spec='-L$libdir' | |||||
if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then | |||||
: | |||||
else | |||||
ld_shlibs=no | |||||
fi | |||||
;; | |||||
netbsd*) | |||||
;; | |||||
solaris* | sysv5*) | |||||
if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then | |||||
ld_shlibs=no | |||||
elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then | |||||
: | |||||
else | |||||
ld_shlibs=no | |||||
fi | |||||
;; | |||||
sunos4*) | |||||
hardcode_direct=yes | |||||
;; | |||||
*) | |||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then | |||||
: | |||||
else | |||||
ld_shlibs=no | |||||
fi | |||||
;; | |||||
esac | |||||
if test "$ld_shlibs" = yes; then | |||||
# Unlike libtool, we use -rpath here, not --rpath, since the documented | |||||
# option of GNU ld is called -rpath, not --rpath. | |||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' | |||||
fi | |||||
else | |||||
case "$host_os" in | |||||
aix3*) | |||||
# Note: this linker hardcodes the directories in LIBPATH if there | |||||
# are no directories specified by -L. | |||||
hardcode_minus_L=yes | |||||
if test "$GCC" = yes; then | |||||
# Neither direct hardcoding nor static linking is supported with a | |||||
# broken collect2. | |||||
hardcode_direct=unsupported | |||||
fi | |||||
;; | |||||
aix4* | aix5*) | |||||
if test "$host_cpu" = ia64; then | |||||
# On IA64, the linker does run time linking by default, so we don't | |||||
# have to do anything special. | |||||
aix_use_runtimelinking=no | |||||
else | |||||
aix_use_runtimelinking=no | |||||
# Test if we are trying to use run time linking or normal | |||||
# AIX style linking. If -brtl is somewhere in LDFLAGS, we | |||||
# need to do runtime linking. | |||||
case $host_os in aix4.[23]|aix4.[23].*|aix5*) | |||||
for ld_flag in $LDFLAGS; do | |||||
if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then | |||||
aix_use_runtimelinking=yes | |||||
break | |||||
fi | |||||
done | |||||
esac | |||||
fi | |||||
hardcode_direct=yes | |||||
hardcode_libdir_separator=':' | |||||
if test "$GCC" = yes; then | |||||
case $host_os in aix4.[012]|aix4.[012].*) | |||||
collect2name=`${CC} -print-prog-name=collect2` | |||||
if test -f "$collect2name" && \ | |||||
strings "$collect2name" | grep resolve_lib_name >/dev/null | |||||
then | |||||
# We have reworked collect2 | |||||
hardcode_direct=yes | |||||
else | |||||
# We have old collect2 | |||||
hardcode_direct=unsupported | |||||
hardcode_minus_L=yes | |||||
hardcode_libdir_flag_spec='-L$libdir' | |||||
hardcode_libdir_separator= | |||||
fi | |||||
esac | |||||
fi | |||||
# Begin _LT_AC_SYS_LIBPATH_AIX. | |||||
echo 'int main () { return 0; }' > conftest.c | |||||
${CC} ${LDFLAGS} conftest.c -o conftest | |||||
aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } | |||||
}'` | |||||
if test -z "$aix_libpath"; then | |||||
aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } | |||||
}'` | |||||
fi | |||||
if test -z "$aix_libpath"; then | |||||
aix_libpath="/usr/lib:/lib" | |||||
fi | |||||
rm -f conftest.c conftest | |||||
# End _LT_AC_SYS_LIBPATH_AIX. | |||||
if test "$aix_use_runtimelinking" = yes; then | |||||
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" | |||||
else | |||||
if test "$host_cpu" = ia64; then | |||||
hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' | |||||
else | |||||
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" | |||||
fi | |||||
fi | |||||
;; | |||||
amigaos*) | |||||
hardcode_libdir_flag_spec='-L$libdir' | |||||
hardcode_minus_L=yes | |||||
# see comment about different semantics on the GNU ld section | |||||
ld_shlibs=no | |||||
;; | |||||
bsdi4*) | |||||
;; | |||||
cygwin* | mingw* | pw32*) | |||||
# When not using gcc, we currently assume that we are using | |||||
# Microsoft Visual C++. | |||||
# hardcode_libdir_flag_spec is actually meaningless, as there is | |||||
# no search path for DLLs. | |||||
hardcode_libdir_flag_spec=' ' | |||||
libext=lib | |||||
;; | |||||
darwin* | rhapsody*) | |||||
if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then | |||||
hardcode_direct=no | |||||
fi | |||||
;; | |||||
dgux*) | |||||
hardcode_libdir_flag_spec='-L$libdir' | |||||
;; | |||||
freebsd1*) | |||||
ld_shlibs=no | |||||
;; | |||||
freebsd2.2*) | |||||
hardcode_libdir_flag_spec='-R$libdir' | |||||
hardcode_direct=yes | |||||
;; | |||||
freebsd2*) | |||||
hardcode_direct=yes | |||||
hardcode_minus_L=yes | |||||
;; | |||||
freebsd*) | |||||
hardcode_libdir_flag_spec='-R$libdir' | |||||
hardcode_direct=yes | |||||
;; | |||||
hpux9*) | |||||
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' | |||||
hardcode_libdir_separator=: | |||||
hardcode_direct=yes | |||||
# hardcode_minus_L: Not really in the search PATH, | |||||
# but as the default location of the library. | |||||
hardcode_minus_L=yes | |||||
;; | |||||
hpux10* | hpux11*) | |||||
if test "$with_gnu_ld" = no; then | |||||
case "$host_cpu" in | |||||
hppa*64*) | |||||
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' | |||||
hardcode_libdir_separator=: | |||||
hardcode_direct=no | |||||
;; | |||||
ia64*) | |||||
hardcode_libdir_flag_spec='-L$libdir' | |||||
hardcode_direct=no | |||||
# hardcode_minus_L: Not really in the search PATH, | |||||
# but as the default location of the library. | |||||
hardcode_minus_L=yes | |||||
;; | |||||
*) | |||||
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' | |||||
hardcode_libdir_separator=: | |||||
hardcode_direct=yes | |||||
# hardcode_minus_L: Not really in the search PATH, | |||||
# but as the default location of the library. | |||||
hardcode_minus_L=yes | |||||
;; | |||||
esac | |||||
fi | |||||
;; | |||||
irix5* | irix6* | nonstopux*) | |||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' | |||||
hardcode_libdir_separator=: | |||||
;; | |||||
netbsd*) | |||||
hardcode_libdir_flag_spec='-R$libdir' | |||||
hardcode_direct=yes | |||||
;; | |||||
newsos6) | |||||
hardcode_direct=yes | |||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' | |||||
hardcode_libdir_separator=: | |||||
;; | |||||
openbsd*) | |||||
hardcode_direct=yes | |||||
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then | |||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir' | |||||
else | |||||
case "$host_os" in | |||||
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) | |||||
hardcode_libdir_flag_spec='-R$libdir' | |||||
;; | |||||
*) | |||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir' | |||||
;; | |||||
esac | |||||
fi | |||||
;; | |||||
os2*) | |||||
hardcode_libdir_flag_spec='-L$libdir' | |||||
hardcode_minus_L=yes | |||||
;; | |||||
osf3*) | |||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' | |||||
hardcode_libdir_separator=: | |||||
;; | |||||
osf4* | osf5*) | |||||
if test "$GCC" = yes; then | |||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' | |||||
else | |||||
# Both cc and cxx compiler support -rpath directly | |||||
hardcode_libdir_flag_spec='-rpath $libdir' | |||||
fi | |||||
hardcode_libdir_separator=: | |||||
;; | |||||
sco3.2v5*) | |||||
;; | |||||
solaris*) | |||||
hardcode_libdir_flag_spec='-R$libdir' | |||||
;; | |||||
sunos4*) | |||||
hardcode_libdir_flag_spec='-L$libdir' | |||||
hardcode_direct=yes | |||||
hardcode_minus_L=yes | |||||
;; | |||||
sysv4) | |||||
case $host_vendor in | |||||
sni) | |||||
hardcode_direct=yes # is this really true??? | |||||
;; | |||||
siemens) | |||||
hardcode_direct=no | |||||
;; | |||||
motorola) | |||||
hardcode_direct=no #Motorola manual says yes, but my tests say they lie | |||||
;; | |||||
esac | |||||
;; | |||||
sysv4.3*) | |||||
;; | |||||
sysv4*MP*) | |||||
if test -d /usr/nec; then | |||||
ld_shlibs=yes | |||||
fi | |||||
;; | |||||
sysv4.2uw2*) | |||||
hardcode_direct=yes | |||||
hardcode_minus_L=no | |||||
;; | |||||
sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) | |||||
;; | |||||
sysv5*) | |||||
hardcode_libdir_flag_spec= | |||||
;; | |||||
uts4*) | |||||
hardcode_libdir_flag_spec='-L$libdir' | |||||
;; | |||||
*) | |||||
ld_shlibs=no | |||||
;; | |||||
esac | |||||
fi | |||||
# Check dynamic linker characteristics | |||||
# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. | |||||
libname_spec='lib$name' | |||||
case "$host_os" in | |||||
aix3*) | |||||
;; | |||||
aix4* | aix5*) | |||||
;; | |||||
amigaos*) | |||||
;; | |||||
beos*) | |||||
;; | |||||
bsdi4*) | |||||
;; | |||||
cygwin* | mingw* | pw32*) | |||||
shrext=.dll | |||||
;; | |||||
darwin* | rhapsody*) | |||||
shrext=.dylib | |||||
;; | |||||
dgux*) | |||||
;; | |||||
freebsd1*) | |||||
;; | |||||
freebsd*) | |||||
;; | |||||
gnu*) | |||||
;; | |||||
hpux9* | hpux10* | hpux11*) | |||||
case "$host_cpu" in | |||||
ia64*) | |||||
shrext=.so | |||||
;; | |||||
hppa*64*) | |||||
shrext=.sl | |||||
;; | |||||
*) | |||||
shrext=.sl | |||||
;; | |||||
esac | |||||
;; | |||||
irix5* | irix6* | nonstopux*) | |||||
case "$host_os" in | |||||
irix5* | nonstopux*) | |||||
libsuff= shlibsuff= | |||||
;; | |||||
*) | |||||
case $LD in | |||||
*-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; | |||||
*-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; | |||||
*-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; | |||||
*) libsuff= shlibsuff= ;; | |||||
esac | |||||
;; | |||||
esac | |||||
;; | |||||
linux*oldld* | linux*aout* | linux*coff*) | |||||
;; | |||||
linux*) | |||||
;; | |||||
netbsd*) | |||||
;; | |||||
newsos6) | |||||
;; | |||||
nto-qnx) | |||||
;; | |||||
openbsd*) | |||||
;; | |||||
os2*) | |||||
libname_spec='$name' | |||||
shrext=.dll | |||||
;; | |||||
osf3* | osf4* | osf5*) | |||||
;; | |||||
sco3.2v5*) | |||||
;; | |||||
solaris*) | |||||
;; | |||||
sunos4*) | |||||
;; | |||||
sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) | |||||
;; | |||||
sysv4*MP*) | |||||
;; | |||||
uts4*) | |||||
;; | |||||
esac | |||||
sed_quote_subst='s/\(["`$\\]\)/\\\1/g' | |||||
escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` | |||||
shlibext=`echo "$shrext" | sed -e 's,^\.,,'` | |||||
escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` | |||||
sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF | |||||
# How to pass a linker flag through the compiler. | |||||
wl="$escaped_wl" | |||||
# Static library suffix (normally "a"). | |||||
libext="$libext" | |||||
# Shared library suffix (normally "so"). | |||||
shlibext="$shlibext" | |||||
# Flag to hardcode \$libdir into a binary during linking. | |||||
# This must work even if \$libdir does not exist. | |||||
hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec" | |||||
# Whether we need a single -rpath flag with a separated argument. | |||||
hardcode_libdir_separator="$hardcode_libdir_separator" | |||||
# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the | |||||
# resulting binary. | |||||
hardcode_direct="$hardcode_direct" | |||||
# Set to yes if using the -LDIR flag during linking hardcodes DIR into the | |||||
# resulting binary. | |||||
hardcode_minus_L="$hardcode_minus_L" | |||||
EOF |
dnl Process this file with autoconf to produce a configure script. | dnl Process this file with autoconf to produce a configure script. | ||||
AC_INIT(rdr/InStream.h) | AC_INIT(rdr/InStream.h) | ||||
PACKAGE=tightvnc | |||||
VERSION=1.5.0 | |||||
AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE") | |||||
AC_DEFINE_UNQUOTED(VERSION, "$VERSION") | |||||
AC_SUBST(PACKAGE) | |||||
AC_SUBST(VERSION) | |||||
dnl dirty hack to prevent use of -g in CFLAGS and CXXFLAGS | dnl dirty hack to prevent use of -g in CFLAGS and CXXFLAGS | ||||
ac_cv_prog_cc_g=no | ac_cv_prog_cc_g=no | ||||
ac_cv_prog_cxx_g=no | ac_cv_prog_cxx_g=no | ||||
SOCKLEN_T_DEFINE='-DVNC_SOCKLEN_T=int') | SOCKLEN_T_DEFINE='-DVNC_SOCKLEN_T=int') | ||||
AC_SUBST(SOCKLEN_T_DEFINE) | AC_SUBST(SOCKLEN_T_DEFINE) | ||||
AM_GNU_GETTEXT | |||||
BOILERPLATE=boilerplate.mk | BOILERPLATE=boilerplate.mk | ||||
if (sh -c "make --version" 2>/dev/null | grep GNU 2>&1 >/dev/null); then | if (sh -c "make --version" 2>/dev/null | grep GNU 2>&1 >/dev/null); then | ||||
fi | fi | ||||
fi | fi | ||||
AC_OUTPUT(Makefile:Makefile.in:$BOILERPLATE \ | |||||
AC_OUTPUT(Makefile:Makefile.in:$BOILERPLATE intl/Makefile po/Makefile.in \ | |||||
rdr/Makefile:rdr/Makefile.in:$BOILERPLATE \ | rdr/Makefile:rdr/Makefile.in:$BOILERPLATE \ | ||||
network/Makefile:network/Makefile.in:$BOILERPLATE \ | network/Makefile:network/Makefile.in:$BOILERPLATE \ | ||||
Xregion/Makefile:Xregion/Makefile.in:$BOILERPLATE \ | Xregion/Makefile:Xregion/Makefile.in:$BOILERPLATE \ |
#!/bin/sh | |||||
# install - install a program, script, or datafile | |||||
scriptversion=2004-09-10.20 | |||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was | |||||
# later released in X11R6 (xc/config/util/install.sh) with the | |||||
# following copyright and license. | |||||
# | |||||
# Copyright (C) 1994 X Consortium | |||||
# | |||||
# Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
# of this software and associated documentation files (the "Software"), to | |||||
# deal in the Software without restriction, including without limitation the | |||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | |||||
# sell copies of the Software, and to permit persons to whom the Software is | |||||
# furnished to do so, subject to the following conditions: | |||||
# | |||||
# The above copyright notice and this permission notice shall be included in | |||||
# all copies or substantial portions of the Software. | |||||
# | |||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN | |||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- | |||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||||
# | |||||
# Except as contained in this notice, the name of the X Consortium shall not | |||||
# be used in advertising or otherwise to promote the sale, use or other deal- | |||||
# ings in this Software without prior written authorization from the X Consor- | |||||
# tium. | |||||
# | |||||
# | |||||
# FSF changes to this file are in the public domain. | |||||
# | |||||
# Calling this script install-sh is preferred over install.sh, to prevent | |||||
# `make' implicit rules from creating a file called install from it | |||||
# when there is no Makefile. | |||||
# | |||||
# This script is compatible with the BSD install script, but was written | |||||
# from scratch. It can only install one file at a time, a restriction | |||||
# shared with many OS's install programs. | |||||
# set DOITPROG to echo to test this script | |||||
# Don't use :- since 4.3BSD and earlier shells don't like it. | |||||
doit="${DOITPROG-}" | |||||
# put in absolute paths if you don't have them in your path; or use env. vars. | |||||
mvprog="${MVPROG-mv}" | |||||
cpprog="${CPPROG-cp}" | |||||
chmodprog="${CHMODPROG-chmod}" | |||||
chownprog="${CHOWNPROG-chown}" | |||||
chgrpprog="${CHGRPPROG-chgrp}" | |||||
stripprog="${STRIPPROG-strip}" | |||||
rmprog="${RMPROG-rm}" | |||||
mkdirprog="${MKDIRPROG-mkdir}" | |||||
chmodcmd="$chmodprog 0755" | |||||
chowncmd= | |||||
chgrpcmd= | |||||
stripcmd= | |||||
rmcmd="$rmprog -f" | |||||
mvcmd="$mvprog" | |||||
src= | |||||
dst= | |||||
dir_arg= | |||||
dstarg= | |||||
no_target_directory= | |||||
usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE | |||||
or: $0 [OPTION]... SRCFILES... DIRECTORY | |||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES... | |||||
or: $0 [OPTION]... -d DIRECTORIES... | |||||
In the 1st form, copy SRCFILE to DSTFILE. | |||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. | |||||
In the 4th, create DIRECTORIES. | |||||
Options: | |||||
-c (ignored) | |||||
-d create directories instead of installing files. | |||||
-g GROUP $chgrpprog installed files to GROUP. | |||||
-m MODE $chmodprog installed files to MODE. | |||||
-o USER $chownprog installed files to USER. | |||||
-s $stripprog installed files. | |||||
-t DIRECTORY install into DIRECTORY. | |||||
-T report an error if DSTFILE is a directory. | |||||
--help display this help and exit. | |||||
--version display version info and exit. | |||||
Environment variables override the default commands: | |||||
CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG | |||||
" | |||||
while test -n "$1"; do | |||||
case $1 in | |||||
-c) shift | |||||
continue;; | |||||
-d) dir_arg=true | |||||
shift | |||||
continue;; | |||||
-g) chgrpcmd="$chgrpprog $2" | |||||
shift | |||||
shift | |||||
continue;; | |||||
--help) echo "$usage"; exit 0;; | |||||
-m) chmodcmd="$chmodprog $2" | |||||
shift | |||||
shift | |||||
continue;; | |||||
-o) chowncmd="$chownprog $2" | |||||
shift | |||||
shift | |||||
continue;; | |||||
-s) stripcmd=$stripprog | |||||
shift | |||||
continue;; | |||||
-t) dstarg=$2 | |||||
shift | |||||
shift | |||||
continue;; | |||||
-T) no_target_directory=true | |||||
shift | |||||
continue;; | |||||
--version) echo "$0 $scriptversion"; exit 0;; | |||||
*) # When -d is used, all remaining arguments are directories to create. | |||||
# When -t is used, the destination is already specified. | |||||
test -n "$dir_arg$dstarg" && break | |||||
# Otherwise, the last argument is the destination. Remove it from $@. | |||||
for arg | |||||
do | |||||
if test -n "$dstarg"; then | |||||
# $@ is not empty: it contains at least $arg. | |||||
set fnord "$@" "$dstarg" | |||||
shift # fnord | |||||
fi | |||||
shift # arg | |||||
dstarg=$arg | |||||
done | |||||
break;; | |||||
esac | |||||
done | |||||
if test -z "$1"; then | |||||
if test -z "$dir_arg"; then | |||||
echo "$0: no input file specified." >&2 | |||||
exit 1 | |||||
fi | |||||
# It's OK to call `install-sh -d' without argument. | |||||
# This can happen when creating conditional directories. | |||||
exit 0 | |||||
fi | |||||
for src | |||||
do | |||||
# Protect names starting with `-'. | |||||
case $src in | |||||
-*) src=./$src ;; | |||||
esac | |||||
if test -n "$dir_arg"; then | |||||
dst=$src | |||||
src= | |||||
if test -d "$dst"; then | |||||
mkdircmd=: | |||||
chmodcmd= | |||||
else | |||||
mkdircmd=$mkdirprog | |||||
fi | |||||
else | |||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command | |||||
# might cause directories to be created, which would be especially bad | |||||
# if $src (and thus $dsttmp) contains '*'. | |||||
if test ! -f "$src" && test ! -d "$src"; then | |||||
echo "$0: $src does not exist." >&2 | |||||
exit 1 | |||||
fi | |||||
if test -z "$dstarg"; then | |||||
echo "$0: no destination specified." >&2 | |||||
exit 1 | |||||
fi | |||||
dst=$dstarg | |||||
# Protect names starting with `-'. | |||||
case $dst in | |||||
-*) dst=./$dst ;; | |||||
esac | |||||
# If destination is a directory, append the input filename; won't work | |||||
# if double slashes aren't ignored. | |||||
if test -d "$dst"; then | |||||
if test -n "$no_target_directory"; then | |||||
echo "$0: $dstarg: Is a directory" >&2 | |||||
exit 1 | |||||
fi | |||||
dst=$dst/`basename "$src"` | |||||
fi | |||||
fi | |||||
# This sed command emulates the dirname command. | |||||
dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` | |||||
# Make sure that the destination directory exists. | |||||
# Skip lots of stat calls in the usual case. | |||||
if test ! -d "$dstdir"; then | |||||
defaultIFS=' | |||||
' | |||||
IFS="${IFS-$defaultIFS}" | |||||
oIFS=$IFS | |||||
# Some sh's can't handle IFS=/ for some reason. | |||||
IFS='%' | |||||
set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` | |||||
IFS=$oIFS | |||||
pathcomp= | |||||
while test $# -ne 0 ; do | |||||
pathcomp=$pathcomp$1 | |||||
shift | |||||
if test ! -d "$pathcomp"; then | |||||
$mkdirprog "$pathcomp" | |||||
# mkdir can fail with a `File exist' error in case several | |||||
# install-sh are creating the directory concurrently. This | |||||
# is OK. | |||||
test -d "$pathcomp" || exit | |||||
fi | |||||
pathcomp=$pathcomp/ | |||||
done | |||||
fi | |||||
if test -n "$dir_arg"; then | |||||
$doit $mkdircmd "$dst" \ | |||||
&& { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ | |||||
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ | |||||
&& { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ | |||||
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } | |||||
else | |||||
dstfile=`basename "$dst"` | |||||
# Make a couple of temp file names in the proper directory. | |||||
dsttmp=$dstdir/_inst.$$_ | |||||
rmtmp=$dstdir/_rm.$$_ | |||||
# Trap to clean up those temp files at exit. | |||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 | |||||
trap '(exit $?); exit' 1 2 13 15 | |||||
# Copy the file name to the temp name. | |||||
$doit $cpprog "$src" "$dsttmp" && | |||||
# and set any options; do chmod last to preserve setuid bits. | |||||
# | |||||
# If any of these fail, we abort the whole thing. If we want to | |||||
# ignore errors from any of these, just make sure not to ignore | |||||
# errors from the above "$doit $cpprog $src $dsttmp" command. | |||||
# | |||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ | |||||
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ | |||||
&& { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ | |||||
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && | |||||
# Now rename the file to the real destination. | |||||
{ $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ | |||||
|| { | |||||
# The rename failed, perhaps because mv can't rename something else | |||||
# to itself, or perhaps because mv is so ancient that it does not | |||||
# support -f. | |||||
# Now remove or move aside any old file at destination location. | |||||
# We try this two ways since rm can't unlink itself on some | |||||
# systems and the destination file might be busy for other | |||||
# reasons. In this case, the final cleanup might fail but the new | |||||
# file should still install successfully. | |||||
{ | |||||
if test -f "$dstdir/$dstfile"; then | |||||
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ | |||||
|| $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ | |||||
|| { | |||||
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 | |||||
(exit 1); exit | |||||
} | |||||
else | |||||
: | |||||
fi | |||||
} && | |||||
# Now rename the file to the real destination. | |||||
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile" | |||||
} | |||||
} | |||||
fi || { (exit 1); exit; } | |||||
done | |||||
# The final little trick to "correctly" pass the exit status to the exit trap. | |||||
{ | |||||
(exit 0); exit | |||||
} | |||||
# Local variables: | |||||
# eval: (add-hook 'write-file-hooks 'time-stamp) | |||||
# time-stamp-start: "scriptversion=" | |||||
# time-stamp-format: "%:y-%02m-%02d.%02H" | |||||
# time-stamp-end: "$" | |||||
# End: |
2004-01-29 GNU <bug-gnu-gettext@gnu.org> | |||||
* Version 0.14.1 released. | |||||
# Makefile for directory with message catalog handling library of GNU gettext | |||||
# Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc. | |||||
# | |||||
# This program is free software; you can redistribute it and/or modify it | |||||
# under the terms of the GNU Library General Public License as published | |||||
# by the Free Software Foundation; either version 2, 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 | |||||
# Library General Public License for more details. | |||||
# | |||||
# You should have received a copy of the GNU Library General Public | |||||
# License along with this program; if not, write to the Free Software | |||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
# USA. | |||||
PACKAGE = @PACKAGE@ | |||||
VERSION = @VERSION@ | |||||
SHELL = /bin/sh | |||||
srcdir = @srcdir@ | |||||
top_srcdir = @top_srcdir@ | |||||
top_builddir = .. | |||||
VPATH = $(srcdir) | |||||
prefix = @prefix@ | |||||
exec_prefix = @exec_prefix@ | |||||
transform = @program_transform_name@ | |||||
libdir = @libdir@ | |||||
includedir = @includedir@ | |||||
datadir = @datadir@ | |||||
localedir = $(datadir)/locale | |||||
gettextsrcdir = $(datadir)/gettext/intl | |||||
aliaspath = $(localedir) | |||||
subdir = intl | |||||
INSTALL = @INSTALL@ | |||||
INSTALL_DATA = @INSTALL_DATA@ | |||||
MKINSTALLDIRS = @MKINSTALLDIRS@ | |||||
mkinstalldirs = $(SHELL) $(MKINSTALLDIRS) | |||||
l = @INTL_LIBTOOL_SUFFIX_PREFIX@ | |||||
AR = ar | |||||
CC = @CC@ | |||||
LIBTOOL = @LIBTOOL@ | |||||
RANLIB = @RANLIB@ | |||||
YACC = @INTLBISON@ -y -d | |||||
YFLAGS = --name-prefix=__gettext | |||||
DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \ | |||||
-DLIBDIR=\"$(libdir)\" -DIN_LIBINTL \ | |||||
-DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"$(libdir)\" -DNO_XMALLOC \ | |||||
-Dset_relocation_prefix=libintl_set_relocation_prefix \ | |||||
-Drelocate=libintl_relocate \ | |||||
-DDEPENDS_ON_LIBICONV=1 @DEFS@ | |||||
CPPFLAGS = @CPPFLAGS@ | |||||
CFLAGS = @CFLAGS@ | |||||
LDFLAGS = @LDFLAGS@ | |||||
LIBS = @LIBS@ | |||||
COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) | |||||
HEADERS = \ | |||||
gmo.h \ | |||||
gettextP.h \ | |||||
hash-string.h \ | |||||
loadinfo.h \ | |||||
plural-exp.h \ | |||||
eval-plural.h \ | |||||
localcharset.h \ | |||||
relocatable.h \ | |||||
xsize.h \ | |||||
printf-args.h printf-args.c \ | |||||
printf-parse.h wprintf-parse.h printf-parse.c \ | |||||
vasnprintf.h vasnwprintf.h vasnprintf.c \ | |||||
os2compat.h \ | |||||
libgnuintl.h.in | |||||
SOURCES = \ | |||||
bindtextdom.c \ | |||||
dcgettext.c \ | |||||
dgettext.c \ | |||||
gettext.c \ | |||||
finddomain.c \ | |||||
loadmsgcat.c \ | |||||
localealias.c \ | |||||
textdomain.c \ | |||||
l10nflist.c \ | |||||
explodename.c \ | |||||
dcigettext.c \ | |||||
dcngettext.c \ | |||||
dngettext.c \ | |||||
ngettext.c \ | |||||
plural.y \ | |||||
plural-exp.c \ | |||||
localcharset.c \ | |||||
relocatable.c \ | |||||
localename.c \ | |||||
log.c \ | |||||
printf.c \ | |||||
osdep.c \ | |||||
os2compat.c \ | |||||
intl-compat.c | |||||
OBJECTS = \ | |||||
bindtextdom.$lo \ | |||||
dcgettext.$lo \ | |||||
dgettext.$lo \ | |||||
gettext.$lo \ | |||||
finddomain.$lo \ | |||||
loadmsgcat.$lo \ | |||||
localealias.$lo \ | |||||
textdomain.$lo \ | |||||
l10nflist.$lo \ | |||||
explodename.$lo \ | |||||
dcigettext.$lo \ | |||||
dcngettext.$lo \ | |||||
dngettext.$lo \ | |||||
ngettext.$lo \ | |||||
plural.$lo \ | |||||
plural-exp.$lo \ | |||||
localcharset.$lo \ | |||||
relocatable.$lo \ | |||||
localename.$lo \ | |||||
log.$lo \ | |||||
printf.$lo \ | |||||
osdep.$lo \ | |||||
intl-compat.$lo | |||||
DISTFILES.common = Makefile.in \ | |||||
config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES) | |||||
DISTFILES.generated = plural.c | |||||
DISTFILES.normal = VERSION | |||||
DISTFILES.gettext = COPYING.LIB-2.0 COPYING.LIB-2.1 libintl.glibc \ | |||||
libgnuintl.h_vms Makefile.vms \ | |||||
libgnuintl.h.msvc-static libgnuintl.h.msvc-shared README.woe32 Makefile.msvc | |||||
DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c \ | |||||
COPYING.LIB-2 gettext.h libgettext.h plural-eval.c libgnuintl.h | |||||
all: all-@USE_INCLUDED_LIBINTL@ | |||||
all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed | |||||
all-no: all-no-@BUILD_INCLUDED_LIBINTL@ | |||||
all-no-yes: libgnuintl.$la | |||||
all-no-no: | |||||
libintl.a libgnuintl.a: $(OBJECTS) | |||||
rm -f $@ | |||||
$(AR) cru $@ $(OBJECTS) | |||||
$(RANLIB) $@ | |||||
libintl.la libgnuintl.la: $(OBJECTS) | |||||
$(LIBTOOL) --mode=link \ | |||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \ | |||||
$(OBJECTS) @LTLIBICONV@ $(LIBS) -lc \ | |||||
-version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \ | |||||
-rpath $(libdir) \ | |||||
-no-undefined | |||||
# Libtool's library version information for libintl. | |||||
# Before making a gettext release, the gettext maintainer must change this | |||||
# according to the libtool documentation, section "Library interface versions". | |||||
# Maintainers of other packages that include the intl directory must *not* | |||||
# change these values. | |||||
LTV_CURRENT=7 | |||||
LTV_REVISION=0 | |||||
LTV_AGE=4 | |||||
.SUFFIXES: | |||||
.SUFFIXES: .c .y .o .lo .sin .sed | |||||
.c.o: | |||||
$(COMPILE) $< | |||||
.y.c: | |||||
$(YACC) $(YFLAGS) --output $@ $< | |||||
rm -f $*.h | |||||
bindtextdom.lo: $(srcdir)/bindtextdom.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/bindtextdom.c | |||||
dcgettext.lo: $(srcdir)/dcgettext.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcgettext.c | |||||
dgettext.lo: $(srcdir)/dgettext.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dgettext.c | |||||
gettext.lo: $(srcdir)/gettext.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/gettext.c | |||||
finddomain.lo: $(srcdir)/finddomain.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/finddomain.c | |||||
loadmsgcat.lo: $(srcdir)/loadmsgcat.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/loadmsgcat.c | |||||
localealias.lo: $(srcdir)/localealias.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localealias.c | |||||
textdomain.lo: $(srcdir)/textdomain.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/textdomain.c | |||||
l10nflist.lo: $(srcdir)/l10nflist.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/l10nflist.c | |||||
explodename.lo: $(srcdir)/explodename.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/explodename.c | |||||
dcigettext.lo: $(srcdir)/dcigettext.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcigettext.c | |||||
dcngettext.lo: $(srcdir)/dcngettext.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcngettext.c | |||||
dngettext.lo: $(srcdir)/dngettext.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dngettext.c | |||||
ngettext.lo: $(srcdir)/ngettext.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/ngettext.c | |||||
plural.lo: $(srcdir)/plural.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural.c | |||||
plural-exp.lo: $(srcdir)/plural-exp.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural-exp.c | |||||
localcharset.lo: $(srcdir)/localcharset.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localcharset.c | |||||
relocatable.lo: $(srcdir)/relocatable.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/relocatable.c | |||||
localename.lo: $(srcdir)/localename.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localename.c | |||||
log.lo: $(srcdir)/log.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/log.c | |||||
printf.lo: $(srcdir)/printf.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/printf.c | |||||
osdep.lo: $(srcdir)/osdep.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/osdep.c | |||||
intl-compat.lo: $(srcdir)/intl-compat.c | |||||
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/intl-compat.c | |||||
ref-add.sed: $(srcdir)/ref-add.sin | |||||
sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-add.sin > t-ref-add.sed | |||||
mv t-ref-add.sed ref-add.sed | |||||
ref-del.sed: $(srcdir)/ref-del.sin | |||||
sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-del.sin > t-ref-del.sed | |||||
mv t-ref-del.sed ref-del.sed | |||||
INCLUDES = -I. -I$(srcdir) -I.. | |||||
libgnuintl.h: $(srcdir)/libgnuintl.h.in | |||||
sed -e 's,@''HAVE_POSIX_PRINTF''@,@HAVE_POSIX_PRINTF@,g' \ | |||||
-e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,g' \ | |||||
-e 's,@''HAVE_SNPRINTF''@,@HAVE_SNPRINTF@,g' \ | |||||
-e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \ | |||||
< $(srcdir)/libgnuintl.h.in > libgnuintl.h | |||||
libintl.h: libgnuintl.h | |||||
cp libgnuintl.h libintl.h | |||||
charset.alias: $(srcdir)/config.charset | |||||
$(SHELL) $(srcdir)/config.charset '@host@' > t-$@ | |||||
mv t-$@ $@ | |||||
check: all | |||||
# We must not install the libintl.h/libintl.a files if we are on a | |||||
# system which has the GNU gettext() function in its C library or in a | |||||
# separate library. | |||||
# If you want to use the one which comes with this version of the | |||||
# package, you have to use `configure --with-included-gettext'. | |||||
install: install-exec install-data | |||||
install-exec: all | |||||
if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \ | |||||
&& test '@USE_INCLUDED_LIBINTL@' = yes; then \ | |||||
$(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ | |||||
$(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \ | |||||
$(LIBTOOL) --mode=install \ | |||||
$(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \ | |||||
if test "@RELOCATABLE@" = yes; then \ | |||||
dependencies=`sed -n -e 's,^dependency_libs=\(.*\),\1,p' < $(DESTDIR)$(libdir)/libintl.la | sed -e "s,^',," -e "s,'\$$,,"`; \ | |||||
if test -n "$$dependencies"; then \ | |||||
rm -f $(DESTDIR)$(libdir)/libintl.la; \ | |||||
fi; \ | |||||
fi; \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
if test "$(PACKAGE)" = "gettext-tools" \ | |||||
&& test '@USE_INCLUDED_LIBINTL@' = no; then \ | |||||
$(mkinstalldirs) $(DESTDIR)$(libdir); \ | |||||
$(LIBTOOL) --mode=install \ | |||||
$(INSTALL_DATA) libgnuintl.$la $(DESTDIR)$(libdir)/libgnuintl.$la; \ | |||||
rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \ | |||||
$(INSTALL_DATA) $(DESTDIR)$(libdir)/libgnuintl.so $(DESTDIR)$(libdir)/preloadable_libintl.so; \ | |||||
$(LIBTOOL) --mode=uninstall \ | |||||
rm -f $(DESTDIR)$(libdir)/libgnuintl.$la; \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
if test '@USE_INCLUDED_LIBINTL@' = yes; then \ | |||||
test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \ | |||||
temp=$(DESTDIR)$(libdir)/t-charset.alias; \ | |||||
dest=$(DESTDIR)$(libdir)/charset.alias; \ | |||||
if test -f $(DESTDIR)$(libdir)/charset.alias; then \ | |||||
orig=$(DESTDIR)$(libdir)/charset.alias; \ | |||||
sed -f ref-add.sed $$orig > $$temp; \ | |||||
$(INSTALL_DATA) $$temp $$dest; \ | |||||
rm -f $$temp; \ | |||||
else \ | |||||
if test @GLIBC21@ = no; then \ | |||||
orig=charset.alias; \ | |||||
sed -f ref-add.sed $$orig > $$temp; \ | |||||
$(INSTALL_DATA) $$temp $$dest; \ | |||||
rm -f $$temp; \ | |||||
fi; \ | |||||
fi; \ | |||||
$(mkinstalldirs) $(DESTDIR)$(localedir); \ | |||||
test -f $(DESTDIR)$(localedir)/locale.alias \ | |||||
&& orig=$(DESTDIR)$(localedir)/locale.alias \ | |||||
|| orig=$(srcdir)/locale.alias; \ | |||||
temp=$(DESTDIR)$(localedir)/t-locale.alias; \ | |||||
dest=$(DESTDIR)$(localedir)/locale.alias; \ | |||||
sed -f ref-add.sed $$orig > $$temp; \ | |||||
$(INSTALL_DATA) $$temp $$dest; \ | |||||
rm -f $$temp; \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
install-data: all | |||||
if test "$(PACKAGE)" = "gettext-tools"; then \ | |||||
$(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ | |||||
$(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \ | |||||
$(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \ | |||||
dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \ | |||||
for file in $$dists; do \ | |||||
$(INSTALL_DATA) $(srcdir)/$$file \ | |||||
$(DESTDIR)$(gettextsrcdir)/$$file; \ | |||||
done; \ | |||||
chmod a+x $(DESTDIR)$(gettextsrcdir)/config.charset; \ | |||||
dists="$(DISTFILES.generated)"; \ | |||||
for file in $$dists; do \ | |||||
if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ | |||||
$(INSTALL_DATA) $$dir/$$file \ | |||||
$(DESTDIR)$(gettextsrcdir)/$$file; \ | |||||
done; \ | |||||
dists="$(DISTFILES.obsolete)"; \ | |||||
for file in $$dists; do \ | |||||
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ | |||||
done; \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
install-strip: install | |||||
installdirs: | |||||
if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \ | |||||
&& test '@USE_INCLUDED_LIBINTL@' = yes; then \ | |||||
$(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
if test "$(PACKAGE)" = "gettext-tools" \ | |||||
&& test '@USE_INCLUDED_LIBINTL@' = no; then \ | |||||
$(mkinstalldirs) $(DESTDIR)$(libdir); \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
if test '@USE_INCLUDED_LIBINTL@' = yes; then \ | |||||
test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \ | |||||
$(mkinstalldirs) $(DESTDIR)$(localedir); \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
if test "$(PACKAGE)" = "gettext-tools"; then \ | |||||
$(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
# Define this as empty until I found a useful application. | |||||
installcheck: | |||||
uninstall: | |||||
if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \ | |||||
&& test '@USE_INCLUDED_LIBINTL@' = yes; then \ | |||||
rm -f $(DESTDIR)$(includedir)/libintl.h; \ | |||||
$(LIBTOOL) --mode=uninstall \ | |||||
rm -f $(DESTDIR)$(libdir)/libintl.$la; \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
if test "$(PACKAGE)" = "gettext-tools" \ | |||||
&& test '@USE_INCLUDED_LIBINTL@' = no; then \ | |||||
rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
if test '@USE_INCLUDED_LIBINTL@' = yes; then \ | |||||
if test -f $(DESTDIR)$(libdir)/charset.alias; then \ | |||||
temp=$(DESTDIR)$(libdir)/t-charset.alias; \ | |||||
dest=$(DESTDIR)$(libdir)/charset.alias; \ | |||||
sed -f ref-del.sed $$dest > $$temp; \ | |||||
if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ | |||||
rm -f $$dest; \ | |||||
else \ | |||||
$(INSTALL_DATA) $$temp $$dest; \ | |||||
fi; \ | |||||
rm -f $$temp; \ | |||||
fi; \ | |||||
if test -f $(DESTDIR)$(localedir)/locale.alias; then \ | |||||
temp=$(DESTDIR)$(localedir)/t-locale.alias; \ | |||||
dest=$(DESTDIR)$(localedir)/locale.alias; \ | |||||
sed -f ref-del.sed $$dest > $$temp; \ | |||||
if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ | |||||
rm -f $$dest; \ | |||||
else \ | |||||
$(INSTALL_DATA) $$temp $$dest; \ | |||||
fi; \ | |||||
rm -f $$temp; \ | |||||
fi; \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
if test "$(PACKAGE)" = "gettext-tools"; then \ | |||||
for file in VERSION ChangeLog COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \ | |||||
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ | |||||
done; \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
info dvi ps pdf html: | |||||
$(OBJECTS): ../config.h libgnuintl.h | |||||
bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dngettext.$lo finddomain.$lo gettext.$lo intl-compat.$lo loadmsgcat.$lo localealias.$lo ngettext.$lo textdomain.$lo: $(srcdir)/gettextP.h $(srcdir)/gmo.h $(srcdir)/loadinfo.h | |||||
dcigettext.$lo loadmsgcat.$lo: $(srcdir)/hash-string.h | |||||
explodename.$lo l10nflist.$lo: $(srcdir)/loadinfo.h | |||||
dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: $(srcdir)/plural-exp.h | |||||
dcigettext.$lo: $(srcdir)/eval-plural.h | |||||
localcharset.$lo: $(srcdir)/localcharset.h | |||||
localealias.$lo localcharset.$lo relocatable.$lo: $(srcdir)/relocatable.h | |||||
printf.$lo: $(srcdir)/printf-args.h $(srcdir)/printf-args.c $(srcdir)/printf-parse.h $(srcdir)/wprintf-parse.h $(srcdir)/xsize.h $(srcdir)/printf-parse.c $(srcdir)/vasnprintf.h $(srcdir)/vasnwprintf.h $(srcdir)/vasnprintf.c | |||||
tags: TAGS | |||||
TAGS: $(HEADERS) $(SOURCES) | |||||
here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES) | |||||
ctags: CTAGS | |||||
CTAGS: $(HEADERS) $(SOURCES) | |||||
here=`pwd`; cd $(srcdir) && ctags -o $$here/CTAGS $(HEADERS) $(SOURCES) | |||||
id: ID | |||||
ID: $(HEADERS) $(SOURCES) | |||||
here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES) | |||||
mostlyclean: | |||||
rm -f *.a *.la *.o *.obj *.lo core core.* | |||||
rm -f libgnuintl.h libintl.h charset.alias ref-add.sed ref-del.sed | |||||
rm -f -r .libs _libs | |||||
clean: mostlyclean | |||||
distclean: clean | |||||
rm -f Makefile ID TAGS | |||||
if test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; then \ | |||||
rm -f ChangeLog.inst $(DISTFILES.normal); \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
maintainer-clean: distclean | |||||
@echo "This command is intended for maintainers to use;" | |||||
@echo "it deletes files that may require special tools to rebuild." | |||||
# GNU gettext needs not contain the file `VERSION' but contains some | |||||
# other files which should not be distributed in other packages. | |||||
distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) | |||||
dist distdir: Makefile | |||||
if test "$(PACKAGE)" = "gettext-tools"; then \ | |||||
: ; \ | |||||
else \ | |||||
if test "$(PACKAGE)" = "gettext-runtime"; then \ | |||||
additional="$(DISTFILES.gettext)"; \ | |||||
else \ | |||||
additional="$(DISTFILES.normal)"; \ | |||||
fi; \ | |||||
$(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \ | |||||
for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \ | |||||
if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ | |||||
cp -p $$dir/$$file $(distdir); \ | |||||
done; \ | |||||
fi | |||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status | |||||
cd $(top_builddir) && $(SHELL) ./config.status | |||||
# This would be more efficient, but doesn't work any more with autoconf-2.57, | |||||
# when AC_CONFIG_FILES([intl/Makefile:somedir/Makefile.in]) is used. | |||||
# cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status | |||||
# Tell versions [3.59,3.63) of GNU make not to export all variables. | |||||
# Otherwise a system limit (for SysV at least) may be exceeded. | |||||
.NOEXPORT: |
GNU gettext library from gettext-0.14.1 |
/* Implementation of the bindtextdomain(3) function | |||||
Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#include <stddef.h> | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#ifdef _LIBC | |||||
# include <libintl.h> | |||||
#else | |||||
# include "libgnuintl.h" | |||||
#endif | |||||
#include "gettextP.h" | |||||
#ifdef _LIBC | |||||
/* We have to handle multi-threaded applications. */ | |||||
# include <bits/libc-lock.h> | |||||
#else | |||||
/* Provide dummy implementation if this is outside glibc. */ | |||||
# define __libc_rwlock_define(CLASS, NAME) | |||||
# define __libc_rwlock_wrlock(NAME) | |||||
# define __libc_rwlock_unlock(NAME) | |||||
#endif | |||||
/* The internal variables in the standalone libintl.a must have different | |||||
names than the internal variables in GNU libc, otherwise programs | |||||
using libintl.a cannot be linked statically. */ | |||||
#if !defined _LIBC | |||||
# define _nl_default_dirname libintl_nl_default_dirname | |||||
# define _nl_domain_bindings libintl_nl_domain_bindings | |||||
#endif | |||||
/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */ | |||||
#ifndef offsetof | |||||
# define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) | |||||
#endif | |||||
/* @@ end of prolog @@ */ | |||||
/* Contains the default location of the message catalogs. */ | |||||
extern const char _nl_default_dirname[]; | |||||
#ifdef _LIBC | |||||
extern const char _nl_default_dirname_internal[] attribute_hidden; | |||||
#else | |||||
# define INTUSE(name) name | |||||
#endif | |||||
/* List with bindings of specific domains. */ | |||||
extern struct binding *_nl_domain_bindings; | |||||
/* Lock variable to protect the global data in the gettext implementation. */ | |||||
__libc_rwlock_define (extern, _nl_state_lock attribute_hidden) | |||||
/* Names for the libintl functions are a problem. They must not clash | |||||
with existing names and they should follow ANSI C. But this source | |||||
code is also used in GNU C Library where the names have a __ | |||||
prefix. So we have to make a difference here. */ | |||||
#ifdef _LIBC | |||||
# define BINDTEXTDOMAIN __bindtextdomain | |||||
# define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset | |||||
# ifndef strdup | |||||
# define strdup(str) __strdup (str) | |||||
# endif | |||||
#else | |||||
# define BINDTEXTDOMAIN libintl_bindtextdomain | |||||
# define BIND_TEXTDOMAIN_CODESET libintl_bind_textdomain_codeset | |||||
#endif | |||||
/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP | |||||
to be used for the DOMAINNAME message catalog. | |||||
If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not | |||||
modified, only the current value is returned. | |||||
If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither | |||||
modified nor returned. */ | |||||
static void | |||||
set_binding_values (const char *domainname, | |||||
const char **dirnamep, const char **codesetp) | |||||
{ | |||||
struct binding *binding; | |||||
int modified; | |||||
/* Some sanity checks. */ | |||||
if (domainname == NULL || domainname[0] == '\0') | |||||
{ | |||||
if (dirnamep) | |||||
*dirnamep = NULL; | |||||
if (codesetp) | |||||
*codesetp = NULL; | |||||
return; | |||||
} | |||||
__libc_rwlock_wrlock (_nl_state_lock); | |||||
modified = 0; | |||||
for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) | |||||
{ | |||||
int compare = strcmp (domainname, binding->domainname); | |||||
if (compare == 0) | |||||
/* We found it! */ | |||||
break; | |||||
if (compare < 0) | |||||
{ | |||||
/* It is not in the list. */ | |||||
binding = NULL; | |||||
break; | |||||
} | |||||
} | |||||
if (binding != NULL) | |||||
{ | |||||
if (dirnamep) | |||||
{ | |||||
const char *dirname = *dirnamep; | |||||
if (dirname == NULL) | |||||
/* The current binding has be to returned. */ | |||||
*dirnamep = binding->dirname; | |||||
else | |||||
{ | |||||
/* The domain is already bound. If the new value and the old | |||||
one are equal we simply do nothing. Otherwise replace the | |||||
old binding. */ | |||||
char *result = binding->dirname; | |||||
if (strcmp (dirname, result) != 0) | |||||
{ | |||||
if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0) | |||||
result = (char *) INTUSE(_nl_default_dirname); | |||||
else | |||||
{ | |||||
#if defined _LIBC || defined HAVE_STRDUP | |||||
result = strdup (dirname); | |||||
#else | |||||
size_t len = strlen (dirname) + 1; | |||||
result = (char *) malloc (len); | |||||
if (__builtin_expect (result != NULL, 1)) | |||||
memcpy (result, dirname, len); | |||||
#endif | |||||
} | |||||
if (__builtin_expect (result != NULL, 1)) | |||||
{ | |||||
if (binding->dirname != INTUSE(_nl_default_dirname)) | |||||
free (binding->dirname); | |||||
binding->dirname = result; | |||||
modified = 1; | |||||
} | |||||
} | |||||
*dirnamep = result; | |||||
} | |||||
} | |||||
if (codesetp) | |||||
{ | |||||
const char *codeset = *codesetp; | |||||
if (codeset == NULL) | |||||
/* The current binding has be to returned. */ | |||||
*codesetp = binding->codeset; | |||||
else | |||||
{ | |||||
/* The domain is already bound. If the new value and the old | |||||
one are equal we simply do nothing. Otherwise replace the | |||||
old binding. */ | |||||
char *result = binding->codeset; | |||||
if (result == NULL || strcmp (codeset, result) != 0) | |||||
{ | |||||
#if defined _LIBC || defined HAVE_STRDUP | |||||
result = strdup (codeset); | |||||
#else | |||||
size_t len = strlen (codeset) + 1; | |||||
result = (char *) malloc (len); | |||||
if (__builtin_expect (result != NULL, 1)) | |||||
memcpy (result, codeset, len); | |||||
#endif | |||||
if (__builtin_expect (result != NULL, 1)) | |||||
{ | |||||
if (binding->codeset != NULL) | |||||
free (binding->codeset); | |||||
binding->codeset = result; | |||||
binding->codeset_cntr++; | |||||
modified = 1; | |||||
} | |||||
} | |||||
*codesetp = result; | |||||
} | |||||
} | |||||
} | |||||
else if ((dirnamep == NULL || *dirnamep == NULL) | |||||
&& (codesetp == NULL || *codesetp == NULL)) | |||||
{ | |||||
/* Simply return the default values. */ | |||||
if (dirnamep) | |||||
*dirnamep = INTUSE(_nl_default_dirname); | |||||
if (codesetp) | |||||
*codesetp = NULL; | |||||
} | |||||
else | |||||
{ | |||||
/* We have to create a new binding. */ | |||||
size_t len = strlen (domainname) + 1; | |||||
struct binding *new_binding = | |||||
(struct binding *) malloc (offsetof (struct binding, domainname) + len); | |||||
if (__builtin_expect (new_binding == NULL, 0)) | |||||
goto failed; | |||||
memcpy (new_binding->domainname, domainname, len); | |||||
if (dirnamep) | |||||
{ | |||||
const char *dirname = *dirnamep; | |||||
if (dirname == NULL) | |||||
/* The default value. */ | |||||
dirname = INTUSE(_nl_default_dirname); | |||||
else | |||||
{ | |||||
if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0) | |||||
dirname = INTUSE(_nl_default_dirname); | |||||
else | |||||
{ | |||||
char *result; | |||||
#if defined _LIBC || defined HAVE_STRDUP | |||||
result = strdup (dirname); | |||||
if (__builtin_expect (result == NULL, 0)) | |||||
goto failed_dirname; | |||||
#else | |||||
size_t len = strlen (dirname) + 1; | |||||
result = (char *) malloc (len); | |||||
if (__builtin_expect (result == NULL, 0)) | |||||
goto failed_dirname; | |||||
memcpy (result, dirname, len); | |||||
#endif | |||||
dirname = result; | |||||
} | |||||
} | |||||
*dirnamep = dirname; | |||||
new_binding->dirname = (char *) dirname; | |||||
} | |||||
else | |||||
/* The default value. */ | |||||
new_binding->dirname = (char *) INTUSE(_nl_default_dirname); | |||||
new_binding->codeset_cntr = 0; | |||||
if (codesetp) | |||||
{ | |||||
const char *codeset = *codesetp; | |||||
if (codeset != NULL) | |||||
{ | |||||
char *result; | |||||
#if defined _LIBC || defined HAVE_STRDUP | |||||
result = strdup (codeset); | |||||
if (__builtin_expect (result == NULL, 0)) | |||||
goto failed_codeset; | |||||
#else | |||||
size_t len = strlen (codeset) + 1; | |||||
result = (char *) malloc (len); | |||||
if (__builtin_expect (result == NULL, 0)) | |||||
goto failed_codeset; | |||||
memcpy (result, codeset, len); | |||||
#endif | |||||
codeset = result; | |||||
new_binding->codeset_cntr++; | |||||
} | |||||
*codesetp = codeset; | |||||
new_binding->codeset = (char *) codeset; | |||||
} | |||||
else | |||||
new_binding->codeset = NULL; | |||||
/* Now enqueue it. */ | |||||
if (_nl_domain_bindings == NULL | |||||
|| strcmp (domainname, _nl_domain_bindings->domainname) < 0) | |||||
{ | |||||
new_binding->next = _nl_domain_bindings; | |||||
_nl_domain_bindings = new_binding; | |||||
} | |||||
else | |||||
{ | |||||
binding = _nl_domain_bindings; | |||||
while (binding->next != NULL | |||||
&& strcmp (domainname, binding->next->domainname) > 0) | |||||
binding = binding->next; | |||||
new_binding->next = binding->next; | |||||
binding->next = new_binding; | |||||
} | |||||
modified = 1; | |||||
/* Here we deal with memory allocation failures. */ | |||||
if (0) | |||||
{ | |||||
failed_codeset: | |||||
if (new_binding->dirname != INTUSE(_nl_default_dirname)) | |||||
free (new_binding->dirname); | |||||
failed_dirname: | |||||
free (new_binding); | |||||
failed: | |||||
if (dirnamep) | |||||
*dirnamep = NULL; | |||||
if (codesetp) | |||||
*codesetp = NULL; | |||||
} | |||||
} | |||||
/* If we modified any binding, we flush the caches. */ | |||||
if (modified) | |||||
++_nl_msg_cat_cntr; | |||||
__libc_rwlock_unlock (_nl_state_lock); | |||||
} | |||||
/* Specify that the DOMAINNAME message catalog will be found | |||||
in DIRNAME rather than in the system locale data base. */ | |||||
char * | |||||
BINDTEXTDOMAIN (const char *domainname, const char *dirname) | |||||
{ | |||||
set_binding_values (domainname, &dirname, NULL); | |||||
return (char *) dirname; | |||||
} | |||||
/* Specify the character encoding in which the messages from the | |||||
DOMAINNAME message catalog will be returned. */ | |||||
char * | |||||
BIND_TEXTDOMAIN_CODESET (const char *domainname, const char *codeset) | |||||
{ | |||||
set_binding_values (domainname, NULL, &codeset); | |||||
return (char *) codeset; | |||||
} | |||||
#ifdef _LIBC | |||||
/* Aliases for function names in GNU C Library. */ | |||||
weak_alias (__bindtextdomain, bindtextdomain); | |||||
weak_alias (__bind_textdomain_codeset, bind_textdomain_codeset); | |||||
#endif |
#! /bin/sh | |||||
# Output a system dependent table of character encoding aliases. | |||||
# | |||||
# Copyright (C) 2000-2004 Free Software Foundation, Inc. | |||||
# | |||||
# This program is free software; you can redistribute it and/or modify it | |||||
# under the terms of the GNU Library General Public License as published | |||||
# by the Free Software Foundation; either version 2, 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 | |||||
# Library General Public License for more details. | |||||
# | |||||
# You should have received a copy of the GNU Library General Public | |||||
# License along with this program; if not, write to the Free Software | |||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
# USA. | |||||
# | |||||
# The table consists of lines of the form | |||||
# ALIAS CANONICAL | |||||
# | |||||
# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)". | |||||
# ALIAS is compared in a case sensitive way. | |||||
# | |||||
# CANONICAL is the GNU canonical name for this character encoding. | |||||
# It must be an encoding supported by libiconv. Support by GNU libc is | |||||
# also desirable. CANONICAL is case insensitive. Usually an upper case | |||||
# MIME charset name is preferred. | |||||
# The current list of GNU canonical charset names is as follows. | |||||
# | |||||
# name MIME? used by which systems | |||||
# ASCII, ANSI_X3.4-1968 glibc solaris freebsd darwin | |||||
# ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd darwin | |||||
# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd darwin | |||||
# ISO-8859-3 Y glibc solaris | |||||
# ISO-8859-4 Y osf solaris freebsd darwin | |||||
# ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd darwin | |||||
# ISO-8859-6 Y glibc aix hpux solaris | |||||
# ISO-8859-7 Y glibc aix hpux irix osf solaris | |||||
# ISO-8859-8 Y glibc aix hpux osf solaris | |||||
# ISO-8859-9 Y glibc aix hpux irix osf solaris | |||||
# ISO-8859-13 glibc | |||||
# ISO-8859-14 glibc | |||||
# ISO-8859-15 glibc aix osf solaris freebsd | |||||
# KOI8-R Y glibc solaris freebsd darwin | |||||
# KOI8-U Y glibc freebsd darwin | |||||
# KOI8-T glibc | |||||
# CP437 dos | |||||
# CP775 dos | |||||
# CP850 aix osf dos | |||||
# CP852 dos | |||||
# CP855 dos | |||||
# CP856 aix | |||||
# CP857 dos | |||||
# CP861 dos | |||||
# CP862 dos | |||||
# CP864 dos | |||||
# CP865 dos | |||||
# CP866 freebsd darwin dos | |||||
# CP869 dos | |||||
# CP874 woe32 dos | |||||
# CP922 aix | |||||
# CP932 aix woe32 dos | |||||
# CP943 aix | |||||
# CP949 osf woe32 dos | |||||
# CP950 woe32 dos | |||||
# CP1046 aix | |||||
# CP1124 aix | |||||
# CP1125 dos | |||||
# CP1129 aix | |||||
# CP1250 woe32 | |||||
# CP1251 glibc solaris darwin woe32 | |||||
# CP1252 aix woe32 | |||||
# CP1253 woe32 | |||||
# CP1254 woe32 | |||||
# CP1255 glibc woe32 | |||||
# CP1256 woe32 | |||||
# CP1257 woe32 | |||||
# GB2312 Y glibc aix hpux irix solaris freebsd darwin | |||||
# EUC-JP Y glibc aix hpux irix osf solaris freebsd darwin | |||||
# EUC-KR Y glibc aix hpux irix osf solaris freebsd darwin | |||||
# EUC-TW glibc aix hpux irix osf solaris | |||||
# BIG5 Y glibc aix hpux osf solaris freebsd darwin | |||||
# BIG5-HKSCS glibc solaris | |||||
# GBK glibc aix osf solaris woe32 dos | |||||
# GB18030 glibc solaris | |||||
# SHIFT_JIS Y hpux osf solaris freebsd darwin | |||||
# JOHAB glibc solaris woe32 | |||||
# TIS-620 glibc aix hpux osf solaris | |||||
# VISCII Y glibc | |||||
# TCVN5712-1 glibc | |||||
# GEORGIAN-PS glibc | |||||
# HP-ROMAN8 hpux | |||||
# HP-ARABIC8 hpux | |||||
# HP-GREEK8 hpux | |||||
# HP-HEBREW8 hpux | |||||
# HP-TURKISH8 hpux | |||||
# HP-KANA8 hpux | |||||
# DEC-KANJI osf | |||||
# DEC-HANYU osf | |||||
# UTF-8 Y glibc aix hpux osf solaris | |||||
# | |||||
# Note: Names which are not marked as being a MIME name should not be used in | |||||
# Internet protocols for information interchange (mail, news, etc.). | |||||
# | |||||
# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications | |||||
# must understand both names and treat them as equivalent. | |||||
# | |||||
# The first argument passed to this file is the canonical host specification, | |||||
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM | |||||
# or | |||||
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM | |||||
host="$1" | |||||
os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'` | |||||
echo "# This file contains a table of character encoding aliases," | |||||
echo "# suitable for operating system '${os}'." | |||||
echo "# It was automatically generated from config.charset." | |||||
# List of references, updated during installation: | |||||
echo "# Packages using this file: " | |||||
case "$os" in | |||||
linux-gnulibc1*) | |||||
# Linux libc5 doesn't have nl_langinfo(CODESET); therefore | |||||
# localcharset.c falls back to using the full locale name | |||||
# from the environment variables. | |||||
echo "C ASCII" | |||||
echo "POSIX ASCII" | |||||
for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \ | |||||
en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \ | |||||
en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \ | |||||
es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \ | |||||
et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \ | |||||
fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \ | |||||
it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \ | |||||
sv_FI sv_SE; do | |||||
echo "$l ISO-8859-1" | |||||
echo "$l.iso-8859-1 ISO-8859-1" | |||||
echo "$l.iso-8859-15 ISO-8859-15" | |||||
echo "$l.iso-8859-15@euro ISO-8859-15" | |||||
echo "$l@euro ISO-8859-15" | |||||
echo "$l.cp-437 CP437" | |||||
echo "$l.cp-850 CP850" | |||||
echo "$l.cp-1252 CP1252" | |||||
echo "$l.cp-1252@euro CP1252" | |||||
#echo "$l.atari-st ATARI-ST" # not a commonly used encoding | |||||
echo "$l.utf-8 UTF-8" | |||||
echo "$l.utf-8@euro UTF-8" | |||||
done | |||||
for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \ | |||||
sl_SI sr sr_CS sr_YU; do | |||||
echo "$l ISO-8859-2" | |||||
echo "$l.iso-8859-2 ISO-8859-2" | |||||
echo "$l.cp-852 CP852" | |||||
echo "$l.cp-1250 CP1250" | |||||
echo "$l.utf-8 UTF-8" | |||||
done | |||||
for l in mk mk_MK ru ru_RU; do | |||||
echo "$l ISO-8859-5" | |||||
echo "$l.iso-8859-5 ISO-8859-5" | |||||
echo "$l.koi8-r KOI8-R" | |||||
echo "$l.cp-866 CP866" | |||||
echo "$l.cp-1251 CP1251" | |||||
echo "$l.utf-8 UTF-8" | |||||
done | |||||
for l in ar ar_SA; do | |||||
echo "$l ISO-8859-6" | |||||
echo "$l.iso-8859-6 ISO-8859-6" | |||||
echo "$l.cp-864 CP864" | |||||
#echo "$l.cp-868 CP868" # not a commonly used encoding | |||||
echo "$l.cp-1256 CP1256" | |||||
echo "$l.utf-8 UTF-8" | |||||
done | |||||
for l in el el_GR gr gr_GR; do | |||||
echo "$l ISO-8859-7" | |||||
echo "$l.iso-8859-7 ISO-8859-7" | |||||
echo "$l.cp-869 CP869" | |||||
echo "$l.cp-1253 CP1253" | |||||
echo "$l.cp-1253@euro CP1253" | |||||
echo "$l.utf-8 UTF-8" | |||||
echo "$l.utf-8@euro UTF-8" | |||||
done | |||||
for l in he he_IL iw iw_IL; do | |||||
echo "$l ISO-8859-8" | |||||
echo "$l.iso-8859-8 ISO-8859-8" | |||||
echo "$l.cp-862 CP862" | |||||
echo "$l.cp-1255 CP1255" | |||||
echo "$l.utf-8 UTF-8" | |||||
done | |||||
for l in tr tr_TR; do | |||||
echo "$l ISO-8859-9" | |||||
echo "$l.iso-8859-9 ISO-8859-9" | |||||
echo "$l.cp-857 CP857" | |||||
echo "$l.cp-1254 CP1254" | |||||
echo "$l.utf-8 UTF-8" | |||||
done | |||||
for l in lt lt_LT lv lv_LV; do | |||||
#echo "$l BALTIC" # not a commonly used encoding, wrong encoding name | |||||
echo "$l ISO-8859-13" | |||||
done | |||||
for l in ru_UA uk uk_UA; do | |||||
echo "$l KOI8-U" | |||||
done | |||||
for l in zh zh_CN; do | |||||
#echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name | |||||
echo "$l GB2312" | |||||
done | |||||
for l in ja ja_JP ja_JP.EUC; do | |||||
echo "$l EUC-JP" | |||||
done | |||||
for l in ko ko_KR; do | |||||
echo "$l EUC-KR" | |||||
done | |||||
for l in th th_TH; do | |||||
echo "$l TIS-620" | |||||
done | |||||
for l in fa fa_IR; do | |||||
#echo "$l ISIRI-3342" # a broken encoding | |||||
echo "$l.utf-8 UTF-8" | |||||
done | |||||
;; | |||||
linux* | *-gnu*) | |||||
# With glibc-2.1 or newer, we don't need any canonicalization, | |||||
# because glibc has iconv and both glibc and libiconv support all | |||||
# GNU canonical names directly. Therefore, the Makefile does not | |||||
# need to install the alias file at all. | |||||
# The following applies only to glibc-2.0.x and older libcs. | |||||
echo "ISO_646.IRV:1983 ASCII" | |||||
;; | |||||
aix*) | |||||
echo "ISO8859-1 ISO-8859-1" | |||||
echo "ISO8859-2 ISO-8859-2" | |||||
echo "ISO8859-5 ISO-8859-5" | |||||
echo "ISO8859-6 ISO-8859-6" | |||||
echo "ISO8859-7 ISO-8859-7" | |||||
echo "ISO8859-8 ISO-8859-8" | |||||
echo "ISO8859-9 ISO-8859-9" | |||||
echo "ISO8859-15 ISO-8859-15" | |||||
echo "IBM-850 CP850" | |||||
echo "IBM-856 CP856" | |||||
echo "IBM-921 ISO-8859-13" | |||||
echo "IBM-922 CP922" | |||||
echo "IBM-932 CP932" | |||||
echo "IBM-943 CP943" | |||||
echo "IBM-1046 CP1046" | |||||
echo "IBM-1124 CP1124" | |||||
echo "IBM-1129 CP1129" | |||||
echo "IBM-1252 CP1252" | |||||
echo "IBM-eucCN GB2312" | |||||
echo "IBM-eucJP EUC-JP" | |||||
echo "IBM-eucKR EUC-KR" | |||||
echo "IBM-eucTW EUC-TW" | |||||
echo "big5 BIG5" | |||||
echo "GBK GBK" | |||||
echo "TIS-620 TIS-620" | |||||
echo "UTF-8 UTF-8" | |||||
;; | |||||
hpux*) | |||||
echo "iso88591 ISO-8859-1" | |||||
echo "iso88592 ISO-8859-2" | |||||
echo "iso88595 ISO-8859-5" | |||||
echo "iso88596 ISO-8859-6" | |||||
echo "iso88597 ISO-8859-7" | |||||
echo "iso88598 ISO-8859-8" | |||||
echo "iso88599 ISO-8859-9" | |||||
echo "iso885915 ISO-8859-15" | |||||
echo "roman8 HP-ROMAN8" | |||||
echo "arabic8 HP-ARABIC8" | |||||
echo "greek8 HP-GREEK8" | |||||
echo "hebrew8 HP-HEBREW8" | |||||
echo "turkish8 HP-TURKISH8" | |||||
echo "kana8 HP-KANA8" | |||||
echo "tis620 TIS-620" | |||||
echo "big5 BIG5" | |||||
echo "eucJP EUC-JP" | |||||
echo "eucKR EUC-KR" | |||||
echo "eucTW EUC-TW" | |||||
echo "hp15CN GB2312" | |||||
#echo "ccdc ?" # what is this? | |||||
echo "SJIS SHIFT_JIS" | |||||
echo "utf8 UTF-8" | |||||
;; | |||||
irix*) | |||||
echo "ISO8859-1 ISO-8859-1" | |||||
echo "ISO8859-2 ISO-8859-2" | |||||
echo "ISO8859-5 ISO-8859-5" | |||||
echo "ISO8859-7 ISO-8859-7" | |||||
echo "ISO8859-9 ISO-8859-9" | |||||
echo "eucCN GB2312" | |||||
echo "eucJP EUC-JP" | |||||
echo "eucKR EUC-KR" | |||||
echo "eucTW EUC-TW" | |||||
;; | |||||
osf*) | |||||
echo "ISO8859-1 ISO-8859-1" | |||||
echo "ISO8859-2 ISO-8859-2" | |||||
echo "ISO8859-4 ISO-8859-4" | |||||
echo "ISO8859-5 ISO-8859-5" | |||||
echo "ISO8859-7 ISO-8859-7" | |||||
echo "ISO8859-8 ISO-8859-8" | |||||
echo "ISO8859-9 ISO-8859-9" | |||||
echo "ISO8859-15 ISO-8859-15" | |||||
echo "cp850 CP850" | |||||
echo "big5 BIG5" | |||||
echo "dechanyu DEC-HANYU" | |||||
echo "dechanzi GB2312" | |||||
echo "deckanji DEC-KANJI" | |||||
echo "deckorean EUC-KR" | |||||
echo "eucJP EUC-JP" | |||||
echo "eucKR EUC-KR" | |||||
echo "eucTW EUC-TW" | |||||
echo "GBK GBK" | |||||
echo "KSC5601 CP949" | |||||
echo "sdeckanji EUC-JP" | |||||
echo "SJIS SHIFT_JIS" | |||||
echo "TACTIS TIS-620" | |||||
echo "UTF-8 UTF-8" | |||||
;; | |||||
solaris*) | |||||
echo "646 ASCII" | |||||
echo "ISO8859-1 ISO-8859-1" | |||||
echo "ISO8859-2 ISO-8859-2" | |||||
echo "ISO8859-3 ISO-8859-3" | |||||
echo "ISO8859-4 ISO-8859-4" | |||||
echo "ISO8859-5 ISO-8859-5" | |||||
echo "ISO8859-6 ISO-8859-6" | |||||
echo "ISO8859-7 ISO-8859-7" | |||||
echo "ISO8859-8 ISO-8859-8" | |||||
echo "ISO8859-9 ISO-8859-9" | |||||
echo "ISO8859-15 ISO-8859-15" | |||||
echo "koi8-r KOI8-R" | |||||
echo "ansi-1251 CP1251" | |||||
echo "BIG5 BIG5" | |||||
echo "Big5-HKSCS BIG5-HKSCS" | |||||
echo "gb2312 GB2312" | |||||
echo "GBK GBK" | |||||
echo "GB18030 GB18030" | |||||
echo "cns11643 EUC-TW" | |||||
echo "5601 EUC-KR" | |||||
echo "ko_KR.johap92 JOHAB" | |||||
echo "eucJP EUC-JP" | |||||
echo "PCK SHIFT_JIS" | |||||
echo "TIS620.2533 TIS-620" | |||||
#echo "sun_eu_greek ?" # what is this? | |||||
echo "UTF-8 UTF-8" | |||||
;; | |||||
freebsd* | os2*) | |||||
# FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore | |||||
# localcharset.c falls back to using the full locale name | |||||
# from the environment variables. | |||||
# Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just | |||||
# reuse FreeBSD's locale data for OS/2. | |||||
echo "C ASCII" | |||||
echo "US-ASCII ASCII" | |||||
for l in la_LN lt_LN; do | |||||
echo "$l.ASCII ASCII" | |||||
done | |||||
for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ | |||||
fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ | |||||
lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do | |||||
echo "$l.ISO_8859-1 ISO-8859-1" | |||||
echo "$l.DIS_8859-15 ISO-8859-15" | |||||
done | |||||
for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do | |||||
echo "$l.ISO_8859-2 ISO-8859-2" | |||||
done | |||||
for l in la_LN lt_LT; do | |||||
echo "$l.ISO_8859-4 ISO-8859-4" | |||||
done | |||||
for l in ru_RU ru_SU; do | |||||
echo "$l.KOI8-R KOI8-R" | |||||
echo "$l.ISO_8859-5 ISO-8859-5" | |||||
echo "$l.CP866 CP866" | |||||
done | |||||
echo "uk_UA.KOI8-U KOI8-U" | |||||
echo "zh_TW.BIG5 BIG5" | |||||
echo "zh_TW.Big5 BIG5" | |||||
echo "zh_CN.EUC GB2312" | |||||
echo "ja_JP.EUC EUC-JP" | |||||
echo "ja_JP.SJIS SHIFT_JIS" | |||||
echo "ja_JP.Shift_JIS SHIFT_JIS" | |||||
echo "ko_KR.EUC EUC-KR" | |||||
;; | |||||
netbsd*) | |||||
echo "646 ASCII" | |||||
echo "ISO8859-1 ISO-8859-1" | |||||
echo "ISO8859-2 ISO-8859-2" | |||||
echo "ISO8859-4 ISO-8859-4" | |||||
echo "ISO8859-5 ISO-8859-5" | |||||
echo "ISO8859-15 ISO-8859-15" | |||||
echo "eucCN GB2312" | |||||
echo "eucJP EUC-JP" | |||||
echo "eucKR EUC-KR" | |||||
echo "eucTW EUC-TW" | |||||
echo "BIG5 BIG5" | |||||
echo "SJIS SHIFT_JIS" | |||||
;; | |||||
darwin*) | |||||
# Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore | |||||
# localcharset.c falls back to using the full locale name | |||||
# from the environment variables. | |||||
echo "C ASCII" | |||||
for l in en_AU en_CA en_GB en_US la_LN; do | |||||
echo "$l.US-ASCII ASCII" | |||||
done | |||||
for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ | |||||
fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \ | |||||
nl_NL no_NO pt_PT sv_SE; do | |||||
echo "$l ISO-8859-1" | |||||
echo "$l.ISO8859-1 ISO-8859-1" | |||||
echo "$l.ISO8859-15 ISO-8859-15" | |||||
done | |||||
for l in la_LN; do | |||||
echo "$l.ISO8859-1 ISO-8859-1" | |||||
echo "$l.ISO8859-15 ISO-8859-15" | |||||
done | |||||
for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do | |||||
echo "$l.ISO8859-2 ISO-8859-2" | |||||
done | |||||
for l in la_LN lt_LT; do | |||||
echo "$l.ISO8859-4 ISO-8859-4" | |||||
done | |||||
for l in ru_RU; do | |||||
echo "$l.KOI8-R KOI8-R" | |||||
echo "$l.ISO8859-5 ISO-8859-5" | |||||
echo "$l.CP866 CP866" | |||||
done | |||||
for l in bg_BG; do | |||||
echo "$l.CP1251 CP1251" | |||||
done | |||||
echo "uk_UA.KOI8-U KOI8-U" | |||||
echo "zh_TW.BIG5 BIG5" | |||||
echo "zh_TW.Big5 BIG5" | |||||
echo "zh_CN.EUC GB2312" | |||||
echo "ja_JP.EUC EUC-JP" | |||||
echo "ja_JP.SJIS SHIFT_JIS" | |||||
echo "ko_KR.EUC EUC-KR" | |||||
;; | |||||
beos*) | |||||
# BeOS has a single locale, and it has UTF-8 encoding. | |||||
echo "* UTF-8" | |||||
;; | |||||
msdosdjgpp*) | |||||
# DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore | |||||
# localcharset.c falls back to using the full locale name | |||||
# from the environment variables. | |||||
echo "#" | |||||
echo "# The encodings given here may not all be correct." | |||||
echo "# If you find that the encoding given for your language and" | |||||
echo "# country is not the one your DOS machine actually uses, just" | |||||
echo "# correct it in this file, and send a mail to" | |||||
echo "# Juan Manuel Guerrero <st001906@hrz1.hrz.tu-darmstadt.de>" | |||||
echo "# and Bruno Haible <bruno@clisp.org>." | |||||
echo "#" | |||||
echo "C ASCII" | |||||
# ISO-8859-1 languages | |||||
echo "ca CP850" | |||||
echo "ca_ES CP850" | |||||
echo "da CP865" # not CP850 ?? | |||||
echo "da_DK CP865" # not CP850 ?? | |||||
echo "de CP850" | |||||
echo "de_AT CP850" | |||||
echo "de_CH CP850" | |||||
echo "de_DE CP850" | |||||
echo "en CP850" | |||||
echo "en_AU CP850" # not CP437 ?? | |||||
echo "en_CA CP850" | |||||
echo "en_GB CP850" | |||||
echo "en_NZ CP437" | |||||
echo "en_US CP437" | |||||
echo "en_ZA CP850" # not CP437 ?? | |||||
echo "es CP850" | |||||
echo "es_AR CP850" | |||||
echo "es_BO CP850" | |||||
echo "es_CL CP850" | |||||
echo "es_CO CP850" | |||||
echo "es_CR CP850" | |||||
echo "es_CU CP850" | |||||
echo "es_DO CP850" | |||||
echo "es_EC CP850" | |||||
echo "es_ES CP850" | |||||
echo "es_GT CP850" | |||||
echo "es_HN CP850" | |||||
echo "es_MX CP850" | |||||
echo "es_NI CP850" | |||||
echo "es_PA CP850" | |||||
echo "es_PY CP850" | |||||
echo "es_PE CP850" | |||||
echo "es_SV CP850" | |||||
echo "es_UY CP850" | |||||
echo "es_VE CP850" | |||||
echo "et CP850" | |||||
echo "et_EE CP850" | |||||
echo "eu CP850" | |||||
echo "eu_ES CP850" | |||||
echo "fi CP850" | |||||
echo "fi_FI CP850" | |||||
echo "fr CP850" | |||||
echo "fr_BE CP850" | |||||
echo "fr_CA CP850" | |||||
echo "fr_CH CP850" | |||||
echo "fr_FR CP850" | |||||
echo "ga CP850" | |||||
echo "ga_IE CP850" | |||||
echo "gd CP850" | |||||
echo "gd_GB CP850" | |||||
echo "gl CP850" | |||||
echo "gl_ES CP850" | |||||
echo "id CP850" # not CP437 ?? | |||||
echo "id_ID CP850" # not CP437 ?? | |||||
echo "is CP861" # not CP850 ?? | |||||
echo "is_IS CP861" # not CP850 ?? | |||||
echo "it CP850" | |||||
echo "it_CH CP850" | |||||
echo "it_IT CP850" | |||||
echo "lt CP775" | |||||
echo "lt_LT CP775" | |||||
echo "lv CP775" | |||||
echo "lv_LV CP775" | |||||
echo "nb CP865" # not CP850 ?? | |||||
echo "nb_NO CP865" # not CP850 ?? | |||||
echo "nl CP850" | |||||
echo "nl_BE CP850" | |||||
echo "nl_NL CP850" | |||||
echo "nn CP865" # not CP850 ?? | |||||
echo "nn_NO CP865" # not CP850 ?? | |||||
echo "no CP865" # not CP850 ?? | |||||
echo "no_NO CP865" # not CP850 ?? | |||||
echo "pt CP850" | |||||
echo "pt_BR CP850" | |||||
echo "pt_PT CP850" | |||||
echo "sv CP850" | |||||
echo "sv_SE CP850" | |||||
# ISO-8859-2 languages | |||||
echo "cs CP852" | |||||
echo "cs_CZ CP852" | |||||
echo "hr CP852" | |||||
echo "hr_HR CP852" | |||||
echo "hu CP852" | |||||
echo "hu_HU CP852" | |||||
echo "pl CP852" | |||||
echo "pl_PL CP852" | |||||
echo "ro CP852" | |||||
echo "ro_RO CP852" | |||||
echo "sk CP852" | |||||
echo "sk_SK CP852" | |||||
echo "sl CP852" | |||||
echo "sl_SI CP852" | |||||
echo "sq CP852" | |||||
echo "sq_AL CP852" | |||||
echo "sr CP852" # CP852 or CP866 or CP855 ?? | |||||
echo "sr_CS CP852" # CP852 or CP866 or CP855 ?? | |||||
echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? | |||||
# ISO-8859-3 languages | |||||
echo "mt CP850" | |||||
echo "mt_MT CP850" | |||||
# ISO-8859-5 languages | |||||
echo "be CP866" | |||||
echo "be_BE CP866" | |||||
echo "bg CP866" # not CP855 ?? | |||||
echo "bg_BG CP866" # not CP855 ?? | |||||
echo "mk CP866" # not CP855 ?? | |||||
echo "mk_MK CP866" # not CP855 ?? | |||||
echo "ru CP866" | |||||
echo "ru_RU CP866" | |||||
echo "uk CP1125" | |||||
echo "uk_UA CP1125" | |||||
# ISO-8859-6 languages | |||||
echo "ar CP864" | |||||
echo "ar_AE CP864" | |||||
echo "ar_DZ CP864" | |||||
echo "ar_EG CP864" | |||||
echo "ar_IQ CP864" | |||||
echo "ar_IR CP864" | |||||
echo "ar_JO CP864" | |||||
echo "ar_KW CP864" | |||||
echo "ar_MA CP864" | |||||
echo "ar_OM CP864" | |||||
echo "ar_QA CP864" | |||||
echo "ar_SA CP864" | |||||
echo "ar_SY CP864" | |||||
# ISO-8859-7 languages | |||||
echo "el CP869" | |||||
echo "el_GR CP869" | |||||
# ISO-8859-8 languages | |||||
echo "he CP862" | |||||
echo "he_IL CP862" | |||||
# ISO-8859-9 languages | |||||
echo "tr CP857" | |||||
echo "tr_TR CP857" | |||||
# Japanese | |||||
echo "ja CP932" | |||||
echo "ja_JP CP932" | |||||
# Chinese | |||||
echo "zh_CN GBK" | |||||
echo "zh_TW CP950" # not CP938 ?? | |||||
# Korean | |||||
echo "kr CP949" # not CP934 ?? | |||||
echo "kr_KR CP949" # not CP934 ?? | |||||
# Thai | |||||
echo "th CP874" | |||||
echo "th_TH CP874" | |||||
# Other | |||||
echo "eo CP850" | |||||
echo "eo_EO CP850" | |||||
;; | |||||
esac |
/* Implementation of the dcgettext(3) function. | |||||
Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#include "gettextP.h" | |||||
#ifdef _LIBC | |||||
# include <libintl.h> | |||||
#else | |||||
# include "libgnuintl.h" | |||||
#endif | |||||
/* @@ end of prolog @@ */ | |||||
/* Names for the libintl functions are a problem. They must not clash | |||||
with existing names and they should follow ANSI C. But this source | |||||
code is also used in GNU C Library where the names have a __ | |||||
prefix. So we have to make a difference here. */ | |||||
#ifdef _LIBC | |||||
# define DCGETTEXT __dcgettext | |||||
# define DCIGETTEXT __dcigettext | |||||
#else | |||||
# define DCGETTEXT libintl_dcgettext | |||||
# define DCIGETTEXT libintl_dcigettext | |||||
#endif | |||||
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY | |||||
locale. */ | |||||
char * | |||||
DCGETTEXT (const char *domainname, const char *msgid, int category) | |||||
{ | |||||
return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category); | |||||
} | |||||
#ifdef _LIBC | |||||
/* Alias for function name in GNU C Library. */ | |||||
INTDEF(__dcgettext) | |||||
weak_alias (__dcgettext, dcgettext); | |||||
#endif |
/* Implementation of the dcngettext(3) function. | |||||
Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#include "gettextP.h" | |||||
#ifdef _LIBC | |||||
# include <libintl.h> | |||||
#else | |||||
# include "libgnuintl.h" | |||||
#endif | |||||
/* @@ end of prolog @@ */ | |||||
/* Names for the libintl functions are a problem. They must not clash | |||||
with existing names and they should follow ANSI C. But this source | |||||
code is also used in GNU C Library where the names have a __ | |||||
prefix. So we have to make a difference here. */ | |||||
#ifdef _LIBC | |||||
# define DCNGETTEXT __dcngettext | |||||
# define DCIGETTEXT __dcigettext | |||||
#else | |||||
# define DCNGETTEXT libintl_dcngettext | |||||
# define DCIGETTEXT libintl_dcigettext | |||||
#endif | |||||
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY | |||||
locale. */ | |||||
char * | |||||
DCNGETTEXT (const char *domainname, | |||||
const char *msgid1, const char *msgid2, unsigned long int n, | |||||
int category) | |||||
{ | |||||
return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category); | |||||
} | |||||
#ifdef _LIBC | |||||
/* Alias for function name in GNU C Library. */ | |||||
weak_alias (__dcngettext, dcngettext); | |||||
#endif |
/* Implementation of the dgettext(3) function. | |||||
Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#include "gettextP.h" | |||||
#include <locale.h> | |||||
#ifdef _LIBC | |||||
# include <libintl.h> | |||||
#else | |||||
# include "libgnuintl.h" | |||||
#endif | |||||
/* @@ end of prolog @@ */ | |||||
/* Names for the libintl functions are a problem. They must not clash | |||||
with existing names and they should follow ANSI C. But this source | |||||
code is also used in GNU C Library where the names have a __ | |||||
prefix. So we have to make a difference here. */ | |||||
#ifdef _LIBC | |||||
# define DGETTEXT __dgettext | |||||
# define DCGETTEXT INTUSE(__dcgettext) | |||||
#else | |||||
# define DGETTEXT libintl_dgettext | |||||
# define DCGETTEXT libintl_dcgettext | |||||
#endif | |||||
/* Look up MSGID in the DOMAINNAME message catalog of the current | |||||
LC_MESSAGES locale. */ | |||||
char * | |||||
DGETTEXT (const char *domainname, const char *msgid) | |||||
{ | |||||
return DCGETTEXT (domainname, msgid, LC_MESSAGES); | |||||
} | |||||
#ifdef _LIBC | |||||
/* Alias for function name in GNU C Library. */ | |||||
weak_alias (__dgettext, dgettext); | |||||
#endif |
/* Implementation of the dngettext(3) function. | |||||
Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#include "gettextP.h" | |||||
#include <locale.h> | |||||
#ifdef _LIBC | |||||
# include <libintl.h> | |||||
#else | |||||
# include "libgnuintl.h" | |||||
#endif | |||||
/* @@ end of prolog @@ */ | |||||
/* Names for the libintl functions are a problem. They must not clash | |||||
with existing names and they should follow ANSI C. But this source | |||||
code is also used in GNU C Library where the names have a __ | |||||
prefix. So we have to make a difference here. */ | |||||
#ifdef _LIBC | |||||
# define DNGETTEXT __dngettext | |||||
# define DCNGETTEXT __dcngettext | |||||
#else | |||||
# define DNGETTEXT libintl_dngettext | |||||
# define DCNGETTEXT libintl_dcngettext | |||||
#endif | |||||
/* Look up MSGID in the DOMAINNAME message catalog of the current | |||||
LC_MESSAGES locale and skip message according to the plural form. */ | |||||
char * | |||||
DNGETTEXT (const char *domainname, | |||||
const char *msgid1, const char *msgid2, unsigned long int n) | |||||
{ | |||||
return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES); | |||||
} | |||||
#ifdef _LIBC | |||||
/* Alias for function name in GNU C Library. */ | |||||
weak_alias (__dngettext, dngettext); | |||||
#endif |
/* Plural expression evaluation. | |||||
Copyright (C) 2000-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef STATIC | |||||
#define STATIC static | |||||
#endif | |||||
/* Evaluate the plural expression and return an index value. */ | |||||
STATIC | |||||
unsigned long int | |||||
internal_function | |||||
plural_eval (struct expression *pexp, unsigned long int n) | |||||
{ | |||||
switch (pexp->nargs) | |||||
{ | |||||
case 0: | |||||
switch (pexp->operation) | |||||
{ | |||||
case var: | |||||
return n; | |||||
case num: | |||||
return pexp->val.num; | |||||
default: | |||||
break; | |||||
} | |||||
/* NOTREACHED */ | |||||
break; | |||||
case 1: | |||||
{ | |||||
/* pexp->operation must be lnot. */ | |||||
unsigned long int arg = plural_eval (pexp->val.args[0], n); | |||||
return ! arg; | |||||
} | |||||
case 2: | |||||
{ | |||||
unsigned long int leftarg = plural_eval (pexp->val.args[0], n); | |||||
if (pexp->operation == lor) | |||||
return leftarg || plural_eval (pexp->val.args[1], n); | |||||
else if (pexp->operation == land) | |||||
return leftarg && plural_eval (pexp->val.args[1], n); | |||||
else | |||||
{ | |||||
unsigned long int rightarg = plural_eval (pexp->val.args[1], n); | |||||
switch (pexp->operation) | |||||
{ | |||||
case mult: | |||||
return leftarg * rightarg; | |||||
case divide: | |||||
#if !INTDIV0_RAISES_SIGFPE | |||||
if (rightarg == 0) | |||||
raise (SIGFPE); | |||||
#endif | |||||
return leftarg / rightarg; | |||||
case module: | |||||
#if !INTDIV0_RAISES_SIGFPE | |||||
if (rightarg == 0) | |||||
raise (SIGFPE); | |||||
#endif | |||||
return leftarg % rightarg; | |||||
case plus: | |||||
return leftarg + rightarg; | |||||
case minus: | |||||
return leftarg - rightarg; | |||||
case less_than: | |||||
return leftarg < rightarg; | |||||
case greater_than: | |||||
return leftarg > rightarg; | |||||
case less_or_equal: | |||||
return leftarg <= rightarg; | |||||
case greater_or_equal: | |||||
return leftarg >= rightarg; | |||||
case equal: | |||||
return leftarg == rightarg; | |||||
case not_equal: | |||||
return leftarg != rightarg; | |||||
default: | |||||
break; | |||||
} | |||||
} | |||||
/* NOTREACHED */ | |||||
break; | |||||
} | |||||
case 3: | |||||
{ | |||||
/* pexp->operation must be qmop. */ | |||||
unsigned long int boolarg = plural_eval (pexp->val.args[0], n); | |||||
return plural_eval (pexp->val.args[boolarg ? 1 : 2], n); | |||||
} | |||||
} | |||||
/* NOTREACHED */ | |||||
return 0; | |||||
} |
/* Copyright (C) 1995-1998, 2000-2001, 2003 Free Software Foundation, Inc. | |||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#include <sys/types.h> | |||||
#include "loadinfo.h" | |||||
/* On some strange systems still no definition of NULL is found. Sigh! */ | |||||
#ifndef NULL | |||||
# if defined __STDC__ && __STDC__ | |||||
# define NULL ((void *) 0) | |||||
# else | |||||
# define NULL 0 | |||||
# endif | |||||
#endif | |||||
/* @@ end of prolog @@ */ | |||||
char * | |||||
_nl_find_language (const char *name) | |||||
{ | |||||
while (name[0] != '\0' && name[0] != '_' && name[0] != '@' | |||||
&& name[0] != '+' && name[0] != ',') | |||||
++name; | |||||
return (char *) name; | |||||
} | |||||
int | |||||
_nl_explode_name (char *name, | |||||
const char **language, const char **modifier, | |||||
const char **territory, const char **codeset, | |||||
const char **normalized_codeset, const char **special, | |||||
const char **sponsor, const char **revision) | |||||
{ | |||||
enum { undecided, xpg, cen } syntax; | |||||
char *cp; | |||||
int mask; | |||||
*modifier = NULL; | |||||
*territory = NULL; | |||||
*codeset = NULL; | |||||
*normalized_codeset = NULL; | |||||
*special = NULL; | |||||
*sponsor = NULL; | |||||
*revision = NULL; | |||||
/* Now we determine the single parts of the locale name. First | |||||
look for the language. Termination symbols are `_' and `@' if | |||||
we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ | |||||
mask = 0; | |||||
syntax = undecided; | |||||
*language = cp = name; | |||||
cp = _nl_find_language (*language); | |||||
if (*language == cp) | |||||
/* This does not make sense: language has to be specified. Use | |||||
this entry as it is without exploding. Perhaps it is an alias. */ | |||||
cp = strchr (*language, '\0'); | |||||
else if (cp[0] == '_') | |||||
{ | |||||
/* Next is the territory. */ | |||||
cp[0] = '\0'; | |||||
*territory = ++cp; | |||||
while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' | |||||
&& cp[0] != '+' && cp[0] != ',' && cp[0] != '_') | |||||
++cp; | |||||
mask |= TERRITORY; | |||||
if (cp[0] == '.') | |||||
{ | |||||
/* Next is the codeset. */ | |||||
syntax = xpg; | |||||
cp[0] = '\0'; | |||||
*codeset = ++cp; | |||||
while (cp[0] != '\0' && cp[0] != '@') | |||||
++cp; | |||||
mask |= XPG_CODESET; | |||||
if (*codeset != cp && (*codeset)[0] != '\0') | |||||
{ | |||||
*normalized_codeset = _nl_normalize_codeset (*codeset, | |||||
cp - *codeset); | |||||
if (strcmp (*codeset, *normalized_codeset) == 0) | |||||
free ((char *) *normalized_codeset); | |||||
else | |||||
mask |= XPG_NORM_CODESET; | |||||
} | |||||
} | |||||
} | |||||
if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) | |||||
{ | |||||
/* Next is the modifier. */ | |||||
syntax = cp[0] == '@' ? xpg : cen; | |||||
cp[0] = '\0'; | |||||
*modifier = ++cp; | |||||
while (syntax == cen && cp[0] != '\0' && cp[0] != '+' | |||||
&& cp[0] != ',' && cp[0] != '_') | |||||
++cp; | |||||
mask |= XPG_MODIFIER | CEN_AUDIENCE; | |||||
} | |||||
if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) | |||||
{ | |||||
syntax = cen; | |||||
if (cp[0] == '+') | |||||
{ | |||||
/* Next is special application (CEN syntax). */ | |||||
cp[0] = '\0'; | |||||
*special = ++cp; | |||||
while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') | |||||
++cp; | |||||
mask |= CEN_SPECIAL; | |||||
} | |||||
if (cp[0] == ',') | |||||
{ | |||||
/* Next is sponsor (CEN syntax). */ | |||||
cp[0] = '\0'; | |||||
*sponsor = ++cp; | |||||
while (cp[0] != '\0' && cp[0] != '_') | |||||
++cp; | |||||
mask |= CEN_SPONSOR; | |||||
} | |||||
if (cp[0] == '_') | |||||
{ | |||||
/* Next is revision (CEN syntax). */ | |||||
cp[0] = '\0'; | |||||
*revision = ++cp; | |||||
mask |= CEN_REVISION; | |||||
} | |||||
} | |||||
/* For CEN syntax values it might be important to have the | |||||
separator character in the file name, not for XPG syntax. */ | |||||
if (syntax == xpg) | |||||
{ | |||||
if (*territory != NULL && (*territory)[0] == '\0') | |||||
mask &= ~TERRITORY; | |||||
if (*codeset != NULL && (*codeset)[0] == '\0') | |||||
mask &= ~XPG_CODESET; | |||||
if (*modifier != NULL && (*modifier)[0] == '\0') | |||||
mask &= ~XPG_MODIFIER; | |||||
} | |||||
return mask; | |||||
} |
/* Handle list of needed message catalogs | |||||
Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc. | |||||
Written by Ulrich Drepper <drepper@gnu.org>, 1995. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#include <stdio.h> | |||||
#include <sys/types.h> | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#if defined HAVE_UNISTD_H || defined _LIBC | |||||
# include <unistd.h> | |||||
#endif | |||||
#include "gettextP.h" | |||||
#ifdef _LIBC | |||||
# include <libintl.h> | |||||
#else | |||||
# include "libgnuintl.h" | |||||
#endif | |||||
/* @@ end of prolog @@ */ | |||||
/* List of already loaded domains. */ | |||||
static struct loaded_l10nfile *_nl_loaded_domains; | |||||
/* Return a data structure describing the message catalog described by | |||||
the DOMAINNAME and CATEGORY parameters with respect to the currently | |||||
established bindings. */ | |||||
struct loaded_l10nfile * | |||||
internal_function | |||||
_nl_find_domain (const char *dirname, char *locale, | |||||
const char *domainname, struct binding *domainbinding) | |||||
{ | |||||
struct loaded_l10nfile *retval; | |||||
const char *language; | |||||
const char *modifier; | |||||
const char *territory; | |||||
const char *codeset; | |||||
const char *normalized_codeset; | |||||
const char *special; | |||||
const char *sponsor; | |||||
const char *revision; | |||||
const char *alias_value; | |||||
int mask; | |||||
/* LOCALE can consist of up to four recognized parts for the XPG syntax: | |||||
language[_territory[.codeset]][@modifier] | |||||
and six parts for the CEN syntax: | |||||
language[_territory][+audience][+special][,[sponsor][_revision]] | |||||
Beside the first part all of them are allowed to be missing. If | |||||
the full specified locale is not found, the less specific one are | |||||
looked for. The various parts will be stripped off according to | |||||
the following order: | |||||
(1) revision | |||||
(2) sponsor | |||||
(3) special | |||||
(4) codeset | |||||
(5) normalized codeset | |||||
(6) territory | |||||
(7) audience/modifier | |||||
*/ | |||||
/* If we have already tested for this locale entry there has to | |||||
be one data set in the list of loaded domains. */ | |||||
retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, | |||||
strlen (dirname) + 1, 0, locale, NULL, NULL, | |||||
NULL, NULL, NULL, NULL, NULL, domainname, 0); | |||||
if (retval != NULL) | |||||
{ | |||||
/* We know something about this locale. */ | |||||
int cnt; | |||||
if (retval->decided == 0) | |||||
_nl_load_domain (retval, domainbinding); | |||||
if (retval->data != NULL) | |||||
return retval; | |||||
for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) | |||||
{ | |||||
if (retval->successor[cnt]->decided == 0) | |||||
_nl_load_domain (retval->successor[cnt], domainbinding); | |||||
if (retval->successor[cnt]->data != NULL) | |||||
break; | |||||
} | |||||
return cnt >= 0 ? retval : NULL; | |||||
/* NOTREACHED */ | |||||
} | |||||
/* See whether the locale value is an alias. If yes its value | |||||
*overwrites* the alias name. No test for the original value is | |||||
done. */ | |||||
alias_value = _nl_expand_alias (locale); | |||||
if (alias_value != NULL) | |||||
{ | |||||
#if defined _LIBC || defined HAVE_STRDUP | |||||
locale = strdup (alias_value); | |||||
if (locale == NULL) | |||||
return NULL; | |||||
#else | |||||
size_t len = strlen (alias_value) + 1; | |||||
locale = (char *) malloc (len); | |||||
if (locale == NULL) | |||||
return NULL; | |||||
memcpy (locale, alias_value, len); | |||||
#endif | |||||
} | |||||
/* Now we determine the single parts of the locale name. First | |||||
look for the language. Termination symbols are `_' and `@' if | |||||
we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ | |||||
mask = _nl_explode_name (locale, &language, &modifier, &territory, | |||||
&codeset, &normalized_codeset, &special, | |||||
&sponsor, &revision); | |||||
/* Create all possible locale entries which might be interested in | |||||
generalization. */ | |||||
retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, | |||||
strlen (dirname) + 1, mask, language, territory, | |||||
codeset, normalized_codeset, modifier, special, | |||||
sponsor, revision, domainname, 1); | |||||
if (retval == NULL) | |||||
/* This means we are out of core. */ | |||||
return NULL; | |||||
if (retval->decided == 0) | |||||
_nl_load_domain (retval, domainbinding); | |||||
if (retval->data == NULL) | |||||
{ | |||||
int cnt; | |||||
for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) | |||||
{ | |||||
if (retval->successor[cnt]->decided == 0) | |||||
_nl_load_domain (retval->successor[cnt], domainbinding); | |||||
if (retval->successor[cnt]->data != NULL) | |||||
break; | |||||
} | |||||
} | |||||
/* The room for an alias was dynamically allocated. Free it now. */ | |||||
if (alias_value != NULL) | |||||
free (locale); | |||||
/* The space for normalized_codeset is dynamically allocated. Free it. */ | |||||
if (mask & XPG_NORM_CODESET) | |||||
free ((void *) normalized_codeset); | |||||
return retval; | |||||
} | |||||
#ifdef _LIBC | |||||
libc_freeres_fn (free_mem) | |||||
{ | |||||
struct loaded_l10nfile *runp = _nl_loaded_domains; | |||||
while (runp != NULL) | |||||
{ | |||||
struct loaded_l10nfile *here = runp; | |||||
if (runp->data != NULL) | |||||
_nl_unload_domain ((struct loaded_domain *) runp->data); | |||||
runp = runp->next; | |||||
free ((char *) here->filename); | |||||
free (here); | |||||
} | |||||
} | |||||
#endif |
/* Implementation of gettext(3) function. | |||||
Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#ifdef _LIBC | |||||
# define __need_NULL | |||||
# include <stddef.h> | |||||
#else | |||||
# include <stdlib.h> /* Just for NULL. */ | |||||
#endif | |||||
#include "gettextP.h" | |||||
#ifdef _LIBC | |||||
# include <libintl.h> | |||||
#else | |||||
# include "libgnuintl.h" | |||||
#endif | |||||
/* @@ end of prolog @@ */ | |||||
/* Names for the libintl functions are a problem. They must not clash | |||||
with existing names and they should follow ANSI C. But this source | |||||
code is also used in GNU C Library where the names have a __ | |||||
prefix. So we have to make a difference here. */ | |||||
#ifdef _LIBC | |||||
# define GETTEXT __gettext | |||||
# define DCGETTEXT INTUSE(__dcgettext) | |||||
#else | |||||
# define GETTEXT libintl_gettext | |||||
# define DCGETTEXT libintl_dcgettext | |||||
#endif | |||||
/* Look up MSGID in the current default message catalog for the current | |||||
LC_MESSAGES locale. If not found, returns MSGID itself (the default | |||||
text). */ | |||||
char * | |||||
GETTEXT (const char *msgid) | |||||
{ | |||||
return DCGETTEXT (NULL, msgid, LC_MESSAGES); | |||||
} | |||||
#ifdef _LIBC | |||||
/* Alias for function name in GNU C Library. */ | |||||
weak_alias (__gettext, gettext); | |||||
#endif |
/* Convenience header for conditional use of GNU <libintl.h>. | |||||
Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef _LIBGETTEXT_H | |||||
#define _LIBGETTEXT_H 1 | |||||
/* NLS can be disabled through the configure --disable-nls option. */ | |||||
#if ENABLE_NLS | |||||
/* Get declarations of GNU message catalog functions. */ | |||||
# include <libintl.h> | |||||
#else | |||||
/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which | |||||
chokes if dcgettext is defined as a macro. So include it now, to make | |||||
later inclusions of <locale.h> a NOP. We don't include <libintl.h> | |||||
as well because people using "gettext.h" will not include <libintl.h>, | |||||
and also including <libintl.h> would fail on SunOS 4, whereas <locale.h> | |||||
is OK. */ | |||||
#if defined(__sun) | |||||
# include <locale.h> | |||||
#endif | |||||
/* Disabled NLS. | |||||
The casts to 'const char *' serve the purpose of producing warnings | |||||
for invalid uses of the value returned from these functions. | |||||
On pre-ANSI systems without 'const', the config.h file is supposed to | |||||
contain "#define const". */ | |||||
# define gettext(Msgid) ((const char *) (Msgid)) | |||||
# define dgettext(Domainname, Msgid) ((const char *) (Msgid)) | |||||
# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) | |||||
# define ngettext(Msgid1, Msgid2, N) \ | |||||
((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) | |||||
# define dngettext(Domainname, Msgid1, Msgid2, N) \ | |||||
((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) | |||||
# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ | |||||
((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) | |||||
# define textdomain(Domainname) ((const char *) (Domainname)) | |||||
# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) | |||||
# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) | |||||
#endif | |||||
/* A pseudo function call that serves as a marker for the automated | |||||
extraction of messages, but does not call gettext(). The run-time | |||||
translation is done at a different place in the code. | |||||
The argument, String, should be a literal string. Concatenated strings | |||||
and other string expressions won't work. | |||||
The macro's expansion is not parenthesized, so that it is suitable as | |||||
initializer for static 'char[]' or 'const char[]' variables. */ | |||||
#define gettext_noop(String) String | |||||
#endif /* _LIBGETTEXT_H */ |
/* Header describing internals of libintl library. | |||||
Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. | |||||
Written by Ulrich Drepper <drepper@cygnus.com>, 1995. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef _GETTEXTP_H | |||||
#define _GETTEXTP_H | |||||
#include <stddef.h> /* Get size_t. */ | |||||
#ifdef _LIBC | |||||
# include "../iconv/gconv_int.h" | |||||
#else | |||||
# if HAVE_ICONV | |||||
# include <iconv.h> | |||||
# endif | |||||
#endif | |||||
#include "loadinfo.h" | |||||
#include "gmo.h" /* Get nls_uint32. */ | |||||
/* @@ end of prolog @@ */ | |||||
#ifndef internal_function | |||||
# define internal_function | |||||
#endif | |||||
#ifndef attribute_hidden | |||||
# define attribute_hidden | |||||
#endif | |||||
/* Tell the compiler when a conditional or integer expression is | |||||
almost always true or almost always false. */ | |||||
#ifndef HAVE_BUILTIN_EXPECT | |||||
# define __builtin_expect(expr, val) (expr) | |||||
#endif | |||||
#ifndef W | |||||
# define W(flag, data) ((flag) ? SWAP (data) : (data)) | |||||
#endif | |||||
#ifdef _LIBC | |||||
# include <byteswap.h> | |||||
# define SWAP(i) bswap_32 (i) | |||||
#else | |||||
static inline nls_uint32 | |||||
SWAP (i) | |||||
nls_uint32 i; | |||||
{ | |||||
return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); | |||||
} | |||||
#endif | |||||
/* In-memory representation of system dependent string. */ | |||||
struct sysdep_string_desc | |||||
{ | |||||
/* Length of addressed string, including the trailing NUL. */ | |||||
size_t length; | |||||
/* Pointer to addressed string. */ | |||||
const char *pointer; | |||||
}; | |||||
/* The representation of an opened message catalog. */ | |||||
struct loaded_domain | |||||
{ | |||||
/* Pointer to memory containing the .mo file. */ | |||||
const char *data; | |||||
/* 1 if the memory is mmap()ed, 0 if the memory is malloc()ed. */ | |||||
int use_mmap; | |||||
/* Size of mmap()ed memory. */ | |||||
size_t mmap_size; | |||||
/* 1 if the .mo file uses a different endianness than this machine. */ | |||||
int must_swap; | |||||
/* Pointer to additional malloc()ed memory. */ | |||||
void *malloced; | |||||
/* Number of static strings pairs. */ | |||||
nls_uint32 nstrings; | |||||
/* Pointer to descriptors of original strings in the file. */ | |||||
const struct string_desc *orig_tab; | |||||
/* Pointer to descriptors of translated strings in the file. */ | |||||
const struct string_desc *trans_tab; | |||||
/* Number of system dependent strings pairs. */ | |||||
nls_uint32 n_sysdep_strings; | |||||
/* Pointer to descriptors of original sysdep strings. */ | |||||
const struct sysdep_string_desc *orig_sysdep_tab; | |||||
/* Pointer to descriptors of translated sysdep strings. */ | |||||
const struct sysdep_string_desc *trans_sysdep_tab; | |||||
/* Size of hash table. */ | |||||
nls_uint32 hash_size; | |||||
/* Pointer to hash table. */ | |||||
const nls_uint32 *hash_tab; | |||||
/* 1 if the hash table uses a different endianness than this machine. */ | |||||
int must_swap_hash_tab; | |||||
int codeset_cntr; | |||||
#ifdef _LIBC | |||||
__gconv_t conv; | |||||
#else | |||||
# if HAVE_ICONV | |||||
iconv_t conv; | |||||
# endif | |||||
#endif | |||||
char **conv_tab; | |||||
struct expression *plural; | |||||
unsigned long int nplurals; | |||||
}; | |||||
/* We want to allocate a string at the end of the struct. But ISO C | |||||
doesn't allow zero sized arrays. */ | |||||
#ifdef __GNUC__ | |||||
# define ZERO 0 | |||||
#else | |||||
# define ZERO 1 | |||||
#endif | |||||
/* A set of settings bound to a message domain. Used to store settings | |||||
from bindtextdomain() and bind_textdomain_codeset(). */ | |||||
struct binding | |||||
{ | |||||
struct binding *next; | |||||
char *dirname; | |||||
int codeset_cntr; /* Incremented each time codeset changes. */ | |||||
char *codeset; | |||||
char domainname[ZERO]; | |||||
}; | |||||
/* A counter which is incremented each time some previous translations | |||||
become invalid. | |||||
This variable is part of the external ABI of the GNU libintl. */ | |||||
extern int _nl_msg_cat_cntr; | |||||
#ifndef _LIBC | |||||
const char *_nl_locale_name (int category, const char *categoryname); | |||||
#endif | |||||
struct loaded_l10nfile *_nl_find_domain (const char *__dirname, char *__locale, | |||||
const char *__domainname, | |||||
struct binding *__domainbinding) | |||||
internal_function; | |||||
void _nl_load_domain (struct loaded_l10nfile *__domain, | |||||
struct binding *__domainbinding) | |||||
internal_function; | |||||
void _nl_unload_domain (struct loaded_domain *__domain) | |||||
internal_function; | |||||
const char *_nl_init_domain_conv (struct loaded_l10nfile *__domain_file, | |||||
struct loaded_domain *__domain, | |||||
struct binding *__domainbinding) | |||||
internal_function; | |||||
void _nl_free_domain_conv (struct loaded_domain *__domain) | |||||
internal_function; | |||||
char *_nl_find_msg (struct loaded_l10nfile *domain_file, | |||||
struct binding *domainbinding, const char *msgid, | |||||
size_t *lengthp) | |||||
internal_function; | |||||
#ifdef _LIBC | |||||
extern char *__gettext (const char *__msgid); | |||||
extern char *__dgettext (const char *__domainname, const char *__msgid); | |||||
extern char *__dcgettext (const char *__domainname, const char *__msgid, | |||||
int __category); | |||||
extern char *__ngettext (const char *__msgid1, const char *__msgid2, | |||||
unsigned long int __n); | |||||
extern char *__dngettext (const char *__domainname, | |||||
const char *__msgid1, const char *__msgid2, | |||||
unsigned long int n); | |||||
extern char *__dcngettext (const char *__domainname, | |||||
const char *__msgid1, const char *__msgid2, | |||||
unsigned long int __n, int __category); | |||||
extern char *__dcigettext (const char *__domainname, | |||||
const char *__msgid1, const char *__msgid2, | |||||
int __plural, unsigned long int __n, | |||||
int __category); | |||||
extern char *__textdomain (const char *__domainname); | |||||
extern char *__bindtextdomain (const char *__domainname, | |||||
const char *__dirname); | |||||
extern char *__bind_textdomain_codeset (const char *__domainname, | |||||
const char *__codeset); | |||||
#else | |||||
/* Declare the exported libintl_* functions, in a way that allows us to | |||||
call them under their real name. */ | |||||
# undef _INTL_REDIRECT_INLINE | |||||
# undef _INTL_REDIRECT_MACROS | |||||
# define _INTL_REDIRECT_MACROS | |||||
# include "libgnuintl.h" | |||||
extern char *libintl_dcigettext (const char *__domainname, | |||||
const char *__msgid1, const char *__msgid2, | |||||
int __plural, unsigned long int __n, | |||||
int __category); | |||||
#endif | |||||
/* @@ begin of epilog @@ */ | |||||
#endif /* gettextP.h */ |
/* Description of GNU message catalog format: general file layout. | |||||
Copyright (C) 1995, 1997, 2000-2002, 2004 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef _GETTEXT_H | |||||
#define _GETTEXT_H 1 | |||||
#include <limits.h> | |||||
/* @@ end of prolog @@ */ | |||||
/* The magic number of the GNU message catalog format. */ | |||||
#define _MAGIC 0x950412de | |||||
#define _MAGIC_SWAPPED 0xde120495 | |||||
/* Revision number of the currently used .mo (binary) file format. */ | |||||
#define MO_REVISION_NUMBER 0 | |||||
#define MO_REVISION_NUMBER_WITH_SYSDEP_I 1 | |||||
/* The following contortions are an attempt to use the C preprocessor | |||||
to determine an unsigned integral type that is 32 bits wide. An | |||||
alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but | |||||
as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work | |||||
when cross-compiling. */ | |||||
#if __STDC__ | |||||
# define UINT_MAX_32_BITS 4294967295U | |||||
#else | |||||
# define UINT_MAX_32_BITS 0xFFFFFFFF | |||||
#endif | |||||
/* If UINT_MAX isn't defined, assume it's a 32-bit type. | |||||
This should be valid for all systems GNU cares about because | |||||
that doesn't include 16-bit systems, and only modern systems | |||||
(that certainly have <limits.h>) have 64+-bit integral types. */ | |||||
#ifndef UINT_MAX | |||||
# define UINT_MAX UINT_MAX_32_BITS | |||||
#endif | |||||
#if UINT_MAX == UINT_MAX_32_BITS | |||||
typedef unsigned nls_uint32; | |||||
#else | |||||
# if USHRT_MAX == UINT_MAX_32_BITS | |||||
typedef unsigned short nls_uint32; | |||||
# else | |||||
# if ULONG_MAX == UINT_MAX_32_BITS | |||||
typedef unsigned long nls_uint32; | |||||
# else | |||||
/* The following line is intended to throw an error. Using #error is | |||||
not portable enough. */ | |||||
"Cannot determine unsigned 32-bit data type." | |||||
# endif | |||||
# endif | |||||
#endif | |||||
/* Header for binary .mo file format. */ | |||||
struct mo_file_header | |||||
{ | |||||
/* The magic number. */ | |||||
nls_uint32 magic; | |||||
/* The revision number of the file format. */ | |||||
nls_uint32 revision; | |||||
/* The following are only used in .mo files with major revision 0 or 1. */ | |||||
/* The number of strings pairs. */ | |||||
nls_uint32 nstrings; | |||||
/* Offset of table with start offsets of original strings. */ | |||||
nls_uint32 orig_tab_offset; | |||||
/* Offset of table with start offsets of translated strings. */ | |||||
nls_uint32 trans_tab_offset; | |||||
/* Size of hash table. */ | |||||
nls_uint32 hash_tab_size; | |||||
/* Offset of first hash table entry. */ | |||||
nls_uint32 hash_tab_offset; | |||||
/* The following are only used in .mo files with minor revision >= 1. */ | |||||
/* The number of system dependent segments. */ | |||||
nls_uint32 n_sysdep_segments; | |||||
/* Offset of table describing system dependent segments. */ | |||||
nls_uint32 sysdep_segments_offset; | |||||
/* The number of system dependent strings pairs. */ | |||||
nls_uint32 n_sysdep_strings; | |||||
/* Offset of table with start offsets of original sysdep strings. */ | |||||
nls_uint32 orig_sysdep_tab_offset; | |||||
/* Offset of table with start offsets of translated sysdep strings. */ | |||||
nls_uint32 trans_sysdep_tab_offset; | |||||
}; | |||||
/* Descriptor for static string contained in the binary .mo file. */ | |||||
struct string_desc | |||||
{ | |||||
/* Length of addressed string, not including the trailing NUL. */ | |||||
nls_uint32 length; | |||||
/* Offset of string in file. */ | |||||
nls_uint32 offset; | |||||
}; | |||||
/* The following are only used in .mo files with minor revision >= 1. */ | |||||
/* Descriptor for system dependent string segment. */ | |||||
struct sysdep_segment | |||||
{ | |||||
/* Length of addressed string, including the trailing NUL. */ | |||||
nls_uint32 length; | |||||
/* Offset of string in file. */ | |||||
nls_uint32 offset; | |||||
}; | |||||
/* Descriptor for system dependent string. */ | |||||
struct sysdep_string | |||||
{ | |||||
/* Offset of static string segments in file. */ | |||||
nls_uint32 offset; | |||||
/* Alternating sequence of static and system dependent segments. | |||||
The last segment is a static segment, including the trailing NUL. */ | |||||
struct segment_pair | |||||
{ | |||||
/* Size of static segment. */ | |||||
nls_uint32 segsize; | |||||
/* Reference to system dependent string segment, or ~0 at the end. */ | |||||
nls_uint32 sysdepref; | |||||
} segments[1]; | |||||
}; | |||||
/* Marker for the end of the segments[] array. This has the value 0xFFFFFFFF, | |||||
regardless whether 'int' is 16 bit, 32 bit, or 64 bit. */ | |||||
#define SEGMENTS_END ((nls_uint32) ~0) | |||||
/* @@ begin of epilog @@ */ | |||||
#endif /* gettext.h */ |
/* Description of GNU message catalog format: string hashing function. | |||||
Copyright (C) 1995, 1997-1998, 2000-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
/* @@ end of prolog @@ */ | |||||
/* We assume to have `unsigned long int' value with at least 32 bits. */ | |||||
#define HASHWORDBITS 32 | |||||
/* Defines the so called `hashpjw' function by P.J. Weinberger | |||||
[see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, | |||||
1986, 1987 Bell Telephone Laboratories, Inc.] */ | |||||
static inline unsigned long int | |||||
hash_string (const char *str_param) | |||||
{ | |||||
unsigned long int hval, g; | |||||
const char *str = str_param; | |||||
/* Compute the hash value for the given string. */ | |||||
hval = 0; | |||||
while (*str != '\0') | |||||
{ | |||||
hval <<= 4; | |||||
hval += (unsigned char) *str++; | |||||
g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4)); | |||||
if (g != 0) | |||||
{ | |||||
hval ^= g >> (HASHWORDBITS - 8); | |||||
hval ^= g; | |||||
} | |||||
} | |||||
return hval; | |||||
} |
/* intl-compat.c - Stub functions to call gettext functions from GNU gettext | |||||
Library. | |||||
Copyright (C) 1995, 2000-2003 Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#include "gettextP.h" | |||||
/* @@ end of prolog @@ */ | |||||
/* This file redirects the gettext functions (without prefix) to those | |||||
defined in the included GNU libintl library (with "libintl_" prefix). | |||||
It is compiled into libintl in order to make the AM_GNU_GETTEXT test | |||||
of gettext <= 0.11.2 work with the libintl library >= 0.11.3 which | |||||
has the redirections primarily in the <libintl.h> include file. | |||||
It is also compiled into libgnuintl so that libgnuintl.so can be used | |||||
as LD_PRELOADable library on glibc systems, to provide the extra | |||||
features that the functions in the libc don't have (namely, logging). */ | |||||
#undef gettext | |||||
#undef dgettext | |||||
#undef dcgettext | |||||
#undef ngettext | |||||
#undef dngettext | |||||
#undef dcngettext | |||||
#undef textdomain | |||||
#undef bindtextdomain | |||||
#undef bind_textdomain_codeset | |||||
/* When building a DLL, we must export some functions. Note that because | |||||
the functions are only defined for binary backward compatibility, we | |||||
don't need to use __declspec(dllimport) in any case. */ | |||||
#if defined _MSC_VER && BUILDING_DLL | |||||
# define DLL_EXPORTED __declspec(dllexport) | |||||
#else | |||||
# define DLL_EXPORTED | |||||
#endif | |||||
DLL_EXPORTED | |||||
char * | |||||
gettext (const char *msgid) | |||||
{ | |||||
return libintl_gettext (msgid); | |||||
} | |||||
DLL_EXPORTED | |||||
char * | |||||
dgettext (const char *domainname, const char *msgid) | |||||
{ | |||||
return libintl_dgettext (domainname, msgid); | |||||
} | |||||
DLL_EXPORTED | |||||
char * | |||||
dcgettext (const char *domainname, const char *msgid, int category) | |||||
{ | |||||
return libintl_dcgettext (domainname, msgid, category); | |||||
} | |||||
DLL_EXPORTED | |||||
char * | |||||
ngettext (const char *msgid1, const char *msgid2, unsigned long int n) | |||||
{ | |||||
return libintl_ngettext (msgid1, msgid2, n); | |||||
} | |||||
DLL_EXPORTED | |||||
char * | |||||
dngettext (const char *domainname, | |||||
const char *msgid1, const char *msgid2, unsigned long int n) | |||||
{ | |||||
return libintl_dngettext (domainname, msgid1, msgid2, n); | |||||
} | |||||
DLL_EXPORTED | |||||
char * | |||||
dcngettext (const char *domainname, | |||||
const char *msgid1, const char *msgid2, unsigned long int n, | |||||
int category) | |||||
{ | |||||
return libintl_dcngettext (domainname, msgid1, msgid2, n, category); | |||||
} | |||||
DLL_EXPORTED | |||||
char * | |||||
textdomain (const char *domainname) | |||||
{ | |||||
return libintl_textdomain (domainname); | |||||
} | |||||
DLL_EXPORTED | |||||
char * | |||||
bindtextdomain (const char *domainname, const char *dirname) | |||||
{ | |||||
return libintl_bindtextdomain (domainname, dirname); | |||||
} | |||||
DLL_EXPORTED | |||||
char * | |||||
bind_textdomain_codeset (const char *domainname, const char *codeset) | |||||
{ | |||||
return libintl_bind_textdomain_codeset (domainname, codeset); | |||||
} |
/* Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. | |||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
/* Tell glibc's <string.h> to provide a prototype for stpcpy(). | |||||
This must come before <config.h> because <config.h> may include | |||||
<features.h>, and once <features.h> has been included, it's too late. */ | |||||
#ifndef _GNU_SOURCE | |||||
# define _GNU_SOURCE 1 | |||||
#endif | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#include <string.h> | |||||
#if defined _LIBC || defined HAVE_ARGZ_H | |||||
# include <argz.h> | |||||
#endif | |||||
#include <ctype.h> | |||||
#include <sys/types.h> | |||||
#include <stdlib.h> | |||||
#include "loadinfo.h" | |||||
/* On some strange systems still no definition of NULL is found. Sigh! */ | |||||
#ifndef NULL | |||||
# if defined __STDC__ && __STDC__ | |||||
# define NULL ((void *) 0) | |||||
# else | |||||
# define NULL 0 | |||||
# endif | |||||
#endif | |||||
/* @@ end of prolog @@ */ | |||||
#ifdef _LIBC | |||||
/* Rename the non ANSI C functions. This is required by the standard | |||||
because some ANSI C functions will require linking with this object | |||||
file and the name space must not be polluted. */ | |||||
# ifndef stpcpy | |||||
# define stpcpy(dest, src) __stpcpy(dest, src) | |||||
# endif | |||||
#else | |||||
# ifndef HAVE_STPCPY | |||||
static char *stpcpy (char *dest, const char *src); | |||||
# endif | |||||
#endif | |||||
/* Pathname support. | |||||
ISSLASH(C) tests whether C is a directory separator character. | |||||
IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, | |||||
it may be concatenated to a directory pathname. | |||||
*/ | |||||
#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ | |||||
/* Win32, OS/2, DOS */ | |||||
# define ISSLASH(C) ((C) == '/' || (C) == '\\') | |||||
# define HAS_DEVICE(P) \ | |||||
((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ | |||||
&& (P)[1] == ':') | |||||
# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) | |||||
#else | |||||
/* Unix */ | |||||
# define ISSLASH(C) ((C) == '/') | |||||
# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) | |||||
#endif | |||||
/* Define function which are usually not available. */ | |||||
#if !defined _LIBC && !defined HAVE___ARGZ_COUNT | |||||
/* Returns the number of strings in ARGZ. */ | |||||
static size_t | |||||
argz_count__ (const char *argz, size_t len) | |||||
{ | |||||
size_t count = 0; | |||||
while (len > 0) | |||||
{ | |||||
size_t part_len = strlen (argz); | |||||
argz += part_len + 1; | |||||
len -= part_len + 1; | |||||
count++; | |||||
} | |||||
return count; | |||||
} | |||||
# undef __argz_count | |||||
# define __argz_count(argz, len) argz_count__ (argz, len) | |||||
#else | |||||
# ifdef _LIBC | |||||
# define __argz_count(argz, len) INTUSE(__argz_count) (argz, len) | |||||
# endif | |||||
#endif /* !_LIBC && !HAVE___ARGZ_COUNT */ | |||||
#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY | |||||
/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's | |||||
except the last into the character SEP. */ | |||||
static void | |||||
argz_stringify__ (char *argz, size_t len, int sep) | |||||
{ | |||||
while (len > 0) | |||||
{ | |||||
size_t part_len = strlen (argz); | |||||
argz += part_len; | |||||
len -= part_len + 1; | |||||
if (len > 0) | |||||
*argz++ = sep; | |||||
} | |||||
} | |||||
# undef __argz_stringify | |||||
# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep) | |||||
#else | |||||
# ifdef _LIBC | |||||
# define __argz_stringify(argz, len, sep) \ | |||||
INTUSE(__argz_stringify) (argz, len, sep) | |||||
# endif | |||||
#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */ | |||||
#if !defined _LIBC && !defined HAVE___ARGZ_NEXT | |||||
static char * | |||||
argz_next__ (char *argz, size_t argz_len, const char *entry) | |||||
{ | |||||
if (entry) | |||||
{ | |||||
if (entry < argz + argz_len) | |||||
entry = strchr (entry, '\0') + 1; | |||||
return entry >= argz + argz_len ? NULL : (char *) entry; | |||||
} | |||||
else | |||||
if (argz_len > 0) | |||||
return argz; | |||||
else | |||||
return 0; | |||||
} | |||||
# undef __argz_next | |||||
# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) | |||||
#endif /* !_LIBC && !HAVE___ARGZ_NEXT */ | |||||
/* Return number of bits set in X. */ | |||||
static inline int | |||||
pop (int x) | |||||
{ | |||||
/* We assume that no more than 16 bits are used. */ | |||||
x = ((x & ~0x5555) >> 1) + (x & 0x5555); | |||||
x = ((x & ~0x3333) >> 2) + (x & 0x3333); | |||||
x = ((x >> 4) + x) & 0x0f0f; | |||||
x = ((x >> 8) + x) & 0xff; | |||||
return x; | |||||
} | |||||
struct loaded_l10nfile * | |||||
_nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list, | |||||
const char *dirlist, size_t dirlist_len, | |||||
int mask, const char *language, const char *territory, | |||||
const char *codeset, const char *normalized_codeset, | |||||
const char *modifier, const char *special, | |||||
const char *sponsor, const char *revision, | |||||
const char *filename, int do_allocate) | |||||
{ | |||||
char *abs_filename; | |||||
struct loaded_l10nfile **lastp; | |||||
struct loaded_l10nfile *retval; | |||||
char *cp; | |||||
size_t dirlist_count; | |||||
size_t entries; | |||||
int cnt; | |||||
/* If LANGUAGE contains an absolute directory specification, we ignore | |||||
DIRLIST. */ | |||||
if (IS_ABSOLUTE_PATH (language)) | |||||
dirlist_len = 0; | |||||
/* Allocate room for the full file name. */ | |||||
abs_filename = (char *) malloc (dirlist_len | |||||
+ strlen (language) | |||||
+ ((mask & TERRITORY) != 0 | |||||
? strlen (territory) + 1 : 0) | |||||
+ ((mask & XPG_CODESET) != 0 | |||||
? strlen (codeset) + 1 : 0) | |||||
+ ((mask & XPG_NORM_CODESET) != 0 | |||||
? strlen (normalized_codeset) + 1 : 0) | |||||
+ (((mask & XPG_MODIFIER) != 0 | |||||
|| (mask & CEN_AUDIENCE) != 0) | |||||
? strlen (modifier) + 1 : 0) | |||||
+ ((mask & CEN_SPECIAL) != 0 | |||||
? strlen (special) + 1 : 0) | |||||
+ (((mask & CEN_SPONSOR) != 0 | |||||
|| (mask & CEN_REVISION) != 0) | |||||
? (1 + ((mask & CEN_SPONSOR) != 0 | |||||
? strlen (sponsor) : 0) | |||||
+ ((mask & CEN_REVISION) != 0 | |||||
? strlen (revision) + 1 : 0)) : 0) | |||||
+ 1 + strlen (filename) + 1); | |||||
if (abs_filename == NULL) | |||||
return NULL; | |||||
/* Construct file name. */ | |||||
cp = abs_filename; | |||||
if (dirlist_len > 0) | |||||
{ | |||||
memcpy (cp, dirlist, dirlist_len); | |||||
__argz_stringify (cp, dirlist_len, PATH_SEPARATOR); | |||||
cp += dirlist_len; | |||||
cp[-1] = '/'; | |||||
} | |||||
cp = stpcpy (cp, language); | |||||
if ((mask & TERRITORY) != 0) | |||||
{ | |||||
*cp++ = '_'; | |||||
cp = stpcpy (cp, territory); | |||||
} | |||||
if ((mask & XPG_CODESET) != 0) | |||||
{ | |||||
*cp++ = '.'; | |||||
cp = stpcpy (cp, codeset); | |||||
} | |||||
if ((mask & XPG_NORM_CODESET) != 0) | |||||
{ | |||||
*cp++ = '.'; | |||||
cp = stpcpy (cp, normalized_codeset); | |||||
} | |||||
if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) | |||||
{ | |||||
/* This component can be part of both syntaces but has different | |||||
leading characters. For CEN we use `+', else `@'. */ | |||||
*cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@'; | |||||
cp = stpcpy (cp, modifier); | |||||
} | |||||
if ((mask & CEN_SPECIAL) != 0) | |||||
{ | |||||
*cp++ = '+'; | |||||
cp = stpcpy (cp, special); | |||||
} | |||||
if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0) | |||||
{ | |||||
*cp++ = ','; | |||||
if ((mask & CEN_SPONSOR) != 0) | |||||
cp = stpcpy (cp, sponsor); | |||||
if ((mask & CEN_REVISION) != 0) | |||||
{ | |||||
*cp++ = '_'; | |||||
cp = stpcpy (cp, revision); | |||||
} | |||||
} | |||||
*cp++ = '/'; | |||||
stpcpy (cp, filename); | |||||
/* Look in list of already loaded domains whether it is already | |||||
available. */ | |||||
lastp = l10nfile_list; | |||||
for (retval = *l10nfile_list; retval != NULL; retval = retval->next) | |||||
if (retval->filename != NULL) | |||||
{ | |||||
int compare = strcmp (retval->filename, abs_filename); | |||||
if (compare == 0) | |||||
/* We found it! */ | |||||
break; | |||||
if (compare < 0) | |||||
{ | |||||
/* It's not in the list. */ | |||||
retval = NULL; | |||||
break; | |||||
} | |||||
lastp = &retval->next; | |||||
} | |||||
if (retval != NULL || do_allocate == 0) | |||||
{ | |||||
free (abs_filename); | |||||
return retval; | |||||
} | |||||
dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1); | |||||
/* Allocate a new loaded_l10nfile. */ | |||||
retval = | |||||
(struct loaded_l10nfile *) | |||||
malloc (sizeof (*retval) | |||||
+ (((dirlist_count << pop (mask)) + (dirlist_count > 1 ? 1 : 0)) | |||||
* sizeof (struct loaded_l10nfile *))); | |||||
if (retval == NULL) | |||||
return NULL; | |||||
retval->filename = abs_filename; | |||||
/* We set retval->data to NULL here; it is filled in later. | |||||
Setting retval->decided to 1 here means that retval does not | |||||
correspond to a real file (dirlist_count > 1) or is not worth | |||||
looking up (if an unnormalized codeset was specified). */ | |||||
retval->decided = (dirlist_count > 1 | |||||
|| ((mask & XPG_CODESET) != 0 | |||||
&& (mask & XPG_NORM_CODESET) != 0)); | |||||
retval->data = NULL; | |||||
retval->next = *lastp; | |||||
*lastp = retval; | |||||
entries = 0; | |||||
/* Recurse to fill the inheritance list of RETVAL. | |||||
If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL | |||||
entry does not correspond to a real file; retval->filename contains | |||||
colons. In this case we loop across all elements of DIRLIST and | |||||
across all bit patterns dominated by MASK. | |||||
If the DIRLIST is a single directory or entirely redundant (i.e. | |||||
DIRLIST_COUNT == 1), we loop across all bit patterns dominated by | |||||
MASK, excluding MASK itself. | |||||
In either case, we loop down from MASK to 0. This has the effect | |||||
that the extra bits in the locale name are dropped in this order: | |||||
first the modifier, then the territory, then the codeset, then the | |||||
normalized_codeset. */ | |||||
for (cnt = dirlist_count > 1 ? mask : mask - 1; cnt >= 0; --cnt) | |||||
if ((cnt & ~mask) == 0 | |||||
&& ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) | |||||
&& ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0)) | |||||
{ | |||||
if (dirlist_count > 1) | |||||
{ | |||||
/* Iterate over all elements of the DIRLIST. */ | |||||
char *dir = NULL; | |||||
while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) | |||||
!= NULL) | |||||
retval->successor[entries++] | |||||
= _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, | |||||
cnt, language, territory, codeset, | |||||
normalized_codeset, modifier, special, | |||||
sponsor, revision, filename, 1); | |||||
} | |||||
else | |||||
retval->successor[entries++] | |||||
= _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, | |||||
cnt, language, territory, codeset, | |||||
normalized_codeset, modifier, special, | |||||
sponsor, revision, filename, 1); | |||||
} | |||||
retval->successor[entries] = NULL; | |||||
return retval; | |||||
} | |||||
/* Normalize codeset name. There is no standard for the codeset | |||||
names. Normalization allows the user to use any of the common | |||||
names. The return value is dynamically allocated and has to be | |||||
freed by the caller. */ | |||||
const char * | |||||
_nl_normalize_codeset (const char *codeset, size_t name_len) | |||||
{ | |||||
int len = 0; | |||||
int only_digit = 1; | |||||
char *retval; | |||||
char *wp; | |||||
size_t cnt; | |||||
for (cnt = 0; cnt < name_len; ++cnt) | |||||
if (isalnum ((unsigned char) codeset[cnt])) | |||||
{ | |||||
++len; | |||||
if (isalpha ((unsigned char) codeset[cnt])) | |||||
only_digit = 0; | |||||
} | |||||
retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1); | |||||
if (retval != NULL) | |||||
{ | |||||
if (only_digit) | |||||
wp = stpcpy (retval, "iso"); | |||||
else | |||||
wp = retval; | |||||
for (cnt = 0; cnt < name_len; ++cnt) | |||||
if (isalpha ((unsigned char) codeset[cnt])) | |||||
*wp++ = tolower ((unsigned char) codeset[cnt]); | |||||
else if (isdigit ((unsigned char) codeset[cnt])) | |||||
*wp++ = codeset[cnt]; | |||||
*wp = '\0'; | |||||
} | |||||
return (const char *) retval; | |||||
} | |||||
/* @@ begin of epilog @@ */ | |||||
/* We don't want libintl.a to depend on any other library. So we | |||||
avoid the non-standard function stpcpy. In GNU C Library this | |||||
function is available, though. Also allow the symbol HAVE_STPCPY | |||||
to be defined. */ | |||||
#if !_LIBC && !HAVE_STPCPY | |||||
static char * | |||||
stpcpy (char *dest, const char *src) | |||||
{ | |||||
while ((*dest++ = *src++) != '\0') | |||||
/* Do nothing. */ ; | |||||
return dest - 1; | |||||
} | |||||
#endif |
/* Message catalogs for internationalization. | |||||
Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef _LIBINTL_H | |||||
#define _LIBINTL_H 1 | |||||
#include <locale.h> | |||||
/* The LC_MESSAGES locale category is the category used by the functions | |||||
gettext() and dgettext(). It is specified in POSIX, but not in ANSI C. | |||||
On systems that don't define it, use an arbitrary value instead. | |||||
On Solaris, <locale.h> defines __LOCALE_H (or _LOCALE_H in Solaris 2.5) | |||||
then includes <libintl.h> (i.e. this file!) and then only defines | |||||
LC_MESSAGES. To avoid a redefinition warning, don't define LC_MESSAGES | |||||
in this case. */ | |||||
#if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun)) | |||||
# define LC_MESSAGES 1729 | |||||
#endif | |||||
/* We define an additional symbol to signal that we use the GNU | |||||
implementation of gettext. */ | |||||
#define __USE_GNU_GETTEXT 1 | |||||
/* Provide information about the supported file formats. Returns the | |||||
maximum minor revision number supported for a given major revision. */ | |||||
#define __GNU_GETTEXT_SUPPORTED_REVISION(major) \ | |||||
((major) == 0 ? 1 : -1) | |||||
/* Resolve a platform specific conflict on DJGPP. GNU gettext takes | |||||
precedence over _conio_gettext. */ | |||||
#ifdef __DJGPP__ | |||||
# undef gettext | |||||
#endif | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* We redirect the functions to those prefixed with "libintl_". This is | |||||
necessary, because some systems define gettext/textdomain/... in the C | |||||
library (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer). | |||||
If we used the unprefixed names, there would be cases where the | |||||
definition in the C library would override the one in the libintl.so | |||||
shared library. Recall that on ELF systems, the symbols are looked | |||||
up in the following order: | |||||
1. in the executable, | |||||
2. in the shared libraries specified on the link command line, in order, | |||||
3. in the dependencies of the shared libraries specified on the link | |||||
command line, | |||||
4. in the dlopen()ed shared libraries, in the order in which they were | |||||
dlopen()ed. | |||||
The definition in the C library would override the one in libintl.so if | |||||
either | |||||
* -lc is given on the link command line and -lintl isn't, or | |||||
* -lc is given on the link command line before -lintl, or | |||||
* libintl.so is a dependency of a dlopen()ed shared library but not | |||||
linked to the executable at link time. | |||||
Since Solaris gettext() behaves differently than GNU gettext(), this | |||||
would be unacceptable. | |||||
The redirection happens by default through macros in C, so that &gettext | |||||
is independent of the compilation unit, but through inline functions in | |||||
C++, in order not to interfere with the name mangling of class fields or | |||||
class methods called 'gettext'. */ | |||||
/* The user can define _INTL_REDIRECT_INLINE or _INTL_REDIRECT_MACROS. | |||||
If he doesn't, we choose the method. A third possible method is | |||||
_INTL_REDIRECT_ASM, supported only by GCC. */ | |||||
#if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS) | |||||
# if __GNUC__ >= 2 && !defined __APPLE_CC__ && !defined __MINGW32__ && !(__GNUC__ == 2 && defined _AIX) && (defined __STDC__ || defined __cplusplus) | |||||
# define _INTL_REDIRECT_ASM | |||||
# else | |||||
# ifdef __cplusplus | |||||
# define _INTL_REDIRECT_INLINE | |||||
# else | |||||
# define _INTL_REDIRECT_MACROS | |||||
# endif | |||||
# endif | |||||
#endif | |||||
/* Auxiliary macros. */ | |||||
#ifdef _INTL_REDIRECT_ASM | |||||
# define _INTL_ASM(cname) __asm__ (_INTL_ASMNAME (__USER_LABEL_PREFIX__, #cname)) | |||||
# define _INTL_ASMNAME(prefix,cnamestring) _INTL_STRINGIFY (prefix) cnamestring | |||||
# define _INTL_STRINGIFY(prefix) #prefix | |||||
#else | |||||
# define _INTL_ASM(cname) | |||||
#endif | |||||
/* Look up MSGID in the current default message catalog for the current | |||||
LC_MESSAGES locale. If not found, returns MSGID itself (the default | |||||
text). */ | |||||
#ifdef _INTL_REDIRECT_INLINE | |||||
extern char *libintl_gettext (const char *__msgid); | |||||
static inline char *gettext (const char *__msgid) | |||||
{ | |||||
return libintl_gettext (__msgid); | |||||
} | |||||
#else | |||||
#ifdef _INTL_REDIRECT_MACROS | |||||
# define gettext libintl_gettext | |||||
#endif | |||||
extern char *gettext (const char *__msgid) | |||||
_INTL_ASM (libintl_gettext); | |||||
#endif | |||||
/* Look up MSGID in the DOMAINNAME message catalog for the current | |||||
LC_MESSAGES locale. */ | |||||
#ifdef _INTL_REDIRECT_INLINE | |||||
extern char *libintl_dgettext (const char *__domainname, const char *__msgid); | |||||
static inline char *dgettext (const char *__domainname, const char *__msgid) | |||||
{ | |||||
return libintl_dgettext (__domainname, __msgid); | |||||
} | |||||
#else | |||||
#ifdef _INTL_REDIRECT_MACROS | |||||
# define dgettext libintl_dgettext | |||||
#endif | |||||
extern char *dgettext (const char *__domainname, const char *__msgid) | |||||
_INTL_ASM (libintl_dgettext); | |||||
#endif | |||||
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY | |||||
locale. */ | |||||
#ifdef _INTL_REDIRECT_INLINE | |||||
extern char *libintl_dcgettext (const char *__domainname, const char *__msgid, | |||||
int __category); | |||||
static inline char *dcgettext (const char *__domainname, const char *__msgid, | |||||
int __category) | |||||
{ | |||||
return libintl_dcgettext (__domainname, __msgid, __category); | |||||
} | |||||
#else | |||||
#ifdef _INTL_REDIRECT_MACROS | |||||
# define dcgettext libintl_dcgettext | |||||
#endif | |||||
extern char *dcgettext (const char *__domainname, const char *__msgid, | |||||
int __category) | |||||
_INTL_ASM (libintl_dcgettext); | |||||
#endif | |||||
/* Similar to `gettext' but select the plural form corresponding to the | |||||
number N. */ | |||||
#ifdef _INTL_REDIRECT_INLINE | |||||
extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2, | |||||
unsigned long int __n); | |||||
static inline char *ngettext (const char *__msgid1, const char *__msgid2, | |||||
unsigned long int __n) | |||||
{ | |||||
return libintl_ngettext (__msgid1, __msgid2, __n); | |||||
} | |||||
#else | |||||
#ifdef _INTL_REDIRECT_MACROS | |||||
# define ngettext libintl_ngettext | |||||
#endif | |||||
extern char *ngettext (const char *__msgid1, const char *__msgid2, | |||||
unsigned long int __n) | |||||
_INTL_ASM (libintl_ngettext); | |||||
#endif | |||||
/* Similar to `dgettext' but select the plural form corresponding to the | |||||
number N. */ | |||||
#ifdef _INTL_REDIRECT_INLINE | |||||
extern char *libintl_dngettext (const char *__domainname, const char *__msgid1, | |||||
const char *__msgid2, unsigned long int __n); | |||||
static inline char *dngettext (const char *__domainname, const char *__msgid1, | |||||
const char *__msgid2, unsigned long int __n) | |||||
{ | |||||
return libintl_dngettext (__domainname, __msgid1, __msgid2, __n); | |||||
} | |||||
#else | |||||
#ifdef _INTL_REDIRECT_MACROS | |||||
# define dngettext libintl_dngettext | |||||
#endif | |||||
extern char *dngettext (const char *__domainname, | |||||
const char *__msgid1, const char *__msgid2, | |||||
unsigned long int __n) | |||||
_INTL_ASM (libintl_dngettext); | |||||
#endif | |||||
/* Similar to `dcgettext' but select the plural form corresponding to the | |||||
number N. */ | |||||
#ifdef _INTL_REDIRECT_INLINE | |||||
extern char *libintl_dcngettext (const char *__domainname, | |||||
const char *__msgid1, const char *__msgid2, | |||||
unsigned long int __n, int __category); | |||||
static inline char *dcngettext (const char *__domainname, | |||||
const char *__msgid1, const char *__msgid2, | |||||
unsigned long int __n, int __category) | |||||
{ | |||||
return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category); | |||||
} | |||||
#else | |||||
#ifdef _INTL_REDIRECT_MACROS | |||||
# define dcngettext libintl_dcngettext | |||||
#endif | |||||
extern char *dcngettext (const char *__domainname, | |||||
const char *__msgid1, const char *__msgid2, | |||||
unsigned long int __n, int __category) | |||||
_INTL_ASM (libintl_dcngettext); | |||||
#endif | |||||
/* Set the current default message catalog to DOMAINNAME. | |||||
If DOMAINNAME is null, return the current default. | |||||
If DOMAINNAME is "", reset to the default of "messages". */ | |||||
#ifdef _INTL_REDIRECT_INLINE | |||||
extern char *libintl_textdomain (const char *__domainname); | |||||
static inline char *textdomain (const char *__domainname) | |||||
{ | |||||
return libintl_textdomain (__domainname); | |||||
} | |||||
#else | |||||
#ifdef _INTL_REDIRECT_MACROS | |||||
# define textdomain libintl_textdomain | |||||
#endif | |||||
extern char *textdomain (const char *__domainname) | |||||
_INTL_ASM (libintl_textdomain); | |||||
#endif | |||||
/* Specify that the DOMAINNAME message catalog will be found | |||||
in DIRNAME rather than in the system locale data base. */ | |||||
#ifdef _INTL_REDIRECT_INLINE | |||||
extern char *libintl_bindtextdomain (const char *__domainname, | |||||
const char *__dirname); | |||||
static inline char *bindtextdomain (const char *__domainname, | |||||
const char *__dirname) | |||||
{ | |||||
return libintl_bindtextdomain (__domainname, __dirname); | |||||
} | |||||
#else | |||||
#ifdef _INTL_REDIRECT_MACROS | |||||
# define bindtextdomain libintl_bindtextdomain | |||||
#endif | |||||
extern char *bindtextdomain (const char *__domainname, const char *__dirname) | |||||
_INTL_ASM (libintl_bindtextdomain); | |||||
#endif | |||||
/* Specify the character encoding in which the messages from the | |||||
DOMAINNAME message catalog will be returned. */ | |||||
#ifdef _INTL_REDIRECT_INLINE | |||||
extern char *libintl_bind_textdomain_codeset (const char *__domainname, | |||||
const char *__codeset); | |||||
static inline char *bind_textdomain_codeset (const char *__domainname, | |||||
const char *__codeset) | |||||
{ | |||||
return libintl_bind_textdomain_codeset (__domainname, __codeset); | |||||
} | |||||
#else | |||||
#ifdef _INTL_REDIRECT_MACROS | |||||
# define bind_textdomain_codeset libintl_bind_textdomain_codeset | |||||
#endif | |||||
extern char *bind_textdomain_codeset (const char *__domainname, | |||||
const char *__codeset) | |||||
_INTL_ASM (libintl_bind_textdomain_codeset); | |||||
#endif | |||||
/* Support for format strings with positions in *printf(), following the | |||||
POSIX/XSI specification. | |||||
Note: These replacements for the *printf() functions are visible only | |||||
in source files that #include <libintl.h> or #include "gettext.h". | |||||
Packages that use *printf() in source files that don't refer to _() | |||||
or gettext() but for which the format string could be the return value | |||||
of _() or gettext() need to add this #include. Oh well. */ | |||||
#if !@HAVE_POSIX_PRINTF@ | |||||
#include <stdio.h> | |||||
#include <stddef.h> | |||||
/* Get va_list. */ | |||||
#if __STDC__ || defined __cplusplus || defined _MSC_VER | |||||
# include <stdarg.h> | |||||
#else | |||||
# include <varargs.h> | |||||
#endif | |||||
#undef fprintf | |||||
#define fprintf libintl_fprintf | |||||
extern int fprintf (FILE *, const char *, ...); | |||||
#undef vfprintf | |||||
#define vfprintf libintl_vfprintf | |||||
extern int vfprintf (FILE *, const char *, va_list); | |||||
#undef printf | |||||
#define printf libintl_printf | |||||
extern int printf (const char *, ...); | |||||
#undef vprintf | |||||
#define vprintf libintl_vprintf | |||||
extern int vprintf (const char *, va_list); | |||||
#undef sprintf | |||||
#define sprintf libintl_sprintf | |||||
extern int sprintf (char *, const char *, ...); | |||||
#undef vsprintf | |||||
#define vsprintf libintl_vsprintf | |||||
extern int vsprintf (char *, const char *, va_list); | |||||
#if @HAVE_SNPRINTF@ | |||||
#undef snprintf | |||||
#define snprintf libintl_snprintf | |||||
extern int snprintf (char *, size_t, const char *, ...); | |||||
#undef vsnprintf | |||||
#define vsnprintf libintl_vsnprintf | |||||
extern int vsnprintf (char *, size_t, const char *, va_list); | |||||
#endif | |||||
#if @HAVE_ASPRINTF@ | |||||
#undef asprintf | |||||
#define asprintf libintl_asprintf | |||||
extern int asprintf (char **, const char *, ...); | |||||
#undef vasprintf | |||||
#define vasprintf libintl_vasprintf | |||||
extern int vasprintf (char **, const char *, va_list); | |||||
#endif | |||||
#if @HAVE_WPRINTF@ | |||||
#undef fwprintf | |||||
#define fwprintf libintl_fwprintf | |||||
extern int fwprintf (FILE *, const wchar_t *, ...); | |||||
#undef vfwprintf | |||||
#define vfwprintf libintl_vfwprintf | |||||
extern int vfwprintf (FILE *, const wchar_t *, va_list); | |||||
#undef wprintf | |||||
#define wprintf libintl_wprintf | |||||
extern int wprintf (const wchar_t *, ...); | |||||
#undef vwprintf | |||||
#define vwprintf libintl_vwprintf | |||||
extern int vwprintf (const wchar_t *, va_list); | |||||
#undef swprintf | |||||
#define swprintf libintl_swprintf | |||||
extern int swprintf (wchar_t *, size_t, const wchar_t *, ...); | |||||
#undef vswprintf | |||||
#define vswprintf libintl_vswprintf | |||||
extern int vswprintf (wchar_t *, size_t, const wchar_t *, va_list); | |||||
#endif | |||||
#endif | |||||
/* Support for relocatable packages. */ | |||||
/* Sets the original and the current installation prefix of the package. | |||||
Relocation simply replaces a pathname starting with the original prefix | |||||
by the corresponding pathname with the current prefix instead. Both | |||||
prefixes should be directory names without trailing slash (i.e. use "" | |||||
instead of "/"). */ | |||||
#define libintl_set_relocation_prefix libintl_set_relocation_prefix | |||||
extern void | |||||
libintl_set_relocation_prefix (const char *orig_prefix, | |||||
const char *curr_prefix); | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* libintl.h */ |
/* Copyright (C) 1996-1999, 2000-2003 Free Software Foundation, Inc. | |||||
This file is part of the GNU C Library. | |||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef _LOADINFO_H | |||||
#define _LOADINFO_H 1 | |||||
/* Declarations of locale dependent catalog lookup functions. | |||||
Implemented in | |||||
localealias.c Possibly replace a locale name by another. | |||||
explodename.c Split a locale name into its various fields. | |||||
l10nflist.c Generate a list of filenames of possible message catalogs. | |||||
finddomain.c Find and open the relevant message catalogs. | |||||
The main function _nl_find_domain() in finddomain.c is declared | |||||
in gettextP.h. | |||||
*/ | |||||
#ifndef internal_function | |||||
# define internal_function | |||||
#endif | |||||
/* Tell the compiler when a conditional or integer expression is | |||||
almost always true or almost always false. */ | |||||
#ifndef HAVE_BUILTIN_EXPECT | |||||
# define __builtin_expect(expr, val) (expr) | |||||
#endif | |||||
/* Separator in PATH like lists of pathnames. */ | |||||
#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ | |||||
/* Win32, OS/2, DOS */ | |||||
# define PATH_SEPARATOR ';' | |||||
#else | |||||
/* Unix */ | |||||
# define PATH_SEPARATOR ':' | |||||
#endif | |||||
/* Encoding of locale name parts. */ | |||||
#define CEN_REVISION 1 | |||||
#define CEN_SPONSOR 2 | |||||
#define CEN_SPECIAL 4 | |||||
#define XPG_NORM_CODESET 8 | |||||
#define XPG_CODESET 16 | |||||
#define TERRITORY 32 | |||||
#define CEN_AUDIENCE 64 | |||||
#define XPG_MODIFIER 128 | |||||
#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE) | |||||
#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER) | |||||
struct loaded_l10nfile | |||||
{ | |||||
const char *filename; | |||||
int decided; | |||||
const void *data; | |||||
struct loaded_l10nfile *next; | |||||
struct loaded_l10nfile *successor[1]; | |||||
}; | |||||
/* Normalize codeset name. There is no standard for the codeset | |||||
names. Normalization allows the user to use any of the common | |||||
names. The return value is dynamically allocated and has to be | |||||
freed by the caller. */ | |||||
extern const char *_nl_normalize_codeset (const char *codeset, | |||||
size_t name_len); | |||||
/* Lookup a locale dependent file. | |||||
*L10NFILE_LIST denotes a pool of lookup results of locale dependent | |||||
files of the same kind, sorted in decreasing order of ->filename. | |||||
DIRLIST and DIRLIST_LEN are an argz list of directories in which to | |||||
look, containing at least one directory (i.e. DIRLIST_LEN > 0). | |||||
MASK, LANGUAGE, TERRITORY, CODESET, NORMALIZED_CODESET, MODIFIER, | |||||
SPECIAL, SPONSOR, REVISION are the pieces of the locale name, as | |||||
produced by _nl_explode_name(). FILENAME is the filename suffix. | |||||
The return value is the lookup result, either found in *L10NFILE_LIST, | |||||
or - if DO_ALLOCATE is nonzero - freshly allocated, or possibly NULL. | |||||
If the return value is non-NULL, it is added to *L10NFILE_LIST, and | |||||
its ->next field denotes the chaining inside *L10NFILE_LIST, and | |||||
furthermore its ->successor[] field contains a list of other lookup | |||||
results from which this lookup result inherits. */ | |||||
extern struct loaded_l10nfile * | |||||
_nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list, | |||||
const char *dirlist, size_t dirlist_len, int mask, | |||||
const char *language, const char *territory, | |||||
const char *codeset, const char *normalized_codeset, | |||||
const char *modifier, const char *special, | |||||
const char *sponsor, const char *revision, | |||||
const char *filename, int do_allocate); | |||||
/* Lookup the real locale name for a locale alias NAME, or NULL if | |||||
NAME is not a locale alias (but possibly a real locale name). | |||||
The return value is statically allocated and must not be freed. */ | |||||
extern const char *_nl_expand_alias (const char *name); | |||||
/* Split a locale name NAME into its pieces: language, modifier, | |||||
territory, codeset, special, sponsor, revision. | |||||
NAME gets destructively modified: NUL bytes are inserted here and | |||||
there. *LANGUAGE gets assigned NAME. Each of *MODIFIER, *TERRITORY, | |||||
*CODESET, *SPECIAL, *SPONSOR, *REVISION gets assigned either a | |||||
pointer into the old NAME string, or NULL. *NORMALIZED_CODESET | |||||
gets assigned the expanded *CODESET, if it is different from *CODESET; | |||||
this one is dynamically allocated and has to be freed by the caller. | |||||
The return value is a bitmask, where each bit corresponds to one | |||||
filled-in value: | |||||
XPG_MODIFIER, CEN_AUDIENCE for *MODIFIER, | |||||
TERRITORY for *TERRITORY, | |||||
XPG_CODESET for *CODESET, | |||||
XPG_NORM_CODESET for *NORMALIZED_CODESET, | |||||
CEN_SPECIAL for *SPECIAL, | |||||
CEN_SPONSOR for *SPONSOR, | |||||
CEN_REVISION for *REVISION. | |||||
*/ | |||||
extern int _nl_explode_name (char *name, const char **language, | |||||
const char **modifier, const char **territory, | |||||
const char **codeset, | |||||
const char **normalized_codeset, | |||||
const char **special, const char **sponsor, | |||||
const char **revision); | |||||
/* Split a locale name NAME into a leading language part and all the | |||||
rest. Return a pointer to the first character after the language, | |||||
i.e. to the first byte of the rest. */ | |||||
extern char *_nl_find_language (const char *name); | |||||
#endif /* loadinfo.h */ |
/* Determine a canonical name for the current locale's character encoding. | |||||
Copyright (C) 2000-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
/* Written by Bruno Haible <bruno@clisp.org>. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
/* Specification. */ | |||||
#include "localcharset.h" | |||||
#if HAVE_STDDEF_H | |||||
# include <stddef.h> | |||||
#endif | |||||
#include <stdio.h> | |||||
#if HAVE_STRING_H | |||||
# include <string.h> | |||||
#else | |||||
# include <strings.h> | |||||
#endif | |||||
#if HAVE_STDLIB_H | |||||
# include <stdlib.h> | |||||
#endif | |||||
#if defined _WIN32 || defined __WIN32__ | |||||
# undef WIN32 /* avoid warning on mingw32 */ | |||||
# define WIN32 | |||||
#endif | |||||
#if defined __EMX__ | |||||
/* Assume EMX program runs on OS/2, even if compiled under DOS. */ | |||||
# define OS2 | |||||
#endif | |||||
#if !defined WIN32 | |||||
# if HAVE_LANGINFO_CODESET | |||||
# include <langinfo.h> | |||||
# else | |||||
# if HAVE_SETLOCALE | |||||
# include <locale.h> | |||||
# endif | |||||
# endif | |||||
#elif defined WIN32 | |||||
# define WIN32_LEAN_AND_MEAN | |||||
# include <windows.h> | |||||
#endif | |||||
#if defined OS2 | |||||
# define INCL_DOS | |||||
# include <os2.h> | |||||
#endif | |||||
#if ENABLE_RELOCATABLE | |||||
# include "relocatable.h" | |||||
#else | |||||
# define relocate(pathname) (pathname) | |||||
#endif | |||||
#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ | |||||
/* Win32, OS/2, DOS */ | |||||
# define ISSLASH(C) ((C) == '/' || (C) == '\\') | |||||
#endif | |||||
#ifndef DIRECTORY_SEPARATOR | |||||
# define DIRECTORY_SEPARATOR '/' | |||||
#endif | |||||
#ifndef ISSLASH | |||||
# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) | |||||
#endif | |||||
#if HAVE_DECL_GETC_UNLOCKED | |||||
# undef getc | |||||
# define getc getc_unlocked | |||||
#endif | |||||
/* The following static variable is declared 'volatile' to avoid a | |||||
possible multithread problem in the function get_charset_aliases. If we | |||||
are running in a threaded environment, and if two threads initialize | |||||
'charset_aliases' simultaneously, both will produce the same value, | |||||
and everything will be ok if the two assignments to 'charset_aliases' | |||||
are atomic. But I don't know what will happen if the two assignments mix. */ | |||||
#if __STDC__ != 1 | |||||
# define volatile /* empty */ | |||||
#endif | |||||
/* Pointer to the contents of the charset.alias file, if it has already been | |||||
read, else NULL. Its format is: | |||||
ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ | |||||
static const char * volatile charset_aliases; | |||||
/* Return a pointer to the contents of the charset.alias file. */ | |||||
static const char * | |||||
get_charset_aliases () | |||||
{ | |||||
const char *cp; | |||||
cp = charset_aliases; | |||||
if (cp == NULL) | |||||
{ | |||||
#if !(defined VMS || defined WIN32) | |||||
FILE *fp; | |||||
const char *dir = relocate (LIBDIR); | |||||
const char *base = "charset.alias"; | |||||
char *file_name; | |||||
/* Concatenate dir and base into freshly allocated file_name. */ | |||||
{ | |||||
size_t dir_len = strlen (dir); | |||||
size_t base_len = strlen (base); | |||||
int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); | |||||
file_name = (char *) malloc (dir_len + add_slash + base_len + 1); | |||||
if (file_name != NULL) | |||||
{ | |||||
memcpy (file_name, dir, dir_len); | |||||
if (add_slash) | |||||
file_name[dir_len] = DIRECTORY_SEPARATOR; | |||||
memcpy (file_name + dir_len + add_slash, base, base_len + 1); | |||||
} | |||||
} | |||||
if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) | |||||
/* Out of memory or file not found, treat it as empty. */ | |||||
cp = ""; | |||||
else | |||||
{ | |||||
/* Parse the file's contents. */ | |||||
int c; | |||||
char buf1[50+1]; | |||||
char buf2[50+1]; | |||||
char *res_ptr = NULL; | |||||
size_t res_size = 0; | |||||
size_t l1, l2; | |||||
for (;;) | |||||
{ | |||||
c = getc (fp); | |||||
if (c == EOF) | |||||
break; | |||||
if (c == '\n' || c == ' ' || c == '\t') | |||||
continue; | |||||
if (c == '#') | |||||
{ | |||||
/* Skip comment, to end of line. */ | |||||
do | |||||
c = getc (fp); | |||||
while (!(c == EOF || c == '\n')); | |||||
if (c == EOF) | |||||
break; | |||||
continue; | |||||
} | |||||
ungetc (c, fp); | |||||
if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) | |||||
break; | |||||
l1 = strlen (buf1); | |||||
l2 = strlen (buf2); | |||||
if (res_size == 0) | |||||
{ | |||||
res_size = l1 + 1 + l2 + 1; | |||||
res_ptr = (char *) malloc (res_size + 1); | |||||
} | |||||
else | |||||
{ | |||||
res_size += l1 + 1 + l2 + 1; | |||||
res_ptr = (char *) realloc (res_ptr, res_size + 1); | |||||
} | |||||
if (res_ptr == NULL) | |||||
{ | |||||
/* Out of memory. */ | |||||
res_size = 0; | |||||
break; | |||||
} | |||||
strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); | |||||
strcpy (res_ptr + res_size - (l2 + 1), buf2); | |||||
} | |||||
fclose (fp); | |||||
if (res_size == 0) | |||||
cp = ""; | |||||
else | |||||
{ | |||||
*(res_ptr + res_size) = '\0'; | |||||
cp = res_ptr; | |||||
} | |||||
} | |||||
if (file_name != NULL) | |||||
free (file_name); | |||||
#else | |||||
# if defined VMS | |||||
/* To avoid the troubles of an extra file charset.alias_vms in the | |||||
sources of many GNU packages, simply inline the aliases here. */ | |||||
/* The list of encodings is taken from the OpenVMS 7.3-1 documentation | |||||
"Compaq C Run-Time Library Reference Manual for OpenVMS systems" | |||||
section 10.7 "Handling Different Character Sets". */ | |||||
cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" | |||||
"ISO8859-2" "\0" "ISO-8859-2" "\0" | |||||
"ISO8859-5" "\0" "ISO-8859-5" "\0" | |||||
"ISO8859-7" "\0" "ISO-8859-7" "\0" | |||||
"ISO8859-8" "\0" "ISO-8859-8" "\0" | |||||
"ISO8859-9" "\0" "ISO-8859-9" "\0" | |||||
/* Japanese */ | |||||
"eucJP" "\0" "EUC-JP" "\0" | |||||
"SJIS" "\0" "SHIFT_JIS" "\0" | |||||
"DECKANJI" "\0" "DEC-KANJI" "\0" | |||||
"SDECKANJI" "\0" "EUC-JP" "\0" | |||||
/* Chinese */ | |||||
"eucTW" "\0" "EUC-TW" "\0" | |||||
"DECHANYU" "\0" "DEC-HANYU" "\0" | |||||
"DECHANZI" "\0" "GB2312" "\0" | |||||
/* Korean */ | |||||
"DECKOREAN" "\0" "EUC-KR" "\0"; | |||||
# endif | |||||
# if defined WIN32 | |||||
/* To avoid the troubles of installing a separate file in the same | |||||
directory as the DLL and of retrieving the DLL's directory at | |||||
runtime, simply inline the aliases here. */ | |||||
cp = "CP936" "\0" "GBK" "\0" | |||||
"CP1361" "\0" "JOHAB" "\0" | |||||
"CP20127" "\0" "ASCII" "\0" | |||||
"CP20866" "\0" "KOI8-R" "\0" | |||||
"CP21866" "\0" "KOI8-RU" "\0" | |||||
"CP28591" "\0" "ISO-8859-1" "\0" | |||||
"CP28592" "\0" "ISO-8859-2" "\0" | |||||
"CP28593" "\0" "ISO-8859-3" "\0" | |||||
"CP28594" "\0" "ISO-8859-4" "\0" | |||||
"CP28595" "\0" "ISO-8859-5" "\0" | |||||
"CP28596" "\0" "ISO-8859-6" "\0" | |||||
"CP28597" "\0" "ISO-8859-7" "\0" | |||||
"CP28598" "\0" "ISO-8859-8" "\0" | |||||
"CP28599" "\0" "ISO-8859-9" "\0" | |||||
"CP28605" "\0" "ISO-8859-15" "\0"; | |||||
# endif | |||||
#endif | |||||
charset_aliases = cp; | |||||
} | |||||
return cp; | |||||
} | |||||
/* Determine the current locale's character encoding, and canonicalize it | |||||
into one of the canonical names listed in config.charset. | |||||
The result must not be freed; it is statically allocated. | |||||
If the canonical name cannot be determined, the result is a non-canonical | |||||
name. */ | |||||
#ifdef STATIC | |||||
STATIC | |||||
#endif | |||||
const char * | |||||
locale_charset () | |||||
{ | |||||
const char *codeset; | |||||
const char *aliases; | |||||
#if !(defined WIN32 || defined OS2) | |||||
# if HAVE_LANGINFO_CODESET | |||||
/* Most systems support nl_langinfo (CODESET) nowadays. */ | |||||
codeset = nl_langinfo (CODESET); | |||||
# else | |||||
/* On old systems which lack it, use setlocale or getenv. */ | |||||
const char *locale = NULL; | |||||
/* But most old systems don't have a complete set of locales. Some | |||||
(like SunOS 4 or DJGPP) have only the C locale. Therefore we don't | |||||
use setlocale here; it would return "C" when it doesn't support the | |||||
locale name the user has set. */ | |||||
# if HAVE_SETLOCALE && 0 | |||||
locale = setlocale (LC_CTYPE, NULL); | |||||
# endif | |||||
if (locale == NULL || locale[0] == '\0') | |||||
{ | |||||
locale = getenv ("LC_ALL"); | |||||
if (locale == NULL || locale[0] == '\0') | |||||
{ | |||||
locale = getenv ("LC_CTYPE"); | |||||
if (locale == NULL || locale[0] == '\0') | |||||
locale = getenv ("LANG"); | |||||
} | |||||
} | |||||
/* On some old systems, one used to set locale = "iso8859_1". On others, | |||||
you set it to "language_COUNTRY.charset". In any case, we resolve it | |||||
through the charset.alias file. */ | |||||
codeset = locale; | |||||
# endif | |||||
#elif defined WIN32 | |||||
static char buf[2 + 10 + 1]; | |||||
/* Woe32 has a function returning the locale's codepage as a number. */ | |||||
sprintf (buf, "CP%u", GetACP ()); | |||||
codeset = buf; | |||||
#elif defined OS2 | |||||
const char *locale; | |||||
static char buf[2 + 10 + 1]; | |||||
ULONG cp[3]; | |||||
ULONG cplen; | |||||
/* Allow user to override the codeset, as set in the operating system, | |||||
with standard language environment variables. */ | |||||
locale = getenv ("LC_ALL"); | |||||
if (locale == NULL || locale[0] == '\0') | |||||
{ | |||||
locale = getenv ("LC_CTYPE"); | |||||
if (locale == NULL || locale[0] == '\0') | |||||
locale = getenv ("LANG"); | |||||
} | |||||
if (locale != NULL && locale[0] != '\0') | |||||
{ | |||||
/* If the locale name contains an encoding after the dot, return it. */ | |||||
const char *dot = strchr (locale, '.'); | |||||
if (dot != NULL) | |||||
{ | |||||
const char *modifier; | |||||
dot++; | |||||
/* Look for the possible @... trailer and remove it, if any. */ | |||||
modifier = strchr (dot, '@'); | |||||
if (modifier == NULL) | |||||
return dot; | |||||
if (modifier - dot < sizeof (buf)) | |||||
{ | |||||
memcpy (buf, dot, modifier - dot); | |||||
buf [modifier - dot] = '\0'; | |||||
return buf; | |||||
} | |||||
} | |||||
/* Resolve through the charset.alias file. */ | |||||
codeset = locale; | |||||
} | |||||
else | |||||
{ | |||||
/* OS/2 has a function returning the locale's codepage as a number. */ | |||||
if (DosQueryCp (sizeof (cp), cp, &cplen)) | |||||
codeset = ""; | |||||
else | |||||
{ | |||||
sprintf (buf, "CP%u", cp[0]); | |||||
codeset = buf; | |||||
} | |||||
} | |||||
#endif | |||||
if (codeset == NULL) | |||||
/* The canonical name cannot be determined. */ | |||||
codeset = ""; | |||||
/* Resolve alias. */ | |||||
for (aliases = get_charset_aliases (); | |||||
*aliases != '\0'; | |||||
aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) | |||||
if (strcmp (codeset, aliases) == 0 | |||||
|| (aliases[0] == '*' && aliases[1] == '\0')) | |||||
{ | |||||
codeset = aliases + strlen (aliases) + 1; | |||||
break; | |||||
} | |||||
/* Don't return an empty string. GNU libc and GNU libiconv interpret | |||||
the empty string as denoting "the locale's character encoding", | |||||
thus GNU libiconv would call this function a second time. */ | |||||
if (codeset[0] == '\0') | |||||
codeset = "ASCII"; | |||||
return codeset; | |||||
} |
/* Determine a canonical name for the current locale's character encoding. | |||||
Copyright (C) 2000-2003 Free Software Foundation, Inc. | |||||
This file is part of the GNU CHARSET Library. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef _LOCALCHARSET_H | |||||
#define _LOCALCHARSET_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Determine the current locale's character encoding, and canonicalize it | |||||
into one of the canonical names listed in config.charset. | |||||
The result must not be freed; it is statically allocated. | |||||
If the canonical name cannot be determined, the result is a non-canonical | |||||
name. */ | |||||
extern const char * locale_charset (void); | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* _LOCALCHARSET_H */ |
# Locale name alias data base. | |||||
# Copyright (C) 1996-2001,2003 Free Software Foundation, Inc. | |||||
# | |||||
# This program is free software; you can redistribute it and/or modify it | |||||
# under the terms of the GNU Library General Public License as published | |||||
# by the Free Software Foundation; either version 2, 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 | |||||
# Library General Public License for more details. | |||||
# | |||||
# You should have received a copy of the GNU Library General Public | |||||
# License along with this program; if not, write to the Free Software | |||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
# USA. | |||||
# The format of this file is the same as for the corresponding file of | |||||
# the X Window System, which normally can be found in | |||||
# /usr/lib/X11/locale/locale.alias | |||||
# A single line contains two fields: an alias and a substitution value. | |||||
# All entries are case independent. | |||||
# Note: This file is far from being complete. If you have a value for | |||||
# your own site which you think might be useful for others too, share | |||||
# it with the rest of us. Send it using the `glibcbug' script to | |||||
# bugs@gnu.org. | |||||
# Packages using this file: | |||||
bokmal nb_NO.ISO-8859-1 | |||||
bokmål nb_NO.ISO-8859-1 | |||||
catalan ca_ES.ISO-8859-1 | |||||
croatian hr_HR.ISO-8859-2 | |||||
czech cs_CZ.ISO-8859-2 | |||||
danish da_DK.ISO-8859-1 | |||||
dansk da_DK.ISO-8859-1 | |||||
deutsch de_DE.ISO-8859-1 | |||||
dutch nl_NL.ISO-8859-1 | |||||
eesti et_EE.ISO-8859-1 | |||||
estonian et_EE.ISO-8859-1 | |||||
finnish fi_FI.ISO-8859-1 | |||||
français fr_FR.ISO-8859-1 | |||||
french fr_FR.ISO-8859-1 | |||||
galego gl_ES.ISO-8859-1 | |||||
galician gl_ES.ISO-8859-1 | |||||
german de_DE.ISO-8859-1 | |||||
greek el_GR.ISO-8859-7 | |||||
hebrew he_IL.ISO-8859-8 | |||||
hrvatski hr_HR.ISO-8859-2 | |||||
hungarian hu_HU.ISO-8859-2 | |||||
icelandic is_IS.ISO-8859-1 | |||||
italian it_IT.ISO-8859-1 | |||||
japanese ja_JP.eucJP | |||||
japanese.euc ja_JP.eucJP | |||||
ja_JP ja_JP.eucJP | |||||
ja_JP.ujis ja_JP.eucJP | |||||
japanese.sjis ja_JP.SJIS | |||||
korean ko_KR.eucKR | |||||
korean.euc ko_KR.eucKR | |||||
ko_KR ko_KR.eucKR | |||||
lithuanian lt_LT.ISO-8859-13 | |||||
no_NO nb_NO.ISO-8859-1 | |||||
no_NO.ISO-8859-1 nb_NO.ISO-8859-1 | |||||
norwegian nb_NO.ISO-8859-1 | |||||
nynorsk nn_NO.ISO-8859-1 | |||||
polish pl_PL.ISO-8859-2 | |||||
portuguese pt_PT.ISO-8859-1 | |||||
romanian ro_RO.ISO-8859-2 | |||||
russian ru_RU.ISO-8859-5 | |||||
slovak sk_SK.ISO-8859-2 | |||||
slovene sl_SI.ISO-8859-2 | |||||
slovenian sl_SI.ISO-8859-2 | |||||
spanish es_ES.ISO-8859-1 | |||||
swedish sv_SE.ISO-8859-1 | |||||
thai th_TH.TIS-620 | |||||
turkish tr_TR.ISO-8859-9 |
/* Handle aliases for locale names. | |||||
Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
/* Tell glibc's <string.h> to provide a prototype for mempcpy(). | |||||
This must come before <config.h> because <config.h> may include | |||||
<features.h>, and once <features.h> has been included, it's too late. */ | |||||
#ifndef _GNU_SOURCE | |||||
# define _GNU_SOURCE 1 | |||||
#endif | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#include <ctype.h> | |||||
#include <stdio.h> | |||||
#if defined _LIBC || defined HAVE___FSETLOCKING | |||||
# include <stdio_ext.h> | |||||
#endif | |||||
#include <sys/types.h> | |||||
#ifdef __GNUC__ | |||||
# undef alloca | |||||
# define alloca __builtin_alloca | |||||
# define HAVE_ALLOCA 1 | |||||
#else | |||||
# ifdef _MSC_VER | |||||
# include <malloc.h> | |||||
# define alloca _alloca | |||||
# else | |||||
# if defined HAVE_ALLOCA_H || defined _LIBC | |||||
# include <alloca.h> | |||||
# else | |||||
# ifdef _AIX | |||||
#pragma alloca | |||||
# else | |||||
# ifndef alloca | |||||
char *alloca (); | |||||
# endif | |||||
# endif | |||||
# endif | |||||
# endif | |||||
#endif | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#include "gettextP.h" | |||||
#if ENABLE_RELOCATABLE | |||||
# include "relocatable.h" | |||||
#else | |||||
# define relocate(pathname) (pathname) | |||||
#endif | |||||
/* @@ end of prolog @@ */ | |||||
#ifdef _LIBC | |||||
/* Rename the non ANSI C functions. This is required by the standard | |||||
because some ANSI C functions will require linking with this object | |||||
file and the name space must not be polluted. */ | |||||
# define strcasecmp __strcasecmp | |||||
# ifndef mempcpy | |||||
# define mempcpy __mempcpy | |||||
# endif | |||||
# define HAVE_MEMPCPY 1 | |||||
# define HAVE___FSETLOCKING 1 | |||||
/* We need locking here since we can be called from different places. */ | |||||
# include <bits/libc-lock.h> | |||||
__libc_lock_define_initialized (static, lock); | |||||
#endif | |||||
#ifndef internal_function | |||||
# define internal_function | |||||
#endif | |||||
/* Some optimizations for glibc. */ | |||||
#ifdef _LIBC | |||||
# define FEOF(fp) feof_unlocked (fp) | |||||
# define FGETS(buf, n, fp) fgets_unlocked (buf, n, fp) | |||||
#else | |||||
# define FEOF(fp) feof (fp) | |||||
# define FGETS(buf, n, fp) fgets (buf, n, fp) | |||||
#endif | |||||
/* For those losing systems which don't have `alloca' we have to add | |||||
some additional code emulating it. */ | |||||
#ifdef HAVE_ALLOCA | |||||
# define freea(p) /* nothing */ | |||||
#else | |||||
# define alloca(n) malloc (n) | |||||
# define freea(p) free (p) | |||||
#endif | |||||
#if defined _LIBC_REENTRANT || HAVE_DECL_FGETS_UNLOCKED | |||||
# undef fgets | |||||
# define fgets(buf, len, s) fgets_unlocked (buf, len, s) | |||||
#endif | |||||
#if defined _LIBC_REENTRANT || HAVE_DECL_FEOF_UNLOCKED | |||||
# undef feof | |||||
# define feof(s) feof_unlocked (s) | |||||
#endif | |||||
struct alias_map | |||||
{ | |||||
const char *alias; | |||||
const char *value; | |||||
}; | |||||
#ifndef _LIBC | |||||
# define libc_freeres_ptr(decl) decl | |||||
#endif | |||||
libc_freeres_ptr (static char *string_space); | |||||
static size_t string_space_act; | |||||
static size_t string_space_max; | |||||
libc_freeres_ptr (static struct alias_map *map); | |||||
static size_t nmap; | |||||
static size_t maxmap; | |||||
/* Prototypes for local functions. */ | |||||
static size_t read_alias_file (const char *fname, int fname_len) | |||||
internal_function; | |||||
static int extend_alias_table (void); | |||||
static int alias_compare (const struct alias_map *map1, | |||||
const struct alias_map *map2); | |||||
const char * | |||||
_nl_expand_alias (const char *name) | |||||
{ | |||||
static const char *locale_alias_path; | |||||
struct alias_map *retval; | |||||
const char *result = NULL; | |||||
size_t added; | |||||
#ifdef _LIBC | |||||
__libc_lock_lock (lock); | |||||
#endif | |||||
if (locale_alias_path == NULL) | |||||
locale_alias_path = LOCALE_ALIAS_PATH; | |||||
do | |||||
{ | |||||
struct alias_map item; | |||||
item.alias = name; | |||||
if (nmap > 0) | |||||
retval = (struct alias_map *) bsearch (&item, map, nmap, | |||||
sizeof (struct alias_map), | |||||
(int (*) (const void *, | |||||
const void *) | |||||
) alias_compare); | |||||
else | |||||
retval = NULL; | |||||
/* We really found an alias. Return the value. */ | |||||
if (retval != NULL) | |||||
{ | |||||
result = retval->value; | |||||
break; | |||||
} | |||||
/* Perhaps we can find another alias file. */ | |||||
added = 0; | |||||
while (added == 0 && locale_alias_path[0] != '\0') | |||||
{ | |||||
const char *start; | |||||
while (locale_alias_path[0] == PATH_SEPARATOR) | |||||
++locale_alias_path; | |||||
start = locale_alias_path; | |||||
while (locale_alias_path[0] != '\0' | |||||
&& locale_alias_path[0] != PATH_SEPARATOR) | |||||
++locale_alias_path; | |||||
if (start < locale_alias_path) | |||||
added = read_alias_file (start, locale_alias_path - start); | |||||
} | |||||
} | |||||
while (added != 0); | |||||
#ifdef _LIBC | |||||
__libc_lock_unlock (lock); | |||||
#endif | |||||
return result; | |||||
} | |||||
static size_t | |||||
internal_function | |||||
read_alias_file (const char *fname, int fname_len) | |||||
{ | |||||
FILE *fp; | |||||
char *full_fname; | |||||
size_t added; | |||||
static const char aliasfile[] = "/locale.alias"; | |||||
full_fname = (char *) alloca (fname_len + sizeof aliasfile); | |||||
#ifdef HAVE_MEMPCPY | |||||
mempcpy (mempcpy (full_fname, fname, fname_len), | |||||
aliasfile, sizeof aliasfile); | |||||
#else | |||||
memcpy (full_fname, fname, fname_len); | |||||
memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); | |||||
#endif | |||||
fp = fopen (relocate (full_fname), "r"); | |||||
freea (full_fname); | |||||
if (fp == NULL) | |||||
return 0; | |||||
#ifdef HAVE___FSETLOCKING | |||||
/* No threads present. */ | |||||
__fsetlocking (fp, FSETLOCKING_BYCALLER); | |||||
#endif | |||||
added = 0; | |||||
while (!FEOF (fp)) | |||||
{ | |||||
/* It is a reasonable approach to use a fix buffer here because | |||||
a) we are only interested in the first two fields | |||||
b) these fields must be usable as file names and so must not | |||||
be that long | |||||
We avoid a multi-kilobyte buffer here since this would use up | |||||
stack space which we might not have if the program ran out of | |||||
memory. */ | |||||
char buf[400]; | |||||
char *alias; | |||||
char *value; | |||||
char *cp; | |||||
if (FGETS (buf, sizeof buf, fp) == NULL) | |||||
/* EOF reached. */ | |||||
break; | |||||
cp = buf; | |||||
/* Ignore leading white space. */ | |||||
while (isspace ((unsigned char) cp[0])) | |||||
++cp; | |||||
/* A leading '#' signals a comment line. */ | |||||
if (cp[0] != '\0' && cp[0] != '#') | |||||
{ | |||||
alias = cp++; | |||||
while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) | |||||
++cp; | |||||
/* Terminate alias name. */ | |||||
if (cp[0] != '\0') | |||||
*cp++ = '\0'; | |||||
/* Now look for the beginning of the value. */ | |||||
while (isspace ((unsigned char) cp[0])) | |||||
++cp; | |||||
if (cp[0] != '\0') | |||||
{ | |||||
size_t alias_len; | |||||
size_t value_len; | |||||
value = cp++; | |||||
while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) | |||||
++cp; | |||||
/* Terminate value. */ | |||||
if (cp[0] == '\n') | |||||
{ | |||||
/* This has to be done to make the following test | |||||
for the end of line possible. We are looking for | |||||
the terminating '\n' which do not overwrite here. */ | |||||
*cp++ = '\0'; | |||||
*cp = '\n'; | |||||
} | |||||
else if (cp[0] != '\0') | |||||
*cp++ = '\0'; | |||||
if (nmap >= maxmap) | |||||
if (__builtin_expect (extend_alias_table (), 0)) | |||||
return added; | |||||
alias_len = strlen (alias) + 1; | |||||
value_len = strlen (value) + 1; | |||||
if (string_space_act + alias_len + value_len > string_space_max) | |||||
{ | |||||
/* Increase size of memory pool. */ | |||||
size_t new_size = (string_space_max | |||||
+ (alias_len + value_len > 1024 | |||||
? alias_len + value_len : 1024)); | |||||
char *new_pool = (char *) realloc (string_space, new_size); | |||||
if (new_pool == NULL) | |||||
return added; | |||||
if (__builtin_expect (string_space != new_pool, 0)) | |||||
{ | |||||
size_t i; | |||||
for (i = 0; i < nmap; i++) | |||||
{ | |||||
map[i].alias += new_pool - string_space; | |||||
map[i].value += new_pool - string_space; | |||||
} | |||||
} | |||||
string_space = new_pool; | |||||
string_space_max = new_size; | |||||
} | |||||
map[nmap].alias = memcpy (&string_space[string_space_act], | |||||
alias, alias_len); | |||||
string_space_act += alias_len; | |||||
map[nmap].value = memcpy (&string_space[string_space_act], | |||||
value, value_len); | |||||
string_space_act += value_len; | |||||
++nmap; | |||||
++added; | |||||
} | |||||
} | |||||
/* Possibly not the whole line fits into the buffer. Ignore | |||||
the rest of the line. */ | |||||
while (strchr (buf, '\n') == NULL) | |||||
if (FGETS (buf, sizeof buf, fp) == NULL) | |||||
/* Make sure the inner loop will be left. The outer loop | |||||
will exit at the `feof' test. */ | |||||
break; | |||||
} | |||||
/* Should we test for ferror()? I think we have to silently ignore | |||||
errors. --drepper */ | |||||
fclose (fp); | |||||
if (added > 0) | |||||
qsort (map, nmap, sizeof (struct alias_map), | |||||
(int (*) (const void *, const void *)) alias_compare); | |||||
return added; | |||||
} | |||||
static int | |||||
extend_alias_table () | |||||
{ | |||||
size_t new_size; | |||||
struct alias_map *new_map; | |||||
new_size = maxmap == 0 ? 100 : 2 * maxmap; | |||||
new_map = (struct alias_map *) realloc (map, (new_size | |||||
* sizeof (struct alias_map))); | |||||
if (new_map == NULL) | |||||
/* Simply don't extend: we don't have any more core. */ | |||||
return -1; | |||||
map = new_map; | |||||
maxmap = new_size; | |||||
return 0; | |||||
} | |||||
static int | |||||
alias_compare (const struct alias_map *map1, const struct alias_map *map2) | |||||
{ | |||||
#if defined _LIBC || defined HAVE_STRCASECMP | |||||
return strcasecmp (map1->alias, map2->alias); | |||||
#else | |||||
const unsigned char *p1 = (const unsigned char *) map1->alias; | |||||
const unsigned char *p2 = (const unsigned char *) map2->alias; | |||||
unsigned char c1, c2; | |||||
if (p1 == p2) | |||||
return 0; | |||||
do | |||||
{ | |||||
/* I know this seems to be odd but the tolower() function in | |||||
some systems libc cannot handle nonalpha characters. */ | |||||
c1 = isupper (*p1) ? tolower (*p1) : *p1; | |||||
c2 = isupper (*p2) ? tolower (*p2) : *p2; | |||||
if (c1 == '\0') | |||||
break; | |||||
++p1; | |||||
++p2; | |||||
} | |||||
while (c1 == c2); | |||||
return c1 - c2; | |||||
#endif | |||||
} |
/* Log file output. | |||||
Copyright (C) 2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
/* Written by Bruno Haible <bruno@clisp.org>. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
/* Print an ASCII string with quotes and escape sequences where needed. */ | |||||
static void | |||||
print_escaped (FILE *stream, const char *str) | |||||
{ | |||||
putc ('"', stream); | |||||
for (; *str != '\0'; str++) | |||||
if (*str == '\n') | |||||
{ | |||||
fputs ("\\n\"", stream); | |||||
if (str[1] == '\0') | |||||
return; | |||||
fputs ("\n\"", stream); | |||||
} | |||||
else | |||||
{ | |||||
if (*str == '"' || *str == '\\') | |||||
putc ('\\', stream); | |||||
putc (*str, stream); | |||||
} | |||||
putc ('"', stream); | |||||
} | |||||
/* Add to the log file an entry denoting a failed translation. */ | |||||
void | |||||
_nl_log_untranslated (const char *logfilename, const char *domainname, | |||||
const char *msgid1, const char *msgid2, int plural) | |||||
{ | |||||
static char *last_logfilename = NULL; | |||||
static FILE *last_logfile = NULL; | |||||
FILE *logfile; | |||||
/* Can we reuse the last opened logfile? */ | |||||
if (last_logfilename == NULL || strcmp (logfilename, last_logfilename) != 0) | |||||
{ | |||||
/* Close the last used logfile. */ | |||||
if (last_logfilename != NULL) | |||||
{ | |||||
if (last_logfile != NULL) | |||||
{ | |||||
fclose (last_logfile); | |||||
last_logfile = NULL; | |||||
} | |||||
free (last_logfilename); | |||||
last_logfilename = NULL; | |||||
} | |||||
/* Open the logfile. */ | |||||
last_logfilename = (char *) malloc (strlen (logfilename) + 1); | |||||
if (last_logfilename == NULL) | |||||
return; | |||||
strcpy (last_logfilename, logfilename); | |||||
last_logfile = fopen (logfilename, "a"); | |||||
if (last_logfile == NULL) | |||||
return; | |||||
} | |||||
logfile = last_logfile; | |||||
fprintf (logfile, "domain "); | |||||
print_escaped (logfile, domainname); | |||||
fprintf (logfile, "\nmsgid "); | |||||
print_escaped (logfile, msgid1); | |||||
if (plural) | |||||
{ | |||||
fprintf (logfile, "\nmsgid_plural "); | |||||
print_escaped (logfile, msgid2); | |||||
fprintf (logfile, "\nmsgstr[0] \"\"\n"); | |||||
} | |||||
else | |||||
fprintf (logfile, "\nmsgstr \"\"\n"); | |||||
putc ('\n', logfile); | |||||
} |
/* Implementation of ngettext(3) function. | |||||
Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#ifdef _LIBC | |||||
# define __need_NULL | |||||
# include <stddef.h> | |||||
#else | |||||
# include <stdlib.h> /* Just for NULL. */ | |||||
#endif | |||||
#include "gettextP.h" | |||||
#ifdef _LIBC | |||||
# include <libintl.h> | |||||
#else | |||||
# include "libgnuintl.h" | |||||
#endif | |||||
#include <locale.h> | |||||
/* @@ end of prolog @@ */ | |||||
/* Names for the libintl functions are a problem. They must not clash | |||||
with existing names and they should follow ANSI C. But this source | |||||
code is also used in GNU C Library where the names have a __ | |||||
prefix. So we have to make a difference here. */ | |||||
#ifdef _LIBC | |||||
# define NGETTEXT __ngettext | |||||
# define DCNGETTEXT __dcngettext | |||||
#else | |||||
# define NGETTEXT libintl_ngettext | |||||
# define DCNGETTEXT libintl_dcngettext | |||||
#endif | |||||
/* Look up MSGID in the current default message catalog for the current | |||||
LC_MESSAGES locale. If not found, returns MSGID itself (the default | |||||
text). */ | |||||
char * | |||||
NGETTEXT (const char *msgid1, const char *msgid2, unsigned long int n) | |||||
{ | |||||
return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES); | |||||
} | |||||
#ifdef _LIBC | |||||
/* Alias for function name in GNU C Library. */ | |||||
weak_alias (__ngettext, ngettext); | |||||
#endif |
/* OS/2 compatibility functions. | |||||
Copyright (C) 2001-2002 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#define OS2_AWARE | |||||
#ifdef HAVE_CONFIG_H | |||||
#include <config.h> | |||||
#endif | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#include <sys/param.h> | |||||
/* A version of getenv() that works from DLLs */ | |||||
extern unsigned long DosScanEnv (const unsigned char *pszName, unsigned char **ppszValue); | |||||
char * | |||||
_nl_getenv (const char *name) | |||||
{ | |||||
unsigned char *value; | |||||
if (DosScanEnv (name, &value)) | |||||
return NULL; | |||||
else | |||||
return value; | |||||
} | |||||
/* A fixed size buffer. */ | |||||
char libintl_nl_default_dirname[MAXPATHLEN+1]; | |||||
char *_nlos2_libdir = NULL; | |||||
char *_nlos2_localealiaspath = NULL; | |||||
char *_nlos2_localedir = NULL; | |||||
static __attribute__((constructor)) void | |||||
nlos2_initialize () | |||||
{ | |||||
char *root = getenv ("UNIXROOT"); | |||||
char *gnulocaledir = getenv ("GNULOCALEDIR"); | |||||
_nlos2_libdir = gnulocaledir; | |||||
if (!_nlos2_libdir) | |||||
{ | |||||
if (root) | |||||
{ | |||||
size_t sl = strlen (root); | |||||
_nlos2_libdir = (char *) malloc (sl + strlen (LIBDIR) + 1); | |||||
memcpy (_nlos2_libdir, root, sl); | |||||
memcpy (_nlos2_libdir + sl, LIBDIR, strlen (LIBDIR) + 1); | |||||
} | |||||
else | |||||
_nlos2_libdir = LIBDIR; | |||||
} | |||||
_nlos2_localealiaspath = gnulocaledir; | |||||
if (!_nlos2_localealiaspath) | |||||
{ | |||||
if (root) | |||||
{ | |||||
size_t sl = strlen (root); | |||||
_nlos2_localealiaspath = (char *) malloc (sl + strlen (LOCALE_ALIAS_PATH) + 1); | |||||
memcpy (_nlos2_localealiaspath, root, sl); | |||||
memcpy (_nlos2_localealiaspath + sl, LOCALE_ALIAS_PATH, strlen (LOCALE_ALIAS_PATH) + 1); | |||||
} | |||||
else | |||||
_nlos2_localealiaspath = LOCALE_ALIAS_PATH; | |||||
} | |||||
_nlos2_localedir = gnulocaledir; | |||||
if (!_nlos2_localedir) | |||||
{ | |||||
if (root) | |||||
{ | |||||
size_t sl = strlen (root); | |||||
_nlos2_localedir = (char *) malloc (sl + strlen (LOCALEDIR) + 1); | |||||
memcpy (_nlos2_localedir, root, sl); | |||||
memcpy (_nlos2_localedir + sl, LOCALEDIR, strlen (LOCALEDIR) + 1); | |||||
} | |||||
else | |||||
_nlos2_localedir = LOCALEDIR; | |||||
} | |||||
if (strlen (_nlos2_localedir) <= MAXPATHLEN) | |||||
strcpy (libintl_nl_default_dirname, _nlos2_localedir); | |||||
} |
/* OS/2 compatibility defines. | |||||
This file is intended to be included from config.h | |||||
Copyright (C) 2001-2002 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
/* When included from os2compat.h we need all the original definitions */ | |||||
#ifndef OS2_AWARE | |||||
#undef LIBDIR | |||||
#define LIBDIR _nlos2_libdir | |||||
extern char *_nlos2_libdir; | |||||
#undef LOCALEDIR | |||||
#define LOCALEDIR _nlos2_localedir | |||||
extern char *_nlos2_localedir; | |||||
#undef LOCALE_ALIAS_PATH | |||||
#define LOCALE_ALIAS_PATH _nlos2_localealiaspath | |||||
extern char *_nlos2_localealiaspath; | |||||
#endif | |||||
#undef HAVE_STRCASECMP | |||||
#define HAVE_STRCASECMP 1 | |||||
#define strcasecmp stricmp | |||||
#define strncasecmp strnicmp | |||||
/* We have our own getenv() which works even if library is compiled as DLL */ | |||||
#define getenv _nl_getenv | |||||
/* Older versions of gettext used -1 as the value of LC_MESSAGES */ | |||||
#define LC_MESSAGES_COMPAT (-1) |
/* OS dependent parts of libintl. | |||||
Copyright (C) 2001-2002 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#if defined __EMX__ | |||||
# include "os2compat.c" | |||||
#else | |||||
/* Avoid AIX compiler warning. */ | |||||
typedef int dummy; | |||||
#endif |
/* Expression parsing for plural form selection. | |||||
Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc. | |||||
Written by Ulrich Drepper <drepper@cygnus.com>, 2000. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#include <ctype.h> | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#include "plural-exp.h" | |||||
#if (defined __GNUC__ && !defined __APPLE_CC__) \ | |||||
|| (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) | |||||
/* These structs are the constant expression for the germanic plural | |||||
form determination. It represents the expression "n != 1". */ | |||||
static const struct expression plvar = | |||||
{ | |||||
.nargs = 0, | |||||
.operation = var, | |||||
}; | |||||
static const struct expression plone = | |||||
{ | |||||
.nargs = 0, | |||||
.operation = num, | |||||
.val = | |||||
{ | |||||
.num = 1 | |||||
} | |||||
}; | |||||
struct expression GERMANIC_PLURAL = | |||||
{ | |||||
.nargs = 2, | |||||
.operation = not_equal, | |||||
.val = | |||||
{ | |||||
.args = | |||||
{ | |||||
[0] = (struct expression *) &plvar, | |||||
[1] = (struct expression *) &plone | |||||
} | |||||
} | |||||
}; | |||||
# define INIT_GERMANIC_PLURAL() | |||||
#else | |||||
/* For compilers without support for ISO C 99 struct/union initializers: | |||||
Initialization at run-time. */ | |||||
static struct expression plvar; | |||||
static struct expression plone; | |||||
struct expression GERMANIC_PLURAL; | |||||
static void | |||||
init_germanic_plural () | |||||
{ | |||||
if (plone.val.num == 0) | |||||
{ | |||||
plvar.nargs = 0; | |||||
plvar.operation = var; | |||||
plone.nargs = 0; | |||||
plone.operation = num; | |||||
plone.val.num = 1; | |||||
GERMANIC_PLURAL.nargs = 2; | |||||
GERMANIC_PLURAL.operation = not_equal; | |||||
GERMANIC_PLURAL.val.args[0] = &plvar; | |||||
GERMANIC_PLURAL.val.args[1] = &plone; | |||||
} | |||||
} | |||||
# define INIT_GERMANIC_PLURAL() init_germanic_plural () | |||||
#endif | |||||
void | |||||
internal_function | |||||
EXTRACT_PLURAL_EXPRESSION (const char *nullentry, struct expression **pluralp, | |||||
unsigned long int *npluralsp) | |||||
{ | |||||
if (nullentry != NULL) | |||||
{ | |||||
const char *plural; | |||||
const char *nplurals; | |||||
plural = strstr (nullentry, "plural="); | |||||
nplurals = strstr (nullentry, "nplurals="); | |||||
if (plural == NULL || nplurals == NULL) | |||||
goto no_plural; | |||||
else | |||||
{ | |||||
char *endp; | |||||
unsigned long int n; | |||||
struct parse_args args; | |||||
/* First get the number. */ | |||||
nplurals += 9; | |||||
while (*nplurals != '\0' && isspace ((unsigned char) *nplurals)) | |||||
++nplurals; | |||||
if (!(*nplurals >= '0' && *nplurals <= '9')) | |||||
goto no_plural; | |||||
#if defined HAVE_STRTOUL || defined _LIBC | |||||
n = strtoul (nplurals, &endp, 10); | |||||
#else | |||||
for (endp = nplurals, n = 0; *endp >= '0' && *endp <= '9'; endp++) | |||||
n = n * 10 + (*endp - '0'); | |||||
#endif | |||||
if (nplurals == endp) | |||||
goto no_plural; | |||||
*npluralsp = n; | |||||
/* Due to the restrictions bison imposes onto the interface of the | |||||
scanner function we have to put the input string and the result | |||||
passed up from the parser into the same structure which address | |||||
is passed down to the parser. */ | |||||
plural += 7; | |||||
args.cp = plural; | |||||
if (PLURAL_PARSE (&args) != 0) | |||||
goto no_plural; | |||||
*pluralp = args.res; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
/* By default we are using the Germanic form: singular form only | |||||
for `one', the plural form otherwise. Yes, this is also what | |||||
English is using since English is a Germanic language. */ | |||||
no_plural: | |||||
INIT_GERMANIC_PLURAL (); | |||||
*pluralp = &GERMANIC_PLURAL; | |||||
*npluralsp = 2; | |||||
} | |||||
} |
/* Expression parsing and evaluation for plural form selection. | |||||
Copyright (C) 2000-2003 Free Software Foundation, Inc. | |||||
Written by Ulrich Drepper <drepper@cygnus.com>, 2000. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef _PLURAL_EXP_H | |||||
#define _PLURAL_EXP_H | |||||
#ifndef internal_function | |||||
# define internal_function | |||||
#endif | |||||
#ifndef attribute_hidden | |||||
# define attribute_hidden | |||||
#endif | |||||
/* This is the representation of the expressions to determine the | |||||
plural form. */ | |||||
struct expression | |||||
{ | |||||
int nargs; /* Number of arguments. */ | |||||
enum operator | |||||
{ | |||||
/* Without arguments: */ | |||||
var, /* The variable "n". */ | |||||
num, /* Decimal number. */ | |||||
/* Unary operators: */ | |||||
lnot, /* Logical NOT. */ | |||||
/* Binary operators: */ | |||||
mult, /* Multiplication. */ | |||||
divide, /* Division. */ | |||||
module, /* Modulo operation. */ | |||||
plus, /* Addition. */ | |||||
minus, /* Subtraction. */ | |||||
less_than, /* Comparison. */ | |||||
greater_than, /* Comparison. */ | |||||
less_or_equal, /* Comparison. */ | |||||
greater_or_equal, /* Comparison. */ | |||||
equal, /* Comparison for equality. */ | |||||
not_equal, /* Comparison for inequality. */ | |||||
land, /* Logical AND. */ | |||||
lor, /* Logical OR. */ | |||||
/* Ternary operators: */ | |||||
qmop /* Question mark operator. */ | |||||
} operation; | |||||
union | |||||
{ | |||||
unsigned long int num; /* Number value for `num'. */ | |||||
struct expression *args[3]; /* Up to three arguments. */ | |||||
} val; | |||||
}; | |||||
/* This is the data structure to pass information to the parser and get | |||||
the result in a thread-safe way. */ | |||||
struct parse_args | |||||
{ | |||||
const char *cp; | |||||
struct expression *res; | |||||
}; | |||||
/* Names for the libintl functions are a problem. This source code is used | |||||
1. in the GNU C Library library, | |||||
2. in the GNU libintl library, | |||||
3. in the GNU gettext tools. | |||||
The function names in each situation must be different, to allow for | |||||
binary incompatible changes in 'struct expression'. Furthermore, | |||||
1. in the GNU C Library library, the names have a __ prefix, | |||||
2.+3. in the GNU libintl library and in the GNU gettext tools, the names | |||||
must follow ANSI C and not start with __. | |||||
So we have to distinguish the three cases. */ | |||||
#ifdef _LIBC | |||||
# define FREE_EXPRESSION __gettext_free_exp | |||||
# define PLURAL_PARSE __gettextparse | |||||
# define GERMANIC_PLURAL __gettext_germanic_plural | |||||
# define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural | |||||
#elif defined (IN_LIBINTL) | |||||
# define FREE_EXPRESSION libintl_gettext_free_exp | |||||
# define PLURAL_PARSE libintl_gettextparse | |||||
# define GERMANIC_PLURAL libintl_gettext_germanic_plural | |||||
# define EXTRACT_PLURAL_EXPRESSION libintl_gettext_extract_plural | |||||
#else | |||||
# define FREE_EXPRESSION free_plural_expression | |||||
# define PLURAL_PARSE parse_plural_expression | |||||
# define GERMANIC_PLURAL germanic_plural | |||||
# define EXTRACT_PLURAL_EXPRESSION extract_plural_expression | |||||
#endif | |||||
extern void FREE_EXPRESSION (struct expression *exp) | |||||
internal_function; | |||||
extern int PLURAL_PARSE (void *arg); | |||||
extern struct expression GERMANIC_PLURAL attribute_hidden; | |||||
extern void EXTRACT_PLURAL_EXPRESSION (const char *nullentry, | |||||
struct expression **pluralp, | |||||
unsigned long int *npluralsp) | |||||
internal_function; | |||||
#if !defined (_LIBC) && !defined (IN_LIBINTL) | |||||
extern unsigned long int plural_eval (struct expression *pexp, | |||||
unsigned long int n); | |||||
#endif | |||||
#endif /* _PLURAL_EXP_H */ |
%{ | |||||
/* Expression parsing for plural form selection. | |||||
Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc. | |||||
Written by Ulrich Drepper <drepper@cygnus.com>, 2000. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
/* The bison generated parser uses alloca. AIX 3 forces us to put this | |||||
declaration at the beginning of the file. The declaration in bison's | |||||
skeleton file comes too late. This must come before <config.h> | |||||
because <config.h> may include arbitrary system headers. */ | |||||
#if defined _AIX && !defined __GNUC__ | |||||
#pragma alloca | |||||
#endif | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#include <stddef.h> | |||||
#include <stdlib.h> | |||||
#include "plural-exp.h" | |||||
/* The main function generated by the parser is called __gettextparse, | |||||
but we want it to be called PLURAL_PARSE. */ | |||||
#ifndef _LIBC | |||||
# define __gettextparse PLURAL_PARSE | |||||
#endif | |||||
#define YYLEX_PARAM &((struct parse_args *) arg)->cp | |||||
#define YYPARSE_PARAM arg | |||||
%} | |||||
%pure_parser | |||||
%expect 7 | |||||
%union { | |||||
unsigned long int num; | |||||
enum operator op; | |||||
struct expression *exp; | |||||
} | |||||
%{ | |||||
/* Prototypes for local functions. */ | |||||
static int yylex (YYSTYPE *lval, const char **pexp); | |||||
static void yyerror (const char *str); | |||||
/* Allocation of expressions. */ | |||||
static struct expression * | |||||
new_exp (int nargs, enum operator op, struct expression * const *args) | |||||
{ | |||||
int i; | |||||
struct expression *newp; | |||||
/* If any of the argument could not be malloc'ed, just return NULL. */ | |||||
for (i = nargs - 1; i >= 0; i--) | |||||
if (args[i] == NULL) | |||||
goto fail; | |||||
/* Allocate a new expression. */ | |||||
newp = (struct expression *) malloc (sizeof (*newp)); | |||||
if (newp != NULL) | |||||
{ | |||||
newp->nargs = nargs; | |||||
newp->operation = op; | |||||
for (i = nargs - 1; i >= 0; i--) | |||||
newp->val.args[i] = args[i]; | |||||
return newp; | |||||
} | |||||
fail: | |||||
for (i = nargs - 1; i >= 0; i--) | |||||
FREE_EXPRESSION (args[i]); | |||||
return NULL; | |||||
} | |||||
static inline struct expression * | |||||
new_exp_0 (enum operator op) | |||||
{ | |||||
return new_exp (0, op, NULL); | |||||
} | |||||
static inline struct expression * | |||||
new_exp_1 (enum operator op, struct expression *right) | |||||
{ | |||||
struct expression *args[1]; | |||||
args[0] = right; | |||||
return new_exp (1, op, args); | |||||
} | |||||
static struct expression * | |||||
new_exp_2 (enum operator op, struct expression *left, struct expression *right) | |||||
{ | |||||
struct expression *args[2]; | |||||
args[0] = left; | |||||
args[1] = right; | |||||
return new_exp (2, op, args); | |||||
} | |||||
static inline struct expression * | |||||
new_exp_3 (enum operator op, struct expression *bexp, | |||||
struct expression *tbranch, struct expression *fbranch) | |||||
{ | |||||
struct expression *args[3]; | |||||
args[0] = bexp; | |||||
args[1] = tbranch; | |||||
args[2] = fbranch; | |||||
return new_exp (3, op, args); | |||||
} | |||||
%} | |||||
/* This declares that all operators have the same associativity and the | |||||
precedence order as in C. See [Harbison, Steele: C, A Reference Manual]. | |||||
There is no unary minus and no bitwise operators. | |||||
Operators with the same syntactic behaviour have been merged into a single | |||||
token, to save space in the array generated by bison. */ | |||||
%right '?' /* ? */ | |||||
%left '|' /* || */ | |||||
%left '&' /* && */ | |||||
%left EQUOP2 /* == != */ | |||||
%left CMPOP2 /* < > <= >= */ | |||||
%left ADDOP2 /* + - */ | |||||
%left MULOP2 /* * / % */ | |||||
%right '!' /* ! */ | |||||
%token <op> EQUOP2 CMPOP2 ADDOP2 MULOP2 | |||||
%token <num> NUMBER | |||||
%type <exp> exp | |||||
%% | |||||
start: exp | |||||
{ | |||||
if ($1 == NULL) | |||||
YYABORT; | |||||
((struct parse_args *) arg)->res = $1; | |||||
} | |||||
; | |||||
exp: exp '?' exp ':' exp | |||||
{ | |||||
$$ = new_exp_3 (qmop, $1, $3, $5); | |||||
} | |||||
| exp '|' exp | |||||
{ | |||||
$$ = new_exp_2 (lor, $1, $3); | |||||
} | |||||
| exp '&' exp | |||||
{ | |||||
$$ = new_exp_2 (land, $1, $3); | |||||
} | |||||
| exp EQUOP2 exp | |||||
{ | |||||
$$ = new_exp_2 ($2, $1, $3); | |||||
} | |||||
| exp CMPOP2 exp | |||||
{ | |||||
$$ = new_exp_2 ($2, $1, $3); | |||||
} | |||||
| exp ADDOP2 exp | |||||
{ | |||||
$$ = new_exp_2 ($2, $1, $3); | |||||
} | |||||
| exp MULOP2 exp | |||||
{ | |||||
$$ = new_exp_2 ($2, $1, $3); | |||||
} | |||||
| '!' exp | |||||
{ | |||||
$$ = new_exp_1 (lnot, $2); | |||||
} | |||||
| 'n' | |||||
{ | |||||
$$ = new_exp_0 (var); | |||||
} | |||||
| NUMBER | |||||
{ | |||||
if (($$ = new_exp_0 (num)) != NULL) | |||||
$$->val.num = $1; | |||||
} | |||||
| '(' exp ')' | |||||
{ | |||||
$$ = $2; | |||||
} | |||||
; | |||||
%% | |||||
void | |||||
internal_function | |||||
FREE_EXPRESSION (struct expression *exp) | |||||
{ | |||||
if (exp == NULL) | |||||
return; | |||||
/* Handle the recursive case. */ | |||||
switch (exp->nargs) | |||||
{ | |||||
case 3: | |||||
FREE_EXPRESSION (exp->val.args[2]); | |||||
/* FALLTHROUGH */ | |||||
case 2: | |||||
FREE_EXPRESSION (exp->val.args[1]); | |||||
/* FALLTHROUGH */ | |||||
case 1: | |||||
FREE_EXPRESSION (exp->val.args[0]); | |||||
/* FALLTHROUGH */ | |||||
default: | |||||
break; | |||||
} | |||||
free (exp); | |||||
} | |||||
static int | |||||
yylex (YYSTYPE *lval, const char **pexp) | |||||
{ | |||||
const char *exp = *pexp; | |||||
int result; | |||||
while (1) | |||||
{ | |||||
if (exp[0] == '\0') | |||||
{ | |||||
*pexp = exp; | |||||
return YYEOF; | |||||
} | |||||
if (exp[0] != ' ' && exp[0] != '\t') | |||||
break; | |||||
++exp; | |||||
} | |||||
result = *exp++; | |||||
switch (result) | |||||
{ | |||||
case '0': case '1': case '2': case '3': case '4': | |||||
case '5': case '6': case '7': case '8': case '9': | |||||
{ | |||||
unsigned long int n = result - '0'; | |||||
while (exp[0] >= '0' && exp[0] <= '9') | |||||
{ | |||||
n *= 10; | |||||
n += exp[0] - '0'; | |||||
++exp; | |||||
} | |||||
lval->num = n; | |||||
result = NUMBER; | |||||
} | |||||
break; | |||||
case '=': | |||||
if (exp[0] == '=') | |||||
{ | |||||
++exp; | |||||
lval->op = equal; | |||||
result = EQUOP2; | |||||
} | |||||
else | |||||
result = YYERRCODE; | |||||
break; | |||||
case '!': | |||||
if (exp[0] == '=') | |||||
{ | |||||
++exp; | |||||
lval->op = not_equal; | |||||
result = EQUOP2; | |||||
} | |||||
break; | |||||
case '&': | |||||
case '|': | |||||
if (exp[0] == result) | |||||
++exp; | |||||
else | |||||
result = YYERRCODE; | |||||
break; | |||||
case '<': | |||||
if (exp[0] == '=') | |||||
{ | |||||
++exp; | |||||
lval->op = less_or_equal; | |||||
} | |||||
else | |||||
lval->op = less_than; | |||||
result = CMPOP2; | |||||
break; | |||||
case '>': | |||||
if (exp[0] == '=') | |||||
{ | |||||
++exp; | |||||
lval->op = greater_or_equal; | |||||
} | |||||
else | |||||
lval->op = greater_than; | |||||
result = CMPOP2; | |||||
break; | |||||
case '*': | |||||
lval->op = mult; | |||||
result = MULOP2; | |||||
break; | |||||
case '/': | |||||
lval->op = divide; | |||||
result = MULOP2; | |||||
break; | |||||
case '%': | |||||
lval->op = module; | |||||
result = MULOP2; | |||||
break; | |||||
case '+': | |||||
lval->op = plus; | |||||
result = ADDOP2; | |||||
break; | |||||
case '-': | |||||
lval->op = minus; | |||||
result = ADDOP2; | |||||
break; | |||||
case 'n': | |||||
case '?': | |||||
case ':': | |||||
case '(': | |||||
case ')': | |||||
/* Nothing, just return the character. */ | |||||
break; | |||||
case ';': | |||||
case '\n': | |||||
case '\0': | |||||
/* Be safe and let the user call this function again. */ | |||||
--exp; | |||||
result = YYEOF; | |||||
break; | |||||
default: | |||||
result = YYERRCODE; | |||||
#if YYDEBUG != 0 | |||||
--exp; | |||||
#endif | |||||
break; | |||||
} | |||||
*pexp = exp; | |||||
return result; | |||||
} | |||||
static void | |||||
yyerror (const char *str) | |||||
{ | |||||
/* Do nothing. We don't print error messages here. */ | |||||
} |
/* Decomposed printf argument list. | |||||
Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
/* Specification. */ | |||||
#include "printf-args.h" | |||||
#ifdef STATIC | |||||
STATIC | |||||
#endif | |||||
int | |||||
printf_fetchargs (va_list args, arguments *a) | |||||
{ | |||||
size_t i; | |||||
argument *ap; | |||||
for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++) | |||||
switch (ap->type) | |||||
{ | |||||
case TYPE_SCHAR: | |||||
ap->a.a_schar = va_arg (args, /*signed char*/ int); | |||||
break; | |||||
case TYPE_UCHAR: | |||||
ap->a.a_uchar = va_arg (args, /*unsigned char*/ int); | |||||
break; | |||||
case TYPE_SHORT: | |||||
ap->a.a_short = va_arg (args, /*short*/ int); | |||||
break; | |||||
case TYPE_USHORT: | |||||
ap->a.a_ushort = va_arg (args, /*unsigned short*/ int); | |||||
break; | |||||
case TYPE_INT: | |||||
ap->a.a_int = va_arg (args, int); | |||||
break; | |||||
case TYPE_UINT: | |||||
ap->a.a_uint = va_arg (args, unsigned int); | |||||
break; | |||||
case TYPE_LONGINT: | |||||
ap->a.a_longint = va_arg (args, long int); | |||||
break; | |||||
case TYPE_ULONGINT: | |||||
ap->a.a_ulongint = va_arg (args, unsigned long int); | |||||
break; | |||||
#ifdef HAVE_LONG_LONG | |||||
case TYPE_LONGLONGINT: | |||||
ap->a.a_longlongint = va_arg (args, long long int); | |||||
break; | |||||
case TYPE_ULONGLONGINT: | |||||
ap->a.a_ulonglongint = va_arg (args, unsigned long long int); | |||||
break; | |||||
#endif | |||||
case TYPE_DOUBLE: | |||||
ap->a.a_double = va_arg (args, double); | |||||
break; | |||||
#ifdef HAVE_LONG_DOUBLE | |||||
case TYPE_LONGDOUBLE: | |||||
ap->a.a_longdouble = va_arg (args, long double); | |||||
break; | |||||
#endif | |||||
case TYPE_CHAR: | |||||
ap->a.a_char = va_arg (args, int); | |||||
break; | |||||
#ifdef HAVE_WINT_T | |||||
case TYPE_WIDE_CHAR: | |||||
ap->a.a_wide_char = va_arg (args, wint_t); | |||||
break; | |||||
#endif | |||||
case TYPE_STRING: | |||||
ap->a.a_string = va_arg (args, const char *); | |||||
break; | |||||
#ifdef HAVE_WCHAR_T | |||||
case TYPE_WIDE_STRING: | |||||
ap->a.a_wide_string = va_arg (args, const wchar_t *); | |||||
break; | |||||
#endif | |||||
case TYPE_POINTER: | |||||
ap->a.a_pointer = va_arg (args, void *); | |||||
break; | |||||
case TYPE_COUNT_SCHAR_POINTER: | |||||
ap->a.a_count_schar_pointer = va_arg (args, signed char *); | |||||
break; | |||||
case TYPE_COUNT_SHORT_POINTER: | |||||
ap->a.a_count_short_pointer = va_arg (args, short *); | |||||
break; | |||||
case TYPE_COUNT_INT_POINTER: | |||||
ap->a.a_count_int_pointer = va_arg (args, int *); | |||||
break; | |||||
case TYPE_COUNT_LONGINT_POINTER: | |||||
ap->a.a_count_longint_pointer = va_arg (args, long int *); | |||||
break; | |||||
#ifdef HAVE_LONG_LONG | |||||
case TYPE_COUNT_LONGLONGINT_POINTER: | |||||
ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); | |||||
break; | |||||
#endif | |||||
default: | |||||
/* Unknown type. */ | |||||
return -1; | |||||
} | |||||
return 0; | |||||
} |
/* Decomposed printf argument list. | |||||
Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef _PRINTF_ARGS_H | |||||
#define _PRINTF_ARGS_H | |||||
/* Get size_t. */ | |||||
#include <stddef.h> | |||||
/* Get wchar_t. */ | |||||
#ifdef HAVE_WCHAR_T | |||||
# include <stddef.h> | |||||
#endif | |||||
/* Get wint_t. */ | |||||
#ifdef HAVE_WINT_T | |||||
# include <wchar.h> | |||||
#endif | |||||
/* Get va_list. */ | |||||
#include <stdarg.h> | |||||
/* Argument types */ | |||||
typedef enum | |||||
{ | |||||
TYPE_NONE, | |||||
TYPE_SCHAR, | |||||
TYPE_UCHAR, | |||||
TYPE_SHORT, | |||||
TYPE_USHORT, | |||||
TYPE_INT, | |||||
TYPE_UINT, | |||||
TYPE_LONGINT, | |||||
TYPE_ULONGINT, | |||||
#ifdef HAVE_LONG_LONG | |||||
TYPE_LONGLONGINT, | |||||
TYPE_ULONGLONGINT, | |||||
#endif | |||||
TYPE_DOUBLE, | |||||
#ifdef HAVE_LONG_DOUBLE | |||||
TYPE_LONGDOUBLE, | |||||
#endif | |||||
TYPE_CHAR, | |||||
#ifdef HAVE_WINT_T | |||||
TYPE_WIDE_CHAR, | |||||
#endif | |||||
TYPE_STRING, | |||||
#ifdef HAVE_WCHAR_T | |||||
TYPE_WIDE_STRING, | |||||
#endif | |||||
TYPE_POINTER, | |||||
TYPE_COUNT_SCHAR_POINTER, | |||||
TYPE_COUNT_SHORT_POINTER, | |||||
TYPE_COUNT_INT_POINTER, | |||||
TYPE_COUNT_LONGINT_POINTER | |||||
#ifdef HAVE_LONG_LONG | |||||
, TYPE_COUNT_LONGLONGINT_POINTER | |||||
#endif | |||||
} arg_type; | |||||
/* Polymorphic argument */ | |||||
typedef struct | |||||
{ | |||||
arg_type type; | |||||
union | |||||
{ | |||||
signed char a_schar; | |||||
unsigned char a_uchar; | |||||
short a_short; | |||||
unsigned short a_ushort; | |||||
int a_int; | |||||
unsigned int a_uint; | |||||
long int a_longint; | |||||
unsigned long int a_ulongint; | |||||
#ifdef HAVE_LONG_LONG | |||||
long long int a_longlongint; | |||||
unsigned long long int a_ulonglongint; | |||||
#endif | |||||
float a_float; | |||||
double a_double; | |||||
#ifdef HAVE_LONG_DOUBLE | |||||
long double a_longdouble; | |||||
#endif | |||||
int a_char; | |||||
#ifdef HAVE_WINT_T | |||||
wint_t a_wide_char; | |||||
#endif | |||||
const char* a_string; | |||||
#ifdef HAVE_WCHAR_T | |||||
const wchar_t* a_wide_string; | |||||
#endif | |||||
void* a_pointer; | |||||
signed char * a_count_schar_pointer; | |||||
short * a_count_short_pointer; | |||||
int * a_count_int_pointer; | |||||
long int * a_count_longint_pointer; | |||||
#ifdef HAVE_LONG_LONG | |||||
long long int * a_count_longlongint_pointer; | |||||
#endif | |||||
} | |||||
a; | |||||
} | |||||
argument; | |||||
typedef struct | |||||
{ | |||||
size_t count; | |||||
argument *arg; | |||||
} | |||||
arguments; | |||||
/* Fetch the arguments, putting them into a. */ | |||||
#ifdef STATIC | |||||
STATIC | |||||
#else | |||||
extern | |||||
#endif | |||||
int printf_fetchargs (va_list args, arguments *a); | |||||
#endif /* _PRINTF_ARGS_H */ |
/* Formatted output to strings. | |||||
Copyright (C) 1999-2000, 2002-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
/* Specification. */ | |||||
#if WIDE_CHAR_VERSION | |||||
# include "wprintf-parse.h" | |||||
#else | |||||
# include "printf-parse.h" | |||||
#endif | |||||
/* Get size_t, NULL. */ | |||||
#include <stddef.h> | |||||
/* Get intmax_t. */ | |||||
#if HAVE_STDINT_H_WITH_UINTMAX | |||||
# include <stdint.h> | |||||
#endif | |||||
#if HAVE_INTTYPES_H_WITH_UINTMAX | |||||
# include <inttypes.h> | |||||
#endif | |||||
/* malloc(), realloc(), free(). */ | |||||
#include <stdlib.h> | |||||
/* Checked size_t computations. */ | |||||
#include "xsize.h" | |||||
#if WIDE_CHAR_VERSION | |||||
# define PRINTF_PARSE wprintf_parse | |||||
# define CHAR_T wchar_t | |||||
# define DIRECTIVE wchar_t_directive | |||||
# define DIRECTIVES wchar_t_directives | |||||
#else | |||||
# define PRINTF_PARSE printf_parse | |||||
# define CHAR_T char | |||||
# define DIRECTIVE char_directive | |||||
# define DIRECTIVES char_directives | |||||
#endif | |||||
#ifdef STATIC | |||||
STATIC | |||||
#endif | |||||
int | |||||
PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a) | |||||
{ | |||||
const CHAR_T *cp = format; /* pointer into format */ | |||||
size_t arg_posn = 0; /* number of regular arguments consumed */ | |||||
size_t d_allocated; /* allocated elements of d->dir */ | |||||
size_t a_allocated; /* allocated elements of a->arg */ | |||||
size_t max_width_length = 0; | |||||
size_t max_precision_length = 0; | |||||
d->count = 0; | |||||
d_allocated = 1; | |||||
d->dir = malloc (d_allocated * sizeof (DIRECTIVE)); | |||||
if (d->dir == NULL) | |||||
/* Out of memory. */ | |||||
return -1; | |||||
a->count = 0; | |||||
a_allocated = 0; | |||||
a->arg = NULL; | |||||
#define REGISTER_ARG(_index_,_type_) \ | |||||
{ \ | |||||
size_t n = (_index_); \ | |||||
if (n >= a_allocated) \ | |||||
{ \ | |||||
size_t memory_size; \ | |||||
argument *memory; \ | |||||
\ | |||||
a_allocated = xtimes (a_allocated, 2); \ | |||||
if (a_allocated <= n) \ | |||||
a_allocated = xsum (n, 1); \ | |||||
memory_size = xtimes (a_allocated, sizeof (argument)); \ | |||||
if (size_overflow_p (memory_size)) \ | |||||
/* Overflow, would lead to out of memory. */ \ | |||||
goto error; \ | |||||
memory = (a->arg \ | |||||
? realloc (a->arg, memory_size) \ | |||||
: malloc (memory_size)); \ | |||||
if (memory == NULL) \ | |||||
/* Out of memory. */ \ | |||||
goto error; \ | |||||
a->arg = memory; \ | |||||
} \ | |||||
while (a->count <= n) \ | |||||
a->arg[a->count++].type = TYPE_NONE; \ | |||||
if (a->arg[n].type == TYPE_NONE) \ | |||||
a->arg[n].type = (_type_); \ | |||||
else if (a->arg[n].type != (_type_)) \ | |||||
/* Ambiguous type for positional argument. */ \ | |||||
goto error; \ | |||||
} | |||||
while (*cp != '\0') | |||||
{ | |||||
CHAR_T c = *cp++; | |||||
if (c == '%') | |||||
{ | |||||
size_t arg_index = ARG_NONE; | |||||
DIRECTIVE *dp = &d->dir[d->count];/* pointer to next directive */ | |||||
/* Initialize the next directive. */ | |||||
dp->dir_start = cp - 1; | |||||
dp->flags = 0; | |||||
dp->width_start = NULL; | |||||
dp->width_end = NULL; | |||||
dp->width_arg_index = ARG_NONE; | |||||
dp->precision_start = NULL; | |||||
dp->precision_end = NULL; | |||||
dp->precision_arg_index = ARG_NONE; | |||||
dp->arg_index = ARG_NONE; | |||||
/* Test for positional argument. */ | |||||
if (*cp >= '0' && *cp <= '9') | |||||
{ | |||||
const CHAR_T *np; | |||||
for (np = cp; *np >= '0' && *np <= '9'; np++) | |||||
; | |||||
if (*np == '$') | |||||
{ | |||||
size_t n = 0; | |||||
for (np = cp; *np >= '0' && *np <= '9'; np++) | |||||
n = xsum (xtimes (n, 10), *np - '0'); | |||||
if (n == 0) | |||||
/* Positional argument 0. */ | |||||
goto error; | |||||
if (size_overflow_p (n)) | |||||
/* n too large, would lead to out of memory later. */ | |||||
goto error; | |||||
arg_index = n - 1; | |||||
cp = np + 1; | |||||
} | |||||
} | |||||
/* Read the flags. */ | |||||
for (;;) | |||||
{ | |||||
if (*cp == '\'') | |||||
{ | |||||
dp->flags |= FLAG_GROUP; | |||||
cp++; | |||||
} | |||||
else if (*cp == '-') | |||||
{ | |||||
dp->flags |= FLAG_LEFT; | |||||
cp++; | |||||
} | |||||
else if (*cp == '+') | |||||
{ | |||||
dp->flags |= FLAG_SHOWSIGN; | |||||
cp++; | |||||
} | |||||
else if (*cp == ' ') | |||||
{ | |||||
dp->flags |= FLAG_SPACE; | |||||
cp++; | |||||
} | |||||
else if (*cp == '#') | |||||
{ | |||||
dp->flags |= FLAG_ALT; | |||||
cp++; | |||||
} | |||||
else if (*cp == '0') | |||||
{ | |||||
dp->flags |= FLAG_ZERO; | |||||
cp++; | |||||
} | |||||
else | |||||
break; | |||||
} | |||||
/* Parse the field width. */ | |||||
if (*cp == '*') | |||||
{ | |||||
dp->width_start = cp; | |||||
cp++; | |||||
dp->width_end = cp; | |||||
if (max_width_length < 1) | |||||
max_width_length = 1; | |||||
/* Test for positional argument. */ | |||||
if (*cp >= '0' && *cp <= '9') | |||||
{ | |||||
const CHAR_T *np; | |||||
for (np = cp; *np >= '0' && *np <= '9'; np++) | |||||
; | |||||
if (*np == '$') | |||||
{ | |||||
size_t n = 0; | |||||
for (np = cp; *np >= '0' && *np <= '9'; np++) | |||||
n = xsum (xtimes (n, 10), *np - '0'); | |||||
if (n == 0) | |||||
/* Positional argument 0. */ | |||||
goto error; | |||||
if (size_overflow_p (n)) | |||||
/* n too large, would lead to out of memory later. */ | |||||
goto error; | |||||
dp->width_arg_index = n - 1; | |||||
cp = np + 1; | |||||
} | |||||
} | |||||
if (dp->width_arg_index == ARG_NONE) | |||||
{ | |||||
dp->width_arg_index = arg_posn++; | |||||
if (dp->width_arg_index == ARG_NONE) | |||||
/* arg_posn wrapped around. */ | |||||
goto error; | |||||
} | |||||
REGISTER_ARG (dp->width_arg_index, TYPE_INT); | |||||
} | |||||
else if (*cp >= '0' && *cp <= '9') | |||||
{ | |||||
size_t width_length; | |||||
dp->width_start = cp; | |||||
for (; *cp >= '0' && *cp <= '9'; cp++) | |||||
; | |||||
dp->width_end = cp; | |||||
width_length = dp->width_end - dp->width_start; | |||||
if (max_width_length < width_length) | |||||
max_width_length = width_length; | |||||
} | |||||
/* Parse the precision. */ | |||||
if (*cp == '.') | |||||
{ | |||||
cp++; | |||||
if (*cp == '*') | |||||
{ | |||||
dp->precision_start = cp - 1; | |||||
cp++; | |||||
dp->precision_end = cp; | |||||
if (max_precision_length < 2) | |||||
max_precision_length = 2; | |||||
/* Test for positional argument. */ | |||||
if (*cp >= '0' && *cp <= '9') | |||||
{ | |||||
const CHAR_T *np; | |||||
for (np = cp; *np >= '0' && *np <= '9'; np++) | |||||
; | |||||
if (*np == '$') | |||||
{ | |||||
size_t n = 0; | |||||
for (np = cp; *np >= '0' && *np <= '9'; np++) | |||||
n = xsum (xtimes (n, 10), *np - '0'); | |||||
if (n == 0) | |||||
/* Positional argument 0. */ | |||||
goto error; | |||||
if (size_overflow_p (n)) | |||||
/* n too large, would lead to out of memory | |||||
later. */ | |||||
goto error; | |||||
dp->precision_arg_index = n - 1; | |||||
cp = np + 1; | |||||
} | |||||
} | |||||
if (dp->precision_arg_index == ARG_NONE) | |||||
{ | |||||
dp->precision_arg_index = arg_posn++; | |||||
if (dp->precision_arg_index == ARG_NONE) | |||||
/* arg_posn wrapped around. */ | |||||
goto error; | |||||
} | |||||
REGISTER_ARG (dp->precision_arg_index, TYPE_INT); | |||||
} | |||||
else | |||||
{ | |||||
size_t precision_length; | |||||
dp->precision_start = cp - 1; | |||||
for (; *cp >= '0' && *cp <= '9'; cp++) | |||||
; | |||||
dp->precision_end = cp; | |||||
precision_length = dp->precision_end - dp->precision_start; | |||||
if (max_precision_length < precision_length) | |||||
max_precision_length = precision_length; | |||||
} | |||||
} | |||||
{ | |||||
arg_type type; | |||||
/* Parse argument type/size specifiers. */ | |||||
{ | |||||
int flags = 0; | |||||
for (;;) | |||||
{ | |||||
if (*cp == 'h') | |||||
{ | |||||
flags |= (1 << (flags & 1)); | |||||
cp++; | |||||
} | |||||
else if (*cp == 'L') | |||||
{ | |||||
flags |= 4; | |||||
cp++; | |||||
} | |||||
else if (*cp == 'l') | |||||
{ | |||||
flags += 8; | |||||
cp++; | |||||
} | |||||
#ifdef HAVE_INTMAX_T | |||||
else if (*cp == 'j') | |||||
{ | |||||
if (sizeof (intmax_t) > sizeof (long)) | |||||
{ | |||||
/* intmax_t = long long */ | |||||
flags += 16; | |||||
} | |||||
else if (sizeof (intmax_t) > sizeof (int)) | |||||
{ | |||||
/* intmax_t = long */ | |||||
flags += 8; | |||||
} | |||||
cp++; | |||||
} | |||||
#endif | |||||
else if (*cp == 'z' || *cp == 'Z') | |||||
{ | |||||
/* 'z' is standardized in ISO C 99, but glibc uses 'Z' | |||||
because the warning facility in gcc-2.95.2 understands | |||||
only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */ | |||||
if (sizeof (size_t) > sizeof (long)) | |||||
{ | |||||
/* size_t = long long */ | |||||
flags += 16; | |||||
} | |||||
else if (sizeof (size_t) > sizeof (int)) | |||||
{ | |||||
/* size_t = long */ | |||||
flags += 8; | |||||
} | |||||
cp++; | |||||
} | |||||
else if (*cp == 't') | |||||
{ | |||||
if (sizeof (ptrdiff_t) > sizeof (long)) | |||||
{ | |||||
/* ptrdiff_t = long long */ | |||||
flags += 16; | |||||
} | |||||
else if (sizeof (ptrdiff_t) > sizeof (int)) | |||||
{ | |||||
/* ptrdiff_t = long */ | |||||
flags += 8; | |||||
} | |||||
cp++; | |||||
} | |||||
else | |||||
break; | |||||
} | |||||
/* Read the conversion character. */ | |||||
c = *cp++; | |||||
switch (c) | |||||
{ | |||||
case 'd': case 'i': | |||||
#ifdef HAVE_LONG_LONG | |||||
if (flags >= 16 || (flags & 4)) | |||||
type = TYPE_LONGLONGINT; | |||||
else | |||||
#endif | |||||
if (flags >= 8) | |||||
type = TYPE_LONGINT; | |||||
else if (flags & 2) | |||||
type = TYPE_SCHAR; | |||||
else if (flags & 1) | |||||
type = TYPE_SHORT; | |||||
else | |||||
type = TYPE_INT; | |||||
break; | |||||
case 'o': case 'u': case 'x': case 'X': | |||||
#ifdef HAVE_LONG_LONG | |||||
if (flags >= 16 || (flags & 4)) | |||||
type = TYPE_ULONGLONGINT; | |||||
else | |||||
#endif | |||||
if (flags >= 8) | |||||
type = TYPE_ULONGINT; | |||||
else if (flags & 2) | |||||
type = TYPE_UCHAR; | |||||
else if (flags & 1) | |||||
type = TYPE_USHORT; | |||||
else | |||||
type = TYPE_UINT; | |||||
break; | |||||
case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': | |||||
case 'a': case 'A': | |||||
#ifdef HAVE_LONG_DOUBLE | |||||
if (flags >= 16 || (flags & 4)) | |||||
type = TYPE_LONGDOUBLE; | |||||
else | |||||
#endif | |||||
type = TYPE_DOUBLE; | |||||
break; | |||||
case 'c': | |||||
if (flags >= 8) | |||||
#ifdef HAVE_WINT_T | |||||
type = TYPE_WIDE_CHAR; | |||||
#else | |||||
goto error; | |||||
#endif | |||||
else | |||||
type = TYPE_CHAR; | |||||
break; | |||||
#ifdef HAVE_WINT_T | |||||
case 'C': | |||||
type = TYPE_WIDE_CHAR; | |||||
c = 'c'; | |||||
break; | |||||
#endif | |||||
case 's': | |||||
if (flags >= 8) | |||||
#ifdef HAVE_WCHAR_T | |||||
type = TYPE_WIDE_STRING; | |||||
#else | |||||
goto error; | |||||
#endif | |||||
else | |||||
type = TYPE_STRING; | |||||
break; | |||||
#ifdef HAVE_WCHAR_T | |||||
case 'S': | |||||
type = TYPE_WIDE_STRING; | |||||
c = 's'; | |||||
break; | |||||
#endif | |||||
case 'p': | |||||
type = TYPE_POINTER; | |||||
break; | |||||
case 'n': | |||||
#ifdef HAVE_LONG_LONG | |||||
if (flags >= 16 || (flags & 4)) | |||||
type = TYPE_COUNT_LONGLONGINT_POINTER; | |||||
else | |||||
#endif | |||||
if (flags >= 8) | |||||
type = TYPE_COUNT_LONGINT_POINTER; | |||||
else if (flags & 2) | |||||
type = TYPE_COUNT_SCHAR_POINTER; | |||||
else if (flags & 1) | |||||
type = TYPE_COUNT_SHORT_POINTER; | |||||
else | |||||
type = TYPE_COUNT_INT_POINTER; | |||||
break; | |||||
case '%': | |||||
type = TYPE_NONE; | |||||
break; | |||||
default: | |||||
/* Unknown conversion character. */ | |||||
goto error; | |||||
} | |||||
} | |||||
if (type != TYPE_NONE) | |||||
{ | |||||
dp->arg_index = arg_index; | |||||
if (dp->arg_index == ARG_NONE) | |||||
{ | |||||
dp->arg_index = arg_posn++; | |||||
if (dp->arg_index == ARG_NONE) | |||||
/* arg_posn wrapped around. */ | |||||
goto error; | |||||
} | |||||
REGISTER_ARG (dp->arg_index, type); | |||||
} | |||||
dp->conversion = c; | |||||
dp->dir_end = cp; | |||||
} | |||||
d->count++; | |||||
if (d->count >= d_allocated) | |||||
{ | |||||
size_t memory_size; | |||||
DIRECTIVE *memory; | |||||
d_allocated = xtimes (d_allocated, 2); | |||||
memory_size = xtimes (d_allocated, sizeof (DIRECTIVE)); | |||||
if (size_overflow_p (memory_size)) | |||||
/* Overflow, would lead to out of memory. */ | |||||
goto error; | |||||
memory = realloc (d->dir, memory_size); | |||||
if (memory == NULL) | |||||
/* Out of memory. */ | |||||
goto error; | |||||
d->dir = memory; | |||||
} | |||||
} | |||||
} | |||||
d->dir[d->count].dir_start = cp; | |||||
d->max_width_length = max_width_length; | |||||
d->max_precision_length = max_precision_length; | |||||
return 0; | |||||
error: | |||||
if (a->arg) | |||||
free (a->arg); | |||||
if (d->dir) | |||||
free (d->dir); | |||||
return -1; | |||||
} | |||||
#undef DIRECTIVES | |||||
#undef DIRECTIVE | |||||
#undef CHAR_T | |||||
#undef PRINTF_PARSE |
/* Parse printf format string. | |||||
Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef _PRINTF_PARSE_H | |||||
#define _PRINTF_PARSE_H | |||||
#include "printf-args.h" | |||||
/* Flags */ | |||||
#define FLAG_GROUP 1 /* ' flag */ | |||||
#define FLAG_LEFT 2 /* - flag */ | |||||
#define FLAG_SHOWSIGN 4 /* + flag */ | |||||
#define FLAG_SPACE 8 /* space flag */ | |||||
#define FLAG_ALT 16 /* # flag */ | |||||
#define FLAG_ZERO 32 | |||||
/* arg_index value indicating that no argument is consumed. */ | |||||
#define ARG_NONE (~(size_t)0) | |||||
/* A parsed directive. */ | |||||
typedef struct | |||||
{ | |||||
const char* dir_start; | |||||
const char* dir_end; | |||||
int flags; | |||||
const char* width_start; | |||||
const char* width_end; | |||||
size_t width_arg_index; | |||||
const char* precision_start; | |||||
const char* precision_end; | |||||
size_t precision_arg_index; | |||||
char conversion; /* d i o u x X f e E g G c s p n U % but not C S */ | |||||
size_t arg_index; | |||||
} | |||||
char_directive; | |||||
/* A parsed format string. */ | |||||
typedef struct | |||||
{ | |||||
size_t count; | |||||
char_directive *dir; | |||||
size_t max_width_length; | |||||
size_t max_precision_length; | |||||
} | |||||
char_directives; | |||||
/* Parses the format string. Fills in the number N of directives, and fills | |||||
in directives[0], ..., directives[N-1], and sets directives[N].dir_start | |||||
to the end of the format string. Also fills in the arg_type fields of the | |||||
arguments and the needed count of arguments. */ | |||||
#ifdef STATIC | |||||
STATIC | |||||
#else | |||||
extern | |||||
#endif | |||||
int printf_parse (const char *format, char_directives *d, arguments *a); | |||||
#endif /* _PRINTF_PARSE_H */ |
/* Formatted output to strings, using POSIX/XSI format strings with positions. | |||||
Copyright (C) 2003 Free Software Foundation, Inc. | |||||
Written by Bruno Haible <bruno@clisp.org>, 2003. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#ifdef __GNUC__ | |||||
# define alloca __builtin_alloca | |||||
# define HAVE_ALLOCA 1 | |||||
#else | |||||
# ifdef _MSC_VER | |||||
# include <malloc.h> | |||||
# define alloca _alloca | |||||
# else | |||||
# if defined HAVE_ALLOCA_H || defined _LIBC | |||||
# include <alloca.h> | |||||
# else | |||||
# ifdef _AIX | |||||
#pragma alloca | |||||
# else | |||||
# ifndef alloca | |||||
char *alloca (); | |||||
# endif | |||||
# endif | |||||
# endif | |||||
# endif | |||||
#endif | |||||
#include <stdio.h> | |||||
#if !HAVE_POSIX_PRINTF | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
/* When building a DLL, we must export some functions. Note that because | |||||
the functions are only defined for binary backward compatibility, we | |||||
don't need to use __declspec(dllimport) in any case. */ | |||||
#if defined _MSC_VER && BUILDING_DLL | |||||
# define DLL_EXPORTED __declspec(dllexport) | |||||
#else | |||||
# define DLL_EXPORTED | |||||
#endif | |||||
#define STATIC static | |||||
/* Define auxiliary functions declared in "printf-args.h". */ | |||||
#include "printf-args.c" | |||||
/* Define auxiliary functions declared in "printf-parse.h". */ | |||||
#include "printf-parse.c" | |||||
/* Define functions declared in "vasnprintf.h". */ | |||||
#define vasnprintf libintl_vasnprintf | |||||
#include "vasnprintf.c" | |||||
#if 0 /* not needed */ | |||||
#define asnprintf libintl_asnprintf | |||||
#include "asnprintf.c" | |||||
#endif | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_vfprintf (FILE *stream, const char *format, va_list args) | |||||
{ | |||||
if (strchr (format, '$') == NULL) | |||||
return vfprintf (stream, format, args); | |||||
else | |||||
{ | |||||
size_t length; | |||||
char *result = libintl_vasnprintf (NULL, &length, format, args); | |||||
int retval = -1; | |||||
if (result != NULL) | |||||
{ | |||||
if (fwrite (result, 1, length, stream) == length) | |||||
retval = length; | |||||
free (result); | |||||
} | |||||
return retval; | |||||
} | |||||
} | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_fprintf (FILE *stream, const char *format, ...) | |||||
{ | |||||
va_list args; | |||||
int retval; | |||||
va_start (args, format); | |||||
retval = libintl_vfprintf (stream, format, args); | |||||
va_end (args); | |||||
return retval; | |||||
} | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_vprintf (const char *format, va_list args) | |||||
{ | |||||
return libintl_vfprintf (stdout, format, args); | |||||
} | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_printf (const char *format, ...) | |||||
{ | |||||
va_list args; | |||||
int retval; | |||||
va_start (args, format); | |||||
retval = libintl_vprintf (format, args); | |||||
va_end (args); | |||||
return retval; | |||||
} | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_vsprintf (char *resultbuf, const char *format, va_list args) | |||||
{ | |||||
if (strchr (format, '$') == NULL) | |||||
return vsprintf (resultbuf, format, args); | |||||
else | |||||
{ | |||||
size_t length = (size_t) ~0 / (4 * sizeof (char)); | |||||
char *result = libintl_vasnprintf (resultbuf, &length, format, args); | |||||
if (result != resultbuf) | |||||
{ | |||||
free (result); | |||||
return -1; | |||||
} | |||||
else | |||||
return length; | |||||
} | |||||
} | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_sprintf (char *resultbuf, const char *format, ...) | |||||
{ | |||||
va_list args; | |||||
int retval; | |||||
va_start (args, format); | |||||
retval = libintl_vsprintf (resultbuf, format, args); | |||||
va_end (args); | |||||
return retval; | |||||
} | |||||
#if HAVE_SNPRINTF | |||||
# if HAVE_DECL__SNPRINTF | |||||
/* Windows. */ | |||||
# define system_vsnprintf _vsnprintf | |||||
# else | |||||
/* Unix. */ | |||||
# define system_vsnprintf vsnprintf | |||||
# endif | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_vsnprintf (char *resultbuf, size_t length, const char *format, va_list args) | |||||
{ | |||||
if (strchr (format, '$') == NULL) | |||||
return system_vsnprintf (resultbuf, length, format, args); | |||||
else | |||||
{ | |||||
size_t maxlength = length; | |||||
char *result = libintl_vasnprintf (resultbuf, &length, format, args); | |||||
if (result != resultbuf) | |||||
{ | |||||
if (maxlength > 0) | |||||
{ | |||||
if (length < maxlength) | |||||
abort (); | |||||
memcpy (resultbuf, result, maxlength - 1); | |||||
resultbuf[maxlength - 1] = '\0'; | |||||
} | |||||
free (result); | |||||
return -1; | |||||
} | |||||
else | |||||
return length; | |||||
} | |||||
} | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_snprintf (char *resultbuf, size_t length, const char *format, ...) | |||||
{ | |||||
va_list args; | |||||
int retval; | |||||
va_start (args, format); | |||||
retval = libintl_vsnprintf (resultbuf, length, format, args); | |||||
va_end (args); | |||||
return retval; | |||||
} | |||||
#endif | |||||
#if HAVE_ASPRINTF | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_vasprintf (char **resultp, const char *format, va_list args) | |||||
{ | |||||
size_t length; | |||||
char *result = libintl_vasnprintf (NULL, &length, format, args); | |||||
if (result == NULL) | |||||
return -1; | |||||
*resultp = result; | |||||
return length; | |||||
} | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_asprintf (char **resultp, const char *format, ...) | |||||
{ | |||||
va_list args; | |||||
int retval; | |||||
va_start (args, format); | |||||
retval = libintl_vasprintf (resultp, format, args); | |||||
va_end (args); | |||||
return retval; | |||||
} | |||||
#endif | |||||
#if HAVE_FWPRINTF | |||||
#include <wchar.h> | |||||
#define WIDE_CHAR_VERSION 1 | |||||
/* Define auxiliary functions declared in "wprintf-parse.h". */ | |||||
#include "printf-parse.c" | |||||
/* Define functions declared in "vasnprintf.h". */ | |||||
#define vasnwprintf libintl_vasnwprintf | |||||
#include "vasnprintf.c" | |||||
#if 0 /* not needed */ | |||||
#define asnwprintf libintl_asnwprintf | |||||
#include "asnprintf.c" | |||||
#endif | |||||
# if HAVE_DECL__SNWPRINTF | |||||
/* Windows. */ | |||||
# define system_vswprintf _vsnwprintf | |||||
# else | |||||
/* Unix. */ | |||||
# define system_vswprintf vswprintf | |||||
# endif | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_vfwprintf (FILE *stream, const wchar_t *format, va_list args) | |||||
{ | |||||
if (wcschr (format, '$') == NULL) | |||||
return vfwprintf (stream, format, args); | |||||
else | |||||
{ | |||||
size_t length; | |||||
wchar_t *result = libintl_vasnwprintf (NULL, &length, format, args); | |||||
int retval = -1; | |||||
if (result != NULL) | |||||
{ | |||||
size_t i; | |||||
for (i = 0; i < length; i++) | |||||
if (fputwc (result[i], stream) == WEOF) | |||||
break; | |||||
if (i == length) | |||||
retval = length; | |||||
free (result); | |||||
} | |||||
return retval; | |||||
} | |||||
} | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_fwprintf (FILE *stream, const wchar_t *format, ...) | |||||
{ | |||||
va_list args; | |||||
int retval; | |||||
va_start (args, format); | |||||
retval = libintl_vfwprintf (stream, format, args); | |||||
va_end (args); | |||||
return retval; | |||||
} | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_vwprintf (const wchar_t *format, va_list args) | |||||
{ | |||||
return libintl_vfwprintf (stdout, format, args); | |||||
} | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_wprintf (const wchar_t *format, ...) | |||||
{ | |||||
va_list args; | |||||
int retval; | |||||
va_start (args, format); | |||||
retval = libintl_vwprintf (format, args); | |||||
va_end (args); | |||||
return retval; | |||||
} | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_vswprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, va_list args) | |||||
{ | |||||
if (wcschr (format, '$') == NULL) | |||||
return system_vswprintf (resultbuf, length, format, args); | |||||
else | |||||
{ | |||||
size_t maxlength = length; | |||||
wchar_t *result = libintl_vasnwprintf (resultbuf, &length, format, args); | |||||
if (result != resultbuf) | |||||
{ | |||||
if (maxlength > 0) | |||||
{ | |||||
if (length < maxlength) | |||||
abort (); | |||||
memcpy (resultbuf, result, (maxlength - 1) * sizeof (wchar_t)); | |||||
resultbuf[maxlength - 1] = 0; | |||||
} | |||||
free (result); | |||||
return -1; | |||||
} | |||||
else | |||||
return length; | |||||
} | |||||
} | |||||
DLL_EXPORTED | |||||
int | |||||
libintl_swprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, ...) | |||||
{ | |||||
va_list args; | |||||
int retval; | |||||
va_start (args, format); | |||||
retval = libintl_vswprintf (resultbuf, length, format, args); | |||||
va_end (args); | |||||
return retval; | |||||
} | |||||
#endif | |||||
#endif |
# Add this package to a list of references stored in a text file. | |||||
# | |||||
# Copyright (C) 2000 Free Software Foundation, Inc. | |||||
# | |||||
# This program is free software; you can redistribute it and/or modify it | |||||
# under the terms of the GNU Library General Public License as published | |||||
# by the Free Software Foundation; either version 2, 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 | |||||
# Library General Public License for more details. | |||||
# | |||||
# You should have received a copy of the GNU Library General Public | |||||
# License along with this program; if not, write to the Free Software | |||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
# USA. | |||||
# | |||||
# Written by Bruno Haible <haible@clisp.cons.org>. | |||||
# | |||||
/^# Packages using this file: / { | |||||
s/# Packages using this file:// | |||||
ta | |||||
:a | |||||
s/ @PACKAGE@ / @PACKAGE@ / | |||||
tb | |||||
s/ $/ @PACKAGE@ / | |||||
:b | |||||
s/^/# Packages using this file:/ | |||||
} |
# Remove this package from a list of references stored in a text file. | |||||
# | |||||
# Copyright (C) 2000 Free Software Foundation, Inc. | |||||
# | |||||
# This program is free software; you can redistribute it and/or modify it | |||||
# under the terms of the GNU Library General Public License as published | |||||
# by the Free Software Foundation; either version 2, 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 | |||||
# Library General Public License for more details. | |||||
# | |||||
# You should have received a copy of the GNU Library General Public | |||||
# License along with this program; if not, write to the Free Software | |||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
# USA. | |||||
# | |||||
# Written by Bruno Haible <haible@clisp.cons.org>. | |||||
# | |||||
/^# Packages using this file: / { | |||||
s/# Packages using this file:// | |||||
s/ @PACKAGE@ / / | |||||
s/^/# Packages using this file:/ | |||||
} |
/* Provide relocatable packages. | |||||
Copyright (C) 2003 Free Software Foundation, Inc. | |||||
Written by Bruno Haible <bruno@clisp.org>, 2003. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
/* Tell glibc's <stdio.h> to provide a prototype for getline(). | |||||
This must come before <config.h> because <config.h> may include | |||||
<features.h>, and once <features.h> has been included, it's too late. */ | |||||
#ifndef _GNU_SOURCE | |||||
# define _GNU_SOURCE 1 | |||||
#endif | |||||
#ifdef HAVE_CONFIG_H | |||||
# include "config.h" | |||||
#endif | |||||
/* Specification. */ | |||||
#include "relocatable.h" | |||||
#if ENABLE_RELOCATABLE | |||||
#include <stddef.h> | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#ifdef NO_XMALLOC | |||||
# define xmalloc malloc | |||||
#else | |||||
# include "xalloc.h" | |||||
#endif | |||||
#if defined _WIN32 || defined __WIN32__ | |||||
# define WIN32_LEAN_AND_MEAN | |||||
# include <windows.h> | |||||
#endif | |||||
#if DEPENDS_ON_LIBCHARSET | |||||
# include <libcharset.h> | |||||
#endif | |||||
#if DEPENDS_ON_LIBICONV && HAVE_ICONV | |||||
# include <iconv.h> | |||||
#endif | |||||
#if DEPENDS_ON_LIBINTL && ENABLE_NLS | |||||
# include <libintl.h> | |||||
#endif | |||||
/* Faked cheap 'bool'. */ | |||||
#undef bool | |||||
#undef false | |||||
#undef true | |||||
#define bool int | |||||
#define false 0 | |||||
#define true 1 | |||||
/* Pathname support. | |||||
ISSLASH(C) tests whether C is a directory separator character. | |||||
IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. | |||||
*/ | |||||
#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ | |||||
/* Win32, OS/2, DOS */ | |||||
# define ISSLASH(C) ((C) == '/' || (C) == '\\') | |||||
# define HAS_DEVICE(P) \ | |||||
((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ | |||||
&& (P)[1] == ':') | |||||
# define IS_PATH_WITH_DIR(P) \ | |||||
(strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) | |||||
# define FILESYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0) | |||||
#else | |||||
/* Unix */ | |||||
# define ISSLASH(C) ((C) == '/') | |||||
# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) | |||||
# define FILESYSTEM_PREFIX_LEN(P) 0 | |||||
#endif | |||||
/* Original installation prefix. */ | |||||
static char *orig_prefix; | |||||
static size_t orig_prefix_len; | |||||
/* Current installation prefix. */ | |||||
static char *curr_prefix; | |||||
static size_t curr_prefix_len; | |||||
/* These prefixes do not end in a slash. Anything that will be concatenated | |||||
to them must start with a slash. */ | |||||
/* Sets the original and the current installation prefix of this module. | |||||
Relocation simply replaces a pathname starting with the original prefix | |||||
by the corresponding pathname with the current prefix instead. Both | |||||
prefixes should be directory names without trailing slash (i.e. use "" | |||||
instead of "/"). */ | |||||
static void | |||||
set_this_relocation_prefix (const char *orig_prefix_arg, | |||||
const char *curr_prefix_arg) | |||||
{ | |||||
if (orig_prefix_arg != NULL && curr_prefix_arg != NULL | |||||
/* Optimization: if orig_prefix and curr_prefix are equal, the | |||||
relocation is a nop. */ | |||||
&& strcmp (orig_prefix_arg, curr_prefix_arg) != 0) | |||||
{ | |||||
/* Duplicate the argument strings. */ | |||||
char *memory; | |||||
orig_prefix_len = strlen (orig_prefix_arg); | |||||
curr_prefix_len = strlen (curr_prefix_arg); | |||||
memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1); | |||||
#ifdef NO_XMALLOC | |||||
if (memory != NULL) | |||||
#endif | |||||
{ | |||||
memcpy (memory, orig_prefix_arg, orig_prefix_len + 1); | |||||
orig_prefix = memory; | |||||
memory += orig_prefix_len + 1; | |||||
memcpy (memory, curr_prefix_arg, curr_prefix_len + 1); | |||||
curr_prefix = memory; | |||||
return; | |||||
} | |||||
} | |||||
orig_prefix = NULL; | |||||
curr_prefix = NULL; | |||||
/* Don't worry about wasted memory here - this function is usually only | |||||
called once. */ | |||||
} | |||||
/* Sets the original and the current installation prefix of the package. | |||||
Relocation simply replaces a pathname starting with the original prefix | |||||
by the corresponding pathname with the current prefix instead. Both | |||||
prefixes should be directory names without trailing slash (i.e. use "" | |||||
instead of "/"). */ | |||||
void | |||||
set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg) | |||||
{ | |||||
set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg); | |||||
/* Now notify all dependent libraries. */ | |||||
#if DEPENDS_ON_LIBCHARSET | |||||
libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); | |||||
#endif | |||||
#if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109 | |||||
libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); | |||||
#endif | |||||
#if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix | |||||
libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); | |||||
#endif | |||||
} | |||||
#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR) | |||||
/* Convenience function: | |||||
Computes the current installation prefix, based on the original | |||||
installation prefix, the original installation directory of a particular | |||||
file, and the current pathname of this file. Returns NULL upon failure. */ | |||||
#ifdef IN_LIBRARY | |||||
#define compute_curr_prefix local_compute_curr_prefix | |||||
static | |||||
#endif | |||||
const char * | |||||
compute_curr_prefix (const char *orig_installprefix, | |||||
const char *orig_installdir, | |||||
const char *curr_pathname) | |||||
{ | |||||
const char *curr_installdir; | |||||
const char *rel_installdir; | |||||
if (curr_pathname == NULL) | |||||
return NULL; | |||||
/* Determine the relative installation directory, relative to the prefix. | |||||
This is simply the difference between orig_installprefix and | |||||
orig_installdir. */ | |||||
if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix)) | |||||
!= 0) | |||||
/* Shouldn't happen - nothing should be installed outside $(prefix). */ | |||||
return NULL; | |||||
rel_installdir = orig_installdir + strlen (orig_installprefix); | |||||
/* Determine the current installation directory. */ | |||||
{ | |||||
const char *p_base = curr_pathname + FILESYSTEM_PREFIX_LEN (curr_pathname); | |||||
const char *p = curr_pathname + strlen (curr_pathname); | |||||
char *q; | |||||
while (p > p_base) | |||||
{ | |||||
p--; | |||||
if (ISSLASH (*p)) | |||||
break; | |||||
} | |||||
q = (char *) xmalloc (p - curr_pathname + 1); | |||||
#ifdef NO_XMALLOC | |||||
if (q == NULL) | |||||
return NULL; | |||||
#endif | |||||
memcpy (q, curr_pathname, p - curr_pathname); | |||||
q[p - curr_pathname] = '\0'; | |||||
curr_installdir = q; | |||||
} | |||||
/* Compute the current installation prefix by removing the trailing | |||||
rel_installdir from it. */ | |||||
{ | |||||
const char *rp = rel_installdir + strlen (rel_installdir); | |||||
const char *cp = curr_installdir + strlen (curr_installdir); | |||||
const char *cp_base = | |||||
curr_installdir + FILESYSTEM_PREFIX_LEN (curr_installdir); | |||||
while (rp > rel_installdir && cp > cp_base) | |||||
{ | |||||
bool same = false; | |||||
const char *rpi = rp; | |||||
const char *cpi = cp; | |||||
while (rpi > rel_installdir && cpi > cp_base) | |||||
{ | |||||
rpi--; | |||||
cpi--; | |||||
if (ISSLASH (*rpi) || ISSLASH (*cpi)) | |||||
{ | |||||
if (ISSLASH (*rpi) && ISSLASH (*cpi)) | |||||
same = true; | |||||
break; | |||||
} | |||||
#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ | |||||
/* Win32, OS/2, DOS - case insignificant filesystem */ | |||||
if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi) | |||||
!= (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi)) | |||||
break; | |||||
#else | |||||
if (*rpi != *cpi) | |||||
break; | |||||
#endif | |||||
} | |||||
if (!same) | |||||
break; | |||||
/* The last pathname component was the same. opi and cpi now point | |||||
to the slash before it. */ | |||||
rp = rpi; | |||||
cp = cpi; | |||||
} | |||||
if (rp > rel_installdir) | |||||
/* Unexpected: The curr_installdir does not end with rel_installdir. */ | |||||
return NULL; | |||||
{ | |||||
size_t curr_prefix_len = cp - curr_installdir; | |||||
char *curr_prefix; | |||||
curr_prefix = (char *) xmalloc (curr_prefix_len + 1); | |||||
#ifdef NO_XMALLOC | |||||
if (curr_prefix == NULL) | |||||
return NULL; | |||||
#endif | |||||
memcpy (curr_prefix, curr_installdir, curr_prefix_len); | |||||
curr_prefix[curr_prefix_len] = '\0'; | |||||
return curr_prefix; | |||||
} | |||||
} | |||||
} | |||||
#endif /* !IN_LIBRARY || PIC */ | |||||
#if defined PIC && defined INSTALLDIR | |||||
/* Full pathname of shared library, or NULL. */ | |||||
static char *shared_library_fullname; | |||||
#if defined _WIN32 || defined __WIN32__ | |||||
/* Determine the full pathname of the shared library when it is loaded. */ | |||||
BOOL WINAPI | |||||
DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved) | |||||
{ | |||||
(void) reserved; | |||||
if (event == DLL_PROCESS_ATTACH) | |||||
{ | |||||
/* The DLL is being loaded into an application's address range. */ | |||||
static char location[MAX_PATH]; | |||||
if (!GetModuleFileName (module_handle, location, sizeof (location))) | |||||
/* Shouldn't happen. */ | |||||
return FALSE; | |||||
if (!IS_PATH_WITH_DIR (location)) | |||||
/* Shouldn't happen. */ | |||||
return FALSE; | |||||
shared_library_fullname = strdup (location); | |||||
} | |||||
return TRUE; | |||||
} | |||||
#else /* Unix */ | |||||
static void | |||||
find_shared_library_fullname () | |||||
{ | |||||
#if defined __linux__ && __GLIBC__ >= 2 | |||||
/* Linux has /proc/self/maps. glibc 2 has the getline() function. */ | |||||
FILE *fp; | |||||
/* Open the current process' maps file. It describes one VMA per line. */ | |||||
fp = fopen ("/proc/self/maps", "r"); | |||||
if (fp) | |||||
{ | |||||
unsigned long address = (unsigned long) &find_shared_library_fullname; | |||||
for (;;) | |||||
{ | |||||
unsigned long start, end; | |||||
int c; | |||||
if (fscanf (fp, "%lx-%lx", &start, &end) != 2) | |||||
break; | |||||
if (address >= start && address <= end - 1) | |||||
{ | |||||
/* Found it. Now see if this line contains a filename. */ | |||||
while (c = getc (fp), c != EOF && c != '\n' && c != '/') | |||||
continue; | |||||
if (c == '/') | |||||
{ | |||||
size_t size; | |||||
int len; | |||||
ungetc (c, fp); | |||||
shared_library_fullname = NULL; size = 0; | |||||
len = getline (&shared_library_fullname, &size, fp); | |||||
if (len >= 0) | |||||
{ | |||||
/* Success: filled shared_library_fullname. */ | |||||
if (len > 0 && shared_library_fullname[len - 1] == '\n') | |||||
shared_library_fullname[len - 1] = '\0'; | |||||
} | |||||
} | |||||
break; | |||||
} | |||||
while (c = getc (fp), c != EOF && c != '\n') | |||||
continue; | |||||
} | |||||
fclose (fp); | |||||
} | |||||
#endif | |||||
} | |||||
#endif /* WIN32 / Unix */ | |||||
/* Return the full pathname of the current shared library. | |||||
Return NULL if unknown. | |||||
Guaranteed to work only on Linux and Woe32. */ | |||||
static char * | |||||
get_shared_library_fullname () | |||||
{ | |||||
#if !(defined _WIN32 || defined __WIN32__) | |||||
static bool tried_find_shared_library_fullname; | |||||
if (!tried_find_shared_library_fullname) | |||||
{ | |||||
find_shared_library_fullname (); | |||||
tried_find_shared_library_fullname = true; | |||||
} | |||||
#endif | |||||
return shared_library_fullname; | |||||
} | |||||
#endif /* PIC */ | |||||
/* Returns the pathname, relocated according to the current installation | |||||
directory. */ | |||||
const char * | |||||
relocate (const char *pathname) | |||||
{ | |||||
#if defined PIC && defined INSTALLDIR | |||||
static int initialized; | |||||
/* Initialization code for a shared library. */ | |||||
if (!initialized) | |||||
{ | |||||
/* At this point, orig_prefix and curr_prefix likely have already been | |||||
set through the main program's set_program_name_and_installdir | |||||
function. This is sufficient in the case that the library has | |||||
initially been installed in the same orig_prefix. But we can do | |||||
better, to also cover the cases that 1. it has been installed | |||||
in a different prefix before being moved to orig_prefix and (later) | |||||
to curr_prefix, 2. unlike the program, it has not moved away from | |||||
orig_prefix. */ | |||||
const char *orig_installprefix = INSTALLPREFIX; | |||||
const char *orig_installdir = INSTALLDIR; | |||||
const char *curr_prefix_better; | |||||
curr_prefix_better = | |||||
compute_curr_prefix (orig_installprefix, orig_installdir, | |||||
get_shared_library_fullname ()); | |||||
if (curr_prefix_better == NULL) | |||||
curr_prefix_better = curr_prefix; | |||||
set_relocation_prefix (orig_installprefix, curr_prefix_better); | |||||
initialized = 1; | |||||
} | |||||
#endif | |||||
/* Note: It is not necessary to perform case insensitive comparison here, | |||||
even for DOS-like filesystems, because the pathname argument was | |||||
typically created from the same Makefile variable as orig_prefix came | |||||
from. */ | |||||
if (orig_prefix != NULL && curr_prefix != NULL | |||||
&& strncmp (pathname, orig_prefix, orig_prefix_len) == 0) | |||||
{ | |||||
if (pathname[orig_prefix_len] == '\0') | |||||
/* pathname equals orig_prefix. */ | |||||
return curr_prefix; | |||||
if (ISSLASH (pathname[orig_prefix_len])) | |||||
{ | |||||
/* pathname starts with orig_prefix. */ | |||||
const char *pathname_tail = &pathname[orig_prefix_len]; | |||||
char *result = | |||||
(char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1); | |||||
#ifdef NO_XMALLOC | |||||
if (result != NULL) | |||||
#endif | |||||
{ | |||||
memcpy (result, curr_prefix, curr_prefix_len); | |||||
strcpy (result + curr_prefix_len, pathname_tail); | |||||
return result; | |||||
} | |||||
} | |||||
} | |||||
/* Nothing to relocate. */ | |||||
return pathname; | |||||
} | |||||
#endif |
/* Provide relocatable packages. | |||||
Copyright (C) 2003 Free Software Foundation, Inc. | |||||
Written by Bruno Haible <bruno@clisp.org>, 2003. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef _RELOCATABLE_H | |||||
#define _RELOCATABLE_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* This can be enabled through the configure --enable-relocatable option. */ | |||||
#if ENABLE_RELOCATABLE | |||||
/* When building a DLL, we must export some functions. Note that because | |||||
this is a private .h file, we don't need to use __declspec(dllimport) | |||||
in any case. */ | |||||
#if defined _MSC_VER && BUILDING_DLL | |||||
# define RELOCATABLE_DLL_EXPORTED __declspec(dllexport) | |||||
#else | |||||
# define RELOCATABLE_DLL_EXPORTED | |||||
#endif | |||||
/* Sets the original and the current installation prefix of the package. | |||||
Relocation simply replaces a pathname starting with the original prefix | |||||
by the corresponding pathname with the current prefix instead. Both | |||||
prefixes should be directory names without trailing slash (i.e. use "" | |||||
instead of "/"). */ | |||||
extern RELOCATABLE_DLL_EXPORTED void | |||||
set_relocation_prefix (const char *orig_prefix, | |||||
const char *curr_prefix); | |||||
/* Returns the pathname, relocated according to the current installation | |||||
directory. */ | |||||
extern const char * relocate (const char *pathname); | |||||
/* Memory management: relocate() leaks memory, because it has to construct | |||||
a fresh pathname. If this is a problem because your program calls | |||||
relocate() frequently, think about caching the result. */ | |||||
/* Convenience function: | |||||
Computes the current installation prefix, based on the original | |||||
installation prefix, the original installation directory of a particular | |||||
file, and the current pathname of this file. Returns NULL upon failure. */ | |||||
extern const char * compute_curr_prefix (const char *orig_installprefix, | |||||
const char *orig_installdir, | |||||
const char *curr_pathname); | |||||
#else | |||||
/* By default, we use the hardwired pathnames. */ | |||||
#define relocate(pathname) (pathname) | |||||
#endif | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* _RELOCATABLE_H */ |
/* Implementation of the textdomain(3) function. | |||||
Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#ifdef _LIBC | |||||
# include <libintl.h> | |||||
#else | |||||
# include "libgnuintl.h" | |||||
#endif | |||||
#include "gettextP.h" | |||||
#ifdef _LIBC | |||||
/* We have to handle multi-threaded applications. */ | |||||
# include <bits/libc-lock.h> | |||||
#else | |||||
/* Provide dummy implementation if this is outside glibc. */ | |||||
# define __libc_rwlock_define(CLASS, NAME) | |||||
# define __libc_rwlock_wrlock(NAME) | |||||
# define __libc_rwlock_unlock(NAME) | |||||
#endif | |||||
/* The internal variables in the standalone libintl.a must have different | |||||
names than the internal variables in GNU libc, otherwise programs | |||||
using libintl.a cannot be linked statically. */ | |||||
#if !defined _LIBC | |||||
# define _nl_default_default_domain libintl_nl_default_default_domain | |||||
# define _nl_current_default_domain libintl_nl_current_default_domain | |||||
#endif | |||||
/* @@ end of prolog @@ */ | |||||
/* Name of the default text domain. */ | |||||
extern const char _nl_default_default_domain[] attribute_hidden; | |||||
/* Default text domain in which entries for gettext(3) are to be found. */ | |||||
extern const char *_nl_current_default_domain attribute_hidden; | |||||
/* Names for the libintl functions are a problem. They must not clash | |||||
with existing names and they should follow ANSI C. But this source | |||||
code is also used in GNU C Library where the names have a __ | |||||
prefix. So we have to make a difference here. */ | |||||
#ifdef _LIBC | |||||
# define TEXTDOMAIN __textdomain | |||||
# ifndef strdup | |||||
# define strdup(str) __strdup (str) | |||||
# endif | |||||
#else | |||||
# define TEXTDOMAIN libintl_textdomain | |||||
#endif | |||||
/* Lock variable to protect the global data in the gettext implementation. */ | |||||
__libc_rwlock_define (extern, _nl_state_lock attribute_hidden) | |||||
/* Set the current default message catalog to DOMAINNAME. | |||||
If DOMAINNAME is null, return the current default. | |||||
If DOMAINNAME is "", reset to the default of "messages". */ | |||||
char * | |||||
TEXTDOMAIN (const char *domainname) | |||||
{ | |||||
char *new_domain; | |||||
char *old_domain; | |||||
/* A NULL pointer requests the current setting. */ | |||||
if (domainname == NULL) | |||||
return (char *) _nl_current_default_domain; | |||||
__libc_rwlock_wrlock (_nl_state_lock); | |||||
old_domain = (char *) _nl_current_default_domain; | |||||
/* If domain name is the null string set to default domain "messages". */ | |||||
if (domainname[0] == '\0' | |||||
|| strcmp (domainname, _nl_default_default_domain) == 0) | |||||
{ | |||||
_nl_current_default_domain = _nl_default_default_domain; | |||||
new_domain = (char *) _nl_current_default_domain; | |||||
} | |||||
else if (strcmp (domainname, old_domain) == 0) | |||||
/* This can happen and people will use it to signal that some | |||||
environment variable changed. */ | |||||
new_domain = old_domain; | |||||
else | |||||
{ | |||||
/* If the following malloc fails `_nl_current_default_domain' | |||||
will be NULL. This value will be returned and so signals we | |||||
are out of core. */ | |||||
#if defined _LIBC || defined HAVE_STRDUP | |||||
new_domain = strdup (domainname); | |||||
#else | |||||
size_t len = strlen (domainname) + 1; | |||||
new_domain = (char *) malloc (len); | |||||
if (new_domain != NULL) | |||||
memcpy (new_domain, domainname, len); | |||||
#endif | |||||
if (new_domain != NULL) | |||||
_nl_current_default_domain = new_domain; | |||||
} | |||||
/* We use this possibility to signal a change of the loaded catalogs | |||||
since this is most likely the case and there is no other easy we | |||||
to do it. Do it only when the call was successful. */ | |||||
if (new_domain != NULL) | |||||
{ | |||||
++_nl_msg_cat_cntr; | |||||
if (old_domain != new_domain && old_domain != _nl_default_default_domain) | |||||
free (old_domain); | |||||
} | |||||
__libc_rwlock_unlock (_nl_state_lock); | |||||
return new_domain; | |||||
} | |||||
#ifdef _LIBC | |||||
/* Alias for function name in GNU C Library. */ | |||||
weak_alias (__textdomain, textdomain); | |||||
#endif |
/* vsprintf with automatic memory allocation. | |||||
Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
/* Tell glibc's <stdio.h> to provide a prototype for snprintf(). | |||||
This must come before <config.h> because <config.h> may include | |||||
<features.h>, and once <features.h> has been included, it's too late. */ | |||||
#ifndef _GNU_SOURCE | |||||
# define _GNU_SOURCE 1 | |||||
#endif | |||||
#ifdef HAVE_CONFIG_H | |||||
# include <config.h> | |||||
#endif | |||||
#ifndef IN_LIBINTL | |||||
# include <alloca.h> | |||||
#endif | |||||
/* Specification. */ | |||||
#if WIDE_CHAR_VERSION | |||||
# include "vasnwprintf.h" | |||||
#else | |||||
# include "vasnprintf.h" | |||||
#endif | |||||
#include <stdio.h> /* snprintf(), sprintf() */ | |||||
#include <stdlib.h> /* abort(), malloc(), realloc(), free() */ | |||||
#include <string.h> /* memcpy(), strlen() */ | |||||
#include <errno.h> /* errno */ | |||||
#include <limits.h> /* CHAR_BIT */ | |||||
#include <float.h> /* DBL_MAX_EXP, LDBL_MAX_EXP */ | |||||
#if WIDE_CHAR_VERSION | |||||
# include "wprintf-parse.h" | |||||
#else | |||||
# include "printf-parse.h" | |||||
#endif | |||||
/* Checked size_t computations. */ | |||||
#include "xsize.h" | |||||
#ifdef HAVE_WCHAR_T | |||||
# ifdef HAVE_WCSLEN | |||||
# define local_wcslen wcslen | |||||
# else | |||||
/* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid | |||||
a dependency towards this library, here is a local substitute. | |||||
Define this substitute only once, even if this file is included | |||||
twice in the same compilation unit. */ | |||||
# ifndef local_wcslen_defined | |||||
# define local_wcslen_defined 1 | |||||
static size_t | |||||
local_wcslen (const wchar_t *s) | |||||
{ | |||||
const wchar_t *ptr; | |||||
for (ptr = s; *ptr != (wchar_t) 0; ptr++) | |||||
; | |||||
return ptr - s; | |||||
} | |||||
# endif | |||||
# endif | |||||
#endif | |||||
#if WIDE_CHAR_VERSION | |||||
# define VASNPRINTF vasnwprintf | |||||
# define CHAR_T wchar_t | |||||
# define DIRECTIVE wchar_t_directive | |||||
# define DIRECTIVES wchar_t_directives | |||||
# define PRINTF_PARSE wprintf_parse | |||||
# define USE_SNPRINTF 1 | |||||
# if HAVE_DECL__SNWPRINTF | |||||
/* On Windows, the function swprintf() has a different signature than | |||||
on Unix; we use the _snwprintf() function instead. */ | |||||
# define SNPRINTF _snwprintf | |||||
# else | |||||
/* Unix. */ | |||||
# define SNPRINTF swprintf | |||||
# endif | |||||
#else | |||||
# define VASNPRINTF vasnprintf | |||||
# define CHAR_T char | |||||
# define DIRECTIVE char_directive | |||||
# define DIRECTIVES char_directives | |||||
# define PRINTF_PARSE printf_parse | |||||
# define USE_SNPRINTF (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) | |||||
# if HAVE_DECL__SNPRINTF | |||||
/* Windows. */ | |||||
# define SNPRINTF _snprintf | |||||
# else | |||||
/* Unix. */ | |||||
# define SNPRINTF snprintf | |||||
# endif | |||||
#endif | |||||
CHAR_T * | |||||
VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list args) | |||||
{ | |||||
DIRECTIVES d; | |||||
arguments a; | |||||
if (PRINTF_PARSE (format, &d, &a) < 0) | |||||
{ | |||||
errno = EINVAL; | |||||
return NULL; | |||||
} | |||||
#define CLEANUP() \ | |||||
free (d.dir); \ | |||||
if (a.arg) \ | |||||
free (a.arg); | |||||
if (printf_fetchargs (args, &a) < 0) | |||||
{ | |||||
CLEANUP (); | |||||
errno = EINVAL; | |||||
return NULL; | |||||
} | |||||
{ | |||||
size_t buf_neededlength; | |||||
CHAR_T *buf; | |||||
CHAR_T *buf_malloced; | |||||
const CHAR_T *cp; | |||||
size_t i; | |||||
DIRECTIVE *dp; | |||||
/* Output string accumulator. */ | |||||
CHAR_T *result; | |||||
size_t allocated; | |||||
size_t length; | |||||
/* Allocate a small buffer that will hold a directive passed to | |||||
sprintf or snprintf. */ | |||||
buf_neededlength = | |||||
xsum4 (7, d.max_width_length, d.max_precision_length, 6); | |||||
#if HAVE_ALLOCA | |||||
if (buf_neededlength < 4000 / sizeof (CHAR_T)) | |||||
{ | |||||
buf = (CHAR_T *) alloca (buf_neededlength * sizeof (CHAR_T)); | |||||
buf_malloced = NULL; | |||||
} | |||||
else | |||||
#endif | |||||
{ | |||||
size_t buf_memsize = xtimes (buf_neededlength, sizeof (CHAR_T)); | |||||
if (size_overflow_p (buf_memsize)) | |||||
goto out_of_memory_1; | |||||
buf = (CHAR_T *) malloc (buf_memsize); | |||||
if (buf == NULL) | |||||
goto out_of_memory_1; | |||||
buf_malloced = buf; | |||||
} | |||||
if (resultbuf != NULL) | |||||
{ | |||||
result = resultbuf; | |||||
allocated = *lengthp; | |||||
} | |||||
else | |||||
{ | |||||
result = NULL; | |||||
allocated = 0; | |||||
} | |||||
length = 0; | |||||
/* Invariants: | |||||
result is either == resultbuf or == NULL or malloc-allocated. | |||||
If length > 0, then result != NULL. */ | |||||
/* Ensures that allocated >= needed. Aborts through a jump to | |||||
out_of_memory if needed is SIZE_MAX or otherwise too big. */ | |||||
#define ENSURE_ALLOCATION(needed) \ | |||||
if ((needed) > allocated) \ | |||||
{ \ | |||||
size_t memory_size; \ | |||||
CHAR_T *memory; \ | |||||
\ | |||||
allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \ | |||||
if ((needed) > allocated) \ | |||||
allocated = (needed); \ | |||||
memory_size = xtimes (allocated, sizeof (CHAR_T)); \ | |||||
if (size_overflow_p (memory_size)) \ | |||||
goto out_of_memory; \ | |||||
if (result == resultbuf || result == NULL) \ | |||||
memory = (CHAR_T *) malloc (memory_size); \ | |||||
else \ | |||||
memory = (CHAR_T *) realloc (result, memory_size); \ | |||||
if (memory == NULL) \ | |||||
goto out_of_memory; \ | |||||
if (result == resultbuf && length > 0) \ | |||||
memcpy (memory, result, length * sizeof (CHAR_T)); \ | |||||
result = memory; \ | |||||
} | |||||
for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++) | |||||
{ | |||||
if (cp != dp->dir_start) | |||||
{ | |||||
size_t n = dp->dir_start - cp; | |||||
size_t augmented_length = xsum (length, n); | |||||
ENSURE_ALLOCATION (augmented_length); | |||||
memcpy (result + length, cp, n * sizeof (CHAR_T)); | |||||
length = augmented_length; | |||||
} | |||||
if (i == d.count) | |||||
break; | |||||
/* Execute a single directive. */ | |||||
if (dp->conversion == '%') | |||||
{ | |||||
size_t augmented_length; | |||||
if (!(dp->arg_index == ARG_NONE)) | |||||
abort (); | |||||
augmented_length = xsum (length, 1); | |||||
ENSURE_ALLOCATION (augmented_length); | |||||
result[length] = '%'; | |||||
length = augmented_length; | |||||
} | |||||
else | |||||
{ | |||||
if (!(dp->arg_index != ARG_NONE)) | |||||
abort (); | |||||
if (dp->conversion == 'n') | |||||
{ | |||||
switch (a.arg[dp->arg_index].type) | |||||
{ | |||||
case TYPE_COUNT_SCHAR_POINTER: | |||||
*a.arg[dp->arg_index].a.a_count_schar_pointer = length; | |||||
break; | |||||
case TYPE_COUNT_SHORT_POINTER: | |||||
*a.arg[dp->arg_index].a.a_count_short_pointer = length; | |||||
break; | |||||
case TYPE_COUNT_INT_POINTER: | |||||
*a.arg[dp->arg_index].a.a_count_int_pointer = length; | |||||
break; | |||||
case TYPE_COUNT_LONGINT_POINTER: | |||||
*a.arg[dp->arg_index].a.a_count_longint_pointer = length; | |||||
break; | |||||
#ifdef HAVE_LONG_LONG | |||||
case TYPE_COUNT_LONGLONGINT_POINTER: | |||||
*a.arg[dp->arg_index].a.a_count_longlongint_pointer = length; | |||||
break; | |||||
#endif | |||||
default: | |||||
abort (); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
arg_type type = a.arg[dp->arg_index].type; | |||||
CHAR_T *p; | |||||
unsigned int prefix_count; | |||||
int prefixes[2]; | |||||
#if !USE_SNPRINTF | |||||
size_t tmp_length; | |||||
CHAR_T tmpbuf[700]; | |||||
CHAR_T *tmp; | |||||
/* Allocate a temporary buffer of sufficient size for calling | |||||
sprintf. */ | |||||
{ | |||||
size_t width; | |||||
size_t precision; | |||||
width = 0; | |||||
if (dp->width_start != dp->width_end) | |||||
{ | |||||
if (dp->width_arg_index != ARG_NONE) | |||||
{ | |||||
int arg; | |||||
if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) | |||||
abort (); | |||||
arg = a.arg[dp->width_arg_index].a.a_int; | |||||
width = (arg < 0 ? (unsigned int) (-arg) : arg); | |||||
} | |||||
else | |||||
{ | |||||
const CHAR_T *digitp = dp->width_start; | |||||
do | |||||
width = xsum (xtimes (width, 10), *digitp++ - '0'); | |||||
while (digitp != dp->width_end); | |||||
} | |||||
} | |||||
precision = 6; | |||||
if (dp->precision_start != dp->precision_end) | |||||
{ | |||||
if (dp->precision_arg_index != ARG_NONE) | |||||
{ | |||||
int arg; | |||||
if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) | |||||
abort (); | |||||
arg = a.arg[dp->precision_arg_index].a.a_int; | |||||
precision = (arg < 0 ? 0 : arg); | |||||
} | |||||
else | |||||
{ | |||||
const CHAR_T *digitp = dp->precision_start + 1; | |||||
precision = 0; | |||||
do | |||||
precision = xsum (xtimes (precision, 10), *digitp++ - '0'); | |||||
while (digitp != dp->precision_end); | |||||
} | |||||
} | |||||
switch (dp->conversion) | |||||
{ | |||||
case 'd': case 'i': case 'u': | |||||
# ifdef HAVE_LONG_LONG | |||||
if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) | |||||
tmp_length = | |||||
(unsigned int) (sizeof (unsigned long long) * CHAR_BIT | |||||
* 0.30103 /* binary -> decimal */ | |||||
* 2 /* estimate for FLAG_GROUP */ | |||||
) | |||||
+ 1 /* turn floor into ceil */ | |||||
+ 1; /* account for leading sign */ | |||||
else | |||||
# endif | |||||
if (type == TYPE_LONGINT || type == TYPE_ULONGINT) | |||||
tmp_length = | |||||
(unsigned int) (sizeof (unsigned long) * CHAR_BIT | |||||
* 0.30103 /* binary -> decimal */ | |||||
* 2 /* estimate for FLAG_GROUP */ | |||||
) | |||||
+ 1 /* turn floor into ceil */ | |||||
+ 1; /* account for leading sign */ | |||||
else | |||||
tmp_length = | |||||
(unsigned int) (sizeof (unsigned int) * CHAR_BIT | |||||
* 0.30103 /* binary -> decimal */ | |||||
* 2 /* estimate for FLAG_GROUP */ | |||||
) | |||||
+ 1 /* turn floor into ceil */ | |||||
+ 1; /* account for leading sign */ | |||||
break; | |||||
case 'o': | |||||
# ifdef HAVE_LONG_LONG | |||||
if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) | |||||
tmp_length = | |||||
(unsigned int) (sizeof (unsigned long long) * CHAR_BIT | |||||
* 0.333334 /* binary -> octal */ | |||||
) | |||||
+ 1 /* turn floor into ceil */ | |||||
+ 1; /* account for leading sign */ | |||||
else | |||||
# endif | |||||
if (type == TYPE_LONGINT || type == TYPE_ULONGINT) | |||||
tmp_length = | |||||
(unsigned int) (sizeof (unsigned long) * CHAR_BIT | |||||
* 0.333334 /* binary -> octal */ | |||||
) | |||||
+ 1 /* turn floor into ceil */ | |||||
+ 1; /* account for leading sign */ | |||||
else | |||||
tmp_length = | |||||
(unsigned int) (sizeof (unsigned int) * CHAR_BIT | |||||
* 0.333334 /* binary -> octal */ | |||||
) | |||||
+ 1 /* turn floor into ceil */ | |||||
+ 1; /* account for leading sign */ | |||||
break; | |||||
case 'x': case 'X': | |||||
# ifdef HAVE_LONG_LONG | |||||
if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) | |||||
tmp_length = | |||||
(unsigned int) (sizeof (unsigned long long) * CHAR_BIT | |||||
* 0.25 /* binary -> hexadecimal */ | |||||
) | |||||
+ 1 /* turn floor into ceil */ | |||||
+ 2; /* account for leading sign or alternate form */ | |||||
else | |||||
# endif | |||||
if (type == TYPE_LONGINT || type == TYPE_ULONGINT) | |||||
tmp_length = | |||||
(unsigned int) (sizeof (unsigned long) * CHAR_BIT | |||||
* 0.25 /* binary -> hexadecimal */ | |||||
) | |||||
+ 1 /* turn floor into ceil */ | |||||
+ 2; /* account for leading sign or alternate form */ | |||||
else | |||||
tmp_length = | |||||
(unsigned int) (sizeof (unsigned int) * CHAR_BIT | |||||
* 0.25 /* binary -> hexadecimal */ | |||||
) | |||||
+ 1 /* turn floor into ceil */ | |||||
+ 2; /* account for leading sign or alternate form */ | |||||
break; | |||||
case 'f': case 'F': | |||||
# ifdef HAVE_LONG_DOUBLE | |||||
if (type == TYPE_LONGDOUBLE) | |||||
tmp_length = | |||||
(unsigned int) (LDBL_MAX_EXP | |||||
* 0.30103 /* binary -> decimal */ | |||||
* 2 /* estimate for FLAG_GROUP */ | |||||
) | |||||
+ 1 /* turn floor into ceil */ | |||||
+ 10; /* sign, decimal point etc. */ | |||||
else | |||||
# endif | |||||
tmp_length = | |||||
(unsigned int) (DBL_MAX_EXP | |||||
* 0.30103 /* binary -> decimal */ | |||||
* 2 /* estimate for FLAG_GROUP */ | |||||
) | |||||
+ 1 /* turn floor into ceil */ | |||||
+ 10; /* sign, decimal point etc. */ | |||||
tmp_length = xsum (tmp_length, precision); | |||||
break; | |||||
case 'e': case 'E': case 'g': case 'G': | |||||
case 'a': case 'A': | |||||
tmp_length = | |||||
12; /* sign, decimal point, exponent etc. */ | |||||
tmp_length = xsum (tmp_length, precision); | |||||
break; | |||||
case 'c': | |||||
# if defined HAVE_WINT_T && !WIDE_CHAR_VERSION | |||||
if (type == TYPE_WIDE_CHAR) | |||||
tmp_length = MB_CUR_MAX; | |||||
else | |||||
# endif | |||||
tmp_length = 1; | |||||
break; | |||||
case 's': | |||||
# ifdef HAVE_WCHAR_T | |||||
if (type == TYPE_WIDE_STRING) | |||||
{ | |||||
tmp_length = | |||||
local_wcslen (a.arg[dp->arg_index].a.a_wide_string); | |||||
# if !WIDE_CHAR_VERSION | |||||
tmp_length = xtimes (tmp_length, MB_CUR_MAX); | |||||
# endif | |||||
} | |||||
else | |||||
# endif | |||||
tmp_length = strlen (a.arg[dp->arg_index].a.a_string); | |||||
break; | |||||
case 'p': | |||||
tmp_length = | |||||
(unsigned int) (sizeof (void *) * CHAR_BIT | |||||
* 0.25 /* binary -> hexadecimal */ | |||||
) | |||||
+ 1 /* turn floor into ceil */ | |||||
+ 2; /* account for leading 0x */ | |||||
break; | |||||
default: | |||||
abort (); | |||||
} | |||||
if (tmp_length < width) | |||||
tmp_length = width; | |||||
tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ | |||||
} | |||||
if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T)) | |||||
tmp = tmpbuf; | |||||
else | |||||
{ | |||||
size_t tmp_memsize = xtimes (tmp_length, sizeof (CHAR_T)); | |||||
if (size_overflow_p (tmp_memsize)) | |||||
/* Overflow, would lead to out of memory. */ | |||||
goto out_of_memory; | |||||
tmp = (CHAR_T *) malloc (tmp_memsize); | |||||
if (tmp == NULL) | |||||
/* Out of memory. */ | |||||
goto out_of_memory; | |||||
} | |||||
#endif | |||||
/* Construct the format string for calling snprintf or | |||||
sprintf. */ | |||||
p = buf; | |||||
*p++ = '%'; | |||||
if (dp->flags & FLAG_GROUP) | |||||
*p++ = '\''; | |||||
if (dp->flags & FLAG_LEFT) | |||||
*p++ = '-'; | |||||
if (dp->flags & FLAG_SHOWSIGN) | |||||
*p++ = '+'; | |||||
if (dp->flags & FLAG_SPACE) | |||||
*p++ = ' '; | |||||
if (dp->flags & FLAG_ALT) | |||||
*p++ = '#'; | |||||
if (dp->flags & FLAG_ZERO) | |||||
*p++ = '0'; | |||||
if (dp->width_start != dp->width_end) | |||||
{ | |||||
size_t n = dp->width_end - dp->width_start; | |||||
memcpy (p, dp->width_start, n * sizeof (CHAR_T)); | |||||
p += n; | |||||
} | |||||
if (dp->precision_start != dp->precision_end) | |||||
{ | |||||
size_t n = dp->precision_end - dp->precision_start; | |||||
memcpy (p, dp->precision_start, n * sizeof (CHAR_T)); | |||||
p += n; | |||||
} | |||||
switch (type) | |||||
{ | |||||
#ifdef HAVE_LONG_LONG | |||||
case TYPE_LONGLONGINT: | |||||
case TYPE_ULONGLONGINT: | |||||
*p++ = 'l'; | |||||
/*FALLTHROUGH*/ | |||||
#endif | |||||
case TYPE_LONGINT: | |||||
case TYPE_ULONGINT: | |||||
#ifdef HAVE_WINT_T | |||||
case TYPE_WIDE_CHAR: | |||||
#endif | |||||
#ifdef HAVE_WCHAR_T | |||||
case TYPE_WIDE_STRING: | |||||
#endif | |||||
*p++ = 'l'; | |||||
break; | |||||
#ifdef HAVE_LONG_DOUBLE | |||||
case TYPE_LONGDOUBLE: | |||||
*p++ = 'L'; | |||||
break; | |||||
#endif | |||||
default: | |||||
break; | |||||
} | |||||
*p = dp->conversion; | |||||
#if USE_SNPRINTF | |||||
p[1] = '%'; | |||||
p[2] = 'n'; | |||||
p[3] = '\0'; | |||||
#else | |||||
p[1] = '\0'; | |||||
#endif | |||||
/* Construct the arguments for calling snprintf or sprintf. */ | |||||
prefix_count = 0; | |||||
if (dp->width_arg_index != ARG_NONE) | |||||
{ | |||||
if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) | |||||
abort (); | |||||
prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int; | |||||
} | |||||
if (dp->precision_arg_index != ARG_NONE) | |||||
{ | |||||
if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) | |||||
abort (); | |||||
prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int; | |||||
} | |||||
#if USE_SNPRINTF | |||||
/* Prepare checking whether snprintf returns the count | |||||
via %n. */ | |||||
ENSURE_ALLOCATION (xsum (length, 1)); | |||||
result[length] = '\0'; | |||||
#endif | |||||
for (;;) | |||||
{ | |||||
size_t maxlen; | |||||
int count; | |||||
int retcount; | |||||
maxlen = allocated - length; | |||||
count = -1; | |||||
retcount = 0; | |||||
#if USE_SNPRINTF | |||||
# define SNPRINTF_BUF(arg) \ | |||||
switch (prefix_count) \ | |||||
{ \ | |||||
case 0: \ | |||||
retcount = SNPRINTF (result + length, maxlen, buf, \ | |||||
arg, &count); \ | |||||
break; \ | |||||
case 1: \ | |||||
retcount = SNPRINTF (result + length, maxlen, buf, \ | |||||
prefixes[0], arg, &count); \ | |||||
break; \ | |||||
case 2: \ | |||||
retcount = SNPRINTF (result + length, maxlen, buf, \ | |||||
prefixes[0], prefixes[1], arg, \ | |||||
&count); \ | |||||
break; \ | |||||
default: \ | |||||
abort (); \ | |||||
} | |||||
#else | |||||
# define SNPRINTF_BUF(arg) \ | |||||
switch (prefix_count) \ | |||||
{ \ | |||||
case 0: \ | |||||
count = sprintf (tmp, buf, arg); \ | |||||
break; \ | |||||
case 1: \ | |||||
count = sprintf (tmp, buf, prefixes[0], arg); \ | |||||
break; \ | |||||
case 2: \ | |||||
count = sprintf (tmp, buf, prefixes[0], prefixes[1],\ | |||||
arg); \ | |||||
break; \ | |||||
default: \ | |||||
abort (); \ | |||||
} | |||||
#endif | |||||
switch (type) | |||||
{ | |||||
case TYPE_SCHAR: | |||||
{ | |||||
int arg = a.arg[dp->arg_index].a.a_schar; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
case TYPE_UCHAR: | |||||
{ | |||||
unsigned int arg = a.arg[dp->arg_index].a.a_uchar; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
case TYPE_SHORT: | |||||
{ | |||||
int arg = a.arg[dp->arg_index].a.a_short; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
case TYPE_USHORT: | |||||
{ | |||||
unsigned int arg = a.arg[dp->arg_index].a.a_ushort; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
case TYPE_INT: | |||||
{ | |||||
int arg = a.arg[dp->arg_index].a.a_int; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
case TYPE_UINT: | |||||
{ | |||||
unsigned int arg = a.arg[dp->arg_index].a.a_uint; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
case TYPE_LONGINT: | |||||
{ | |||||
long int arg = a.arg[dp->arg_index].a.a_longint; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
case TYPE_ULONGINT: | |||||
{ | |||||
unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
#ifdef HAVE_LONG_LONG | |||||
case TYPE_LONGLONGINT: | |||||
{ | |||||
long long int arg = a.arg[dp->arg_index].a.a_longlongint; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
case TYPE_ULONGLONGINT: | |||||
{ | |||||
unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
#endif | |||||
case TYPE_DOUBLE: | |||||
{ | |||||
double arg = a.arg[dp->arg_index].a.a_double; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
#ifdef HAVE_LONG_DOUBLE | |||||
case TYPE_LONGDOUBLE: | |||||
{ | |||||
long double arg = a.arg[dp->arg_index].a.a_longdouble; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
#endif | |||||
case TYPE_CHAR: | |||||
{ | |||||
int arg = a.arg[dp->arg_index].a.a_char; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
#ifdef HAVE_WINT_T | |||||
case TYPE_WIDE_CHAR: | |||||
{ | |||||
wint_t arg = a.arg[dp->arg_index].a.a_wide_char; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
#endif | |||||
case TYPE_STRING: | |||||
{ | |||||
const char *arg = a.arg[dp->arg_index].a.a_string; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
#ifdef HAVE_WCHAR_T | |||||
case TYPE_WIDE_STRING: | |||||
{ | |||||
const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
#endif | |||||
case TYPE_POINTER: | |||||
{ | |||||
void *arg = a.arg[dp->arg_index].a.a_pointer; | |||||
SNPRINTF_BUF (arg); | |||||
} | |||||
break; | |||||
default: | |||||
abort (); | |||||
} | |||||
#if USE_SNPRINTF | |||||
/* Portability: Not all implementations of snprintf() | |||||
are ISO C 99 compliant. Determine the number of | |||||
bytes that snprintf() has produced or would have | |||||
produced. */ | |||||
if (count >= 0) | |||||
{ | |||||
/* Verify that snprintf() has NUL-terminated its | |||||
result. */ | |||||
if (count < maxlen && result[length + count] != '\0') | |||||
abort (); | |||||
/* Portability hack. */ | |||||
if (retcount > count) | |||||
count = retcount; | |||||
} | |||||
else | |||||
{ | |||||
/* snprintf() doesn't understand the '%n' | |||||
directive. */ | |||||
if (p[1] != '\0') | |||||
{ | |||||
/* Don't use the '%n' directive; instead, look | |||||
at the snprintf() return value. */ | |||||
p[1] = '\0'; | |||||
continue; | |||||
} | |||||
else | |||||
{ | |||||
/* Look at the snprintf() return value. */ | |||||
if (retcount < 0) | |||||
{ | |||||
/* HP-UX 10.20 snprintf() is doubly deficient: | |||||
It doesn't understand the '%n' directive, | |||||
*and* it returns -1 (rather than the length | |||||
that would have been required) when the | |||||
buffer is too small. */ | |||||
size_t bigger_need = | |||||
xsum (xtimes (allocated, 2), 12); | |||||
ENSURE_ALLOCATION (bigger_need); | |||||
continue; | |||||
} | |||||
else | |||||
count = retcount; | |||||
} | |||||
} | |||||
#endif | |||||
/* Attempt to handle failure. */ | |||||
if (count < 0) | |||||
{ | |||||
if (!(result == resultbuf || result == NULL)) | |||||
free (result); | |||||
if (buf_malloced != NULL) | |||||
free (buf_malloced); | |||||
CLEANUP (); | |||||
errno = EINVAL; | |||||
return NULL; | |||||
} | |||||
#if !USE_SNPRINTF | |||||
if (count >= tmp_length) | |||||
/* tmp_length was incorrectly calculated - fix the | |||||
code above! */ | |||||
abort (); | |||||
#endif | |||||
/* Make room for the result. */ | |||||
if (count >= maxlen) | |||||
{ | |||||
/* Need at least count bytes. But allocate | |||||
proportionally, to avoid looping eternally if | |||||
snprintf() reports a too small count. */ | |||||
size_t n = | |||||
xmax (xsum (length, count), xtimes (allocated, 2)); | |||||
ENSURE_ALLOCATION (n); | |||||
#if USE_SNPRINTF | |||||
continue; | |||||
#endif | |||||
} | |||||
#if USE_SNPRINTF | |||||
/* The snprintf() result did fit. */ | |||||
#else | |||||
/* Append the sprintf() result. */ | |||||
memcpy (result + length, tmp, count * sizeof (CHAR_T)); | |||||
if (tmp != tmpbuf) | |||||
free (tmp); | |||||
#endif | |||||
length += count; | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/* Add the final NUL. */ | |||||
ENSURE_ALLOCATION (xsum (length, 1)); | |||||
result[length] = '\0'; | |||||
if (result != resultbuf && length + 1 < allocated) | |||||
{ | |||||
/* Shrink the allocated memory if possible. */ | |||||
CHAR_T *memory; | |||||
memory = (CHAR_T *) realloc (result, (length + 1) * sizeof (CHAR_T)); | |||||
if (memory != NULL) | |||||
result = memory; | |||||
} | |||||
if (buf_malloced != NULL) | |||||
free (buf_malloced); | |||||
CLEANUP (); | |||||
*lengthp = length; | |||||
return result; | |||||
out_of_memory: | |||||
if (!(result == resultbuf || result == NULL)) | |||||
free (result); | |||||
if (buf_malloced != NULL) | |||||
free (buf_malloced); | |||||
out_of_memory_1: | |||||
CLEANUP (); | |||||
errno = ENOMEM; | |||||
return NULL; | |||||
} | |||||
} | |||||
#undef SNPRINTF | |||||
#undef USE_SNPRINTF | |||||
#undef PRINTF_PARSE | |||||
#undef DIRECTIVES | |||||
#undef DIRECTIVE | |||||
#undef CHAR_T | |||||
#undef VASNPRINTF |
/* vsprintf with automatic memory allocation. | |||||
Copyright (C) 2002-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef _VASNPRINTF_H | |||||
#define _VASNPRINTF_H | |||||
/* Get va_list. */ | |||||
#include <stdarg.h> | |||||
/* Get size_t. */ | |||||
#include <stddef.h> | |||||
#ifndef __attribute__ | |||||
/* This feature is available in gcc versions 2.5 and later. */ | |||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ | |||||
# define __attribute__(Spec) /* empty */ | |||||
# endif | |||||
/* The __-protected variants of `format' and `printf' attributes | |||||
are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ | |||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) | |||||
# define __format__ format | |||||
# define __printf__ printf | |||||
# endif | |||||
#endif | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Write formatted output to a string dynamically allocated with malloc(). | |||||
You can pass a preallocated buffer for the result in RESULTBUF and its | |||||
size in *LENGTHP; otherwise you pass RESULTBUF = NULL. | |||||
If successful, return the address of the string (this may be = RESULTBUF | |||||
if no dynamic memory allocation was necessary) and set *LENGTHP to the | |||||
number of resulting bytes, excluding the trailing NUL. Upon error, set | |||||
errno and return NULL. */ | |||||
extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) | |||||
__attribute__ ((__format__ (__printf__, 3, 4))); | |||||
extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args) | |||||
__attribute__ ((__format__ (__printf__, 3, 0))); | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* _VASNPRINTF_H */ |
/* vswprintf with automatic memory allocation. | |||||
Copyright (C) 2002-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef _VASNWPRINTF_H | |||||
#define _VASNWPRINTF_H | |||||
/* Get va_list. */ | |||||
#include <stdarg.h> | |||||
/* Get wchar_t, size_t. */ | |||||
#include <stddef.h> | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Write formatted output to a string dynamically allocated with malloc(). | |||||
You can pass a preallocated buffer for the result in RESULTBUF and its | |||||
size in *LENGTHP; otherwise you pass RESULTBUF = NULL. | |||||
If successful, return the address of the string (this may be = RESULTBUF | |||||
if no dynamic memory allocation was necessary) and set *LENGTHP to the | |||||
number of resulting bytes, excluding the trailing NUL. Upon error, set | |||||
errno and return NULL. */ | |||||
extern wchar_t * asnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, ...); | |||||
extern wchar_t * vasnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, va_list args); | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* _VASNWPRINTF_H */ |
/* Parse printf format string. | |||||
Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef _WPRINTF_PARSE_H | |||||
#define _WPRINTF_PARSE_H | |||||
#include "printf-args.h" | |||||
/* Flags */ | |||||
#define FLAG_GROUP 1 /* ' flag */ | |||||
#define FLAG_LEFT 2 /* - flag */ | |||||
#define FLAG_SHOWSIGN 4 /* + flag */ | |||||
#define FLAG_SPACE 8 /* space flag */ | |||||
#define FLAG_ALT 16 /* # flag */ | |||||
#define FLAG_ZERO 32 | |||||
/* arg_index value indicating that no argument is consumed. */ | |||||
#define ARG_NONE (~(size_t)0) | |||||
/* A parsed directive. */ | |||||
typedef struct | |||||
{ | |||||
const wchar_t* dir_start; | |||||
const wchar_t* dir_end; | |||||
int flags; | |||||
const wchar_t* width_start; | |||||
const wchar_t* width_end; | |||||
size_t width_arg_index; | |||||
const wchar_t* precision_start; | |||||
const wchar_t* precision_end; | |||||
size_t precision_arg_index; | |||||
wchar_t conversion; /* d i o u x X f e E g G c s p n U % but not C S */ | |||||
size_t arg_index; | |||||
} | |||||
wchar_t_directive; | |||||
/* A parsed format string. */ | |||||
typedef struct | |||||
{ | |||||
size_t count; | |||||
wchar_t_directive *dir; | |||||
size_t max_width_length; | |||||
size_t max_precision_length; | |||||
} | |||||
wchar_t_directives; | |||||
/* Parses the format string. Fills in the number N of directives, and fills | |||||
in directives[0], ..., directives[N-1], and sets directives[N].dir_start | |||||
to the end of the format string. Also fills in the arg_type fields of the | |||||
arguments and the needed count of arguments. */ | |||||
#ifdef STATIC | |||||
STATIC | |||||
#else | |||||
extern | |||||
#endif | |||||
int wprintf_parse (const wchar_t *format, wchar_t_directives *d, arguments *a); | |||||
#endif /* _WPRINTF_PARSE_H */ |
/* xsize.h -- Checked size_t computations. | |||||
Copyright (C) 2003 Free Software Foundation, Inc. | |||||
This program is free software; you can redistribute it and/or modify it | |||||
under the terms of the GNU Library General Public License as published | |||||
by the Free Software Foundation; either version 2, 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 | |||||
Library General Public License for more details. | |||||
You should have received a copy of the GNU Library General Public | |||||
License along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
USA. */ | |||||
#ifndef _XSIZE_H | |||||
#define _XSIZE_H | |||||
/* Get size_t. */ | |||||
#include <stddef.h> | |||||
/* Get SIZE_MAX. */ | |||||
#include <limits.h> | |||||
#if HAVE_STDINT_H | |||||
# include <stdint.h> | |||||
#endif | |||||
/* The size of memory objects is often computed through expressions of | |||||
type size_t. Example: | |||||
void* p = malloc (header_size + n * element_size). | |||||
These computations can lead to overflow. When this happens, malloc() | |||||
returns a piece of memory that is way too small, and the program then | |||||
crashes while attempting to fill the memory. | |||||
To avoid this, the functions and macros in this file check for overflow. | |||||
The convention is that SIZE_MAX represents overflow. | |||||
malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc | |||||
implementation that uses mmap --, it's recommended to use size_overflow_p() | |||||
or size_in_bounds_p() before invoking malloc(). | |||||
The example thus becomes: | |||||
size_t size = xsum (header_size, xtimes (n, element_size)); | |||||
void *p = (size_in_bounds_p (size) ? malloc (size) : NULL); | |||||
*/ | |||||
/* Convert an arbitrary value >= 0 to type size_t. */ | |||||
#define xcast_size_t(N) \ | |||||
((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX) | |||||
/* Sum of two sizes, with overflow check. */ | |||||
static inline size_t | |||||
#if __GNUC__ >= 3 | |||||
__attribute__ ((__pure__)) | |||||
#endif | |||||
xsum (size_t size1, size_t size2) | |||||
{ | |||||
size_t sum = size1 + size2; | |||||
return (sum >= size1 ? sum : SIZE_MAX); | |||||
} | |||||
/* Sum of three sizes, with overflow check. */ | |||||
static inline size_t | |||||
#if __GNUC__ >= 3 | |||||
__attribute__ ((__pure__)) | |||||
#endif | |||||
xsum3 (size_t size1, size_t size2, size_t size3) | |||||
{ | |||||
return xsum (xsum (size1, size2), size3); | |||||
} | |||||
/* Sum of four sizes, with overflow check. */ | |||||
static inline size_t | |||||
#if __GNUC__ >= 3 | |||||
__attribute__ ((__pure__)) | |||||
#endif | |||||
xsum4 (size_t size1, size_t size2, size_t size3, size_t size4) | |||||
{ | |||||
return xsum (xsum (xsum (size1, size2), size3), size4); | |||||
} | |||||
/* Maximum of two sizes, with overflow check. */ | |||||
static inline size_t | |||||
#if __GNUC__ >= 3 | |||||
__attribute__ ((__pure__)) | |||||
#endif | |||||
xmax (size_t size1, size_t size2) | |||||
{ | |||||
/* No explicit check is needed here, because for any n: | |||||
max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */ | |||||
return (size1 >= size2 ? size1 : size2); | |||||
} | |||||
/* Multiplication of a count with an element size, with overflow check. | |||||
The count must be >= 0 and the element size must be > 0. | |||||
This is a macro, not an inline function, so that it works correctly even | |||||
when N is of a wider tupe and N > SIZE_MAX. */ | |||||
#define xtimes(N, ELSIZE) \ | |||||
((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX) | |||||
/* Check for overflow. */ | |||||
#define size_overflow_p(SIZE) \ | |||||
((SIZE) == SIZE_MAX) | |||||
/* Check against overflow. */ | |||||
#define size_in_bounds_p(SIZE) \ | |||||
((SIZE) != SIZE_MAX) | |||||
#endif /* _XSIZE_H */ |
#! /bin/sh | |||||
# mkinstalldirs --- make directory hierarchy | |||||
# Author: Noah Friedman <friedman@prep.ai.mit.edu> | |||||
# Created: 1993-05-16 | |||||
# Public domain | |||||
errstatus=0 | |||||
dirmode="" | |||||
usage="\ | |||||
Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." | |||||
# process command line arguments | |||||
while test $# -gt 0 ; do | |||||
case $1 in | |||||
-h | --help | --h*) # -h for help | |||||
echo "$usage" 1>&2 | |||||
exit 0 | |||||
;; | |||||
-m) # -m PERM arg | |||||
shift | |||||
test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } | |||||
dirmode=$1 | |||||
shift | |||||
;; | |||||
--) # stop option processing | |||||
shift | |||||
break | |||||
;; | |||||
-*) # unknown option | |||||
echo "$usage" 1>&2 | |||||
exit 1 | |||||
;; | |||||
*) # first non-opt arg | |||||
break | |||||
;; | |||||
esac | |||||
done | |||||
for file | |||||
do | |||||
if test -d "$file"; then | |||||
shift | |||||
else | |||||
break | |||||
fi | |||||
done | |||||
case $# in | |||||
0) exit 0 ;; | |||||
esac | |||||
case $dirmode in | |||||
'') | |||||
if mkdir -p -- . 2>/dev/null; then | |||||
echo "mkdir -p -- $*" | |||||
exec mkdir -p -- "$@" | |||||
fi | |||||
;; | |||||
*) | |||||
if mkdir -m "$dirmode" -p -- . 2>/dev/null; then | |||||
echo "mkdir -m $dirmode -p -- $*" | |||||
exec mkdir -m "$dirmode" -p -- "$@" | |||||
fi | |||||
;; | |||||
esac | |||||
for file | |||||
do | |||||
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` | |||||
shift | |||||
pathcomp= | |||||
for d | |||||
do | |||||
pathcomp="$pathcomp$d" | |||||
case $pathcomp in | |||||
-*) pathcomp=./$pathcomp ;; | |||||
esac | |||||
if test ! -d "$pathcomp"; then | |||||
echo "mkdir $pathcomp" | |||||
mkdir "$pathcomp" || lasterr=$? | |||||
if test ! -d "$pathcomp"; then | |||||
errstatus=$lasterr | |||||
else | |||||
if test ! -z "$dirmode"; then | |||||
echo "chmod $dirmode $pathcomp" | |||||
lasterr="" | |||||
chmod "$dirmode" "$pathcomp" || lasterr=$? | |||||
if test ! -z "$lasterr"; then | |||||
errstatus=$lasterr | |||||
fi | |||||
fi | |||||
fi | |||||
fi | |||||
pathcomp="$pathcomp/" | |||||
done | |||||
done | |||||
exit $errstatus | |||||
# Local Variables: | |||||
# mode: shell-script | |||||
# sh-indentation: 2 | |||||
# End: | |||||
# mkinstalldirs ends here |
sv |
# Makefile for PO directory in any package using GNU gettext. | |||||
# Copyright (C) 1995-1997, 2000-2004 by Ulrich Drepper <drepper@gnu.ai.mit.edu> | |||||
# | |||||
# This file can be copied and used freely without restrictions. It can | |||||
# be used in projects which are not available under the GNU General Public | |||||
# License but which still want to provide support for the GNU gettext | |||||
# functionality. | |||||
# Please note that the actual code of GNU gettext is covered by the GNU | |||||
# General Public License and is *not* in the public domain. | |||||
# | |||||
# Origin: gettext-0.14 | |||||
PACKAGE = @PACKAGE@ | |||||
VERSION = @VERSION@ | |||||
SHELL = /bin/sh | |||||
@SET_MAKE@ | |||||
srcdir = @srcdir@ | |||||
top_srcdir = @top_srcdir@ | |||||
VPATH = @srcdir@ | |||||
prefix = @prefix@ | |||||
exec_prefix = @exec_prefix@ | |||||
datadir = @datadir@ | |||||
localedir = $(datadir)/locale | |||||
gettextsrcdir = $(datadir)/gettext/po | |||||
INSTALL = @INSTALL@ | |||||
INSTALL_DATA = @INSTALL_DATA@ | |||||
MKINSTALLDIRS = @MKINSTALLDIRS@ | |||||
mkinstalldirs = $(SHELL) $(MKINSTALLDIRS) | |||||
GMSGFMT = @GMSGFMT@ | |||||
MSGFMT = @MSGFMT@ | |||||
XGETTEXT = @XGETTEXT@ | |||||
MSGMERGE = msgmerge | |||||
MSGMERGE_UPDATE = @MSGMERGE@ --update | |||||
MSGINIT = msginit | |||||
MSGCONV = msgconv | |||||
MSGFILTER = msgfilter | |||||
POFILES = @POFILES@ | |||||
GMOFILES = @GMOFILES@ | |||||
UPDATEPOFILES = @UPDATEPOFILES@ | |||||
DUMMYPOFILES = @DUMMYPOFILES@ | |||||
DISTFILES.common = Makefile.in.in remove-potcdate.sin \ | |||||
$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) | |||||
DISTFILES = $(DISTFILES.common) Makevars POTFILES.in $(DOMAIN).pot stamp-po \ | |||||
$(POFILES) $(GMOFILES) \ | |||||
$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) | |||||
POTFILES = \ | |||||
CATALOGS = @CATALOGS@ | |||||
# Makevars gets inserted here. (Don't remove this line!) | |||||
.SUFFIXES: | |||||
.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update | |||||
.po.mo: | |||||
@echo "$(MSGFMT) -c -o $@ $<"; \ | |||||
$(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ | |||||
.po.gmo: | |||||
@lang=`echo $* | sed -e 's,.*/,,'`; \ | |||||
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ | |||||
echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ | |||||
cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo | |||||
.sin.sed: | |||||
sed -e '/^#/d' $< > t-$@ | |||||
mv t-$@ $@ | |||||
all: all-@USE_NLS@ | |||||
all-yes: stamp-po | |||||
all-no: | |||||
# stamp-po is a timestamp denoting the last time at which the CATALOGS have | |||||
# been loosely updated. Its purpose is that when a developer or translator | |||||
# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, | |||||
# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent | |||||
# invocations of "make" will do nothing. This timestamp would not be necessary | |||||
# if updating the $(CATALOGS) would always touch them; however, the rule for | |||||
# $(POFILES) has been designed to not touch files that don't need to be | |||||
# changed. | |||||
stamp-po: $(srcdir)/$(DOMAIN).pot | |||||
test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) | |||||
@echo "touch stamp-po" | |||||
@echo timestamp > stamp-poT | |||||
@mv stamp-poT stamp-po | |||||
# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', | |||||
# otherwise packages like GCC can not be built if only parts of the source | |||||
# have been downloaded. | |||||
# This target rebuilds $(DOMAIN).pot; it is an expensive operation. | |||||
# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. | |||||
$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed | |||||
$(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ | |||||
--add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ | |||||
--files-from=$(srcdir)/POTFILES.in \ | |||||
--copyright-holder='$(COPYRIGHT_HOLDER)' \ | |||||
--msgid-bugs-address='$(MSGID_BUGS_ADDRESS)' | |||||
test ! -f $(DOMAIN).po || { \ | |||||
if test -f $(srcdir)/$(DOMAIN).pot; then \ | |||||
sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ | |||||
sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ | |||||
if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ | |||||
rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ | |||||
else \ | |||||
rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ | |||||
mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ | |||||
fi; \ | |||||
else \ | |||||
mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ | |||||
fi; \ | |||||
} | |||||
# This rule has no dependencies: we don't need to update $(DOMAIN).pot at | |||||
# every "make" invocation, only create it when it is missing. | |||||
# Only "make $(DOMAIN).pot-update" or "make dist" will force an update. | |||||
$(srcdir)/$(DOMAIN).pot: | |||||
$(MAKE) $(DOMAIN).pot-update | |||||
# This target rebuilds a PO file if $(DOMAIN).pot has changed. | |||||
# Note that a PO file is not touched if it doesn't need to be changed. | |||||
$(POFILES): $(srcdir)/$(DOMAIN).pot | |||||
@lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ | |||||
if test -f "$(srcdir)/$${lang}.po"; then \ | |||||
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ | |||||
echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ | |||||
cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ | |||||
else \ | |||||
$(MAKE) $${lang}.po-create; \ | |||||
fi | |||||
install: install-exec install-data | |||||
install-exec: | |||||
install-data: install-data-@USE_NLS@ | |||||
if test "$(PACKAGE)" = "gettext-tools"; then \ | |||||
$(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ | |||||
for file in $(DISTFILES.common) Makevars.template; do \ | |||||
$(INSTALL_DATA) $(srcdir)/$$file \ | |||||
$(DESTDIR)$(gettextsrcdir)/$$file; \ | |||||
done; \ | |||||
for file in Makevars; do \ | |||||
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ | |||||
done; \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
install-data-no: all | |||||
install-data-yes: all | |||||
$(mkinstalldirs) $(DESTDIR)$(datadir) | |||||
@catalogs='$(CATALOGS)'; \ | |||||
for cat in $$catalogs; do \ | |||||
cat=`basename $$cat`; \ | |||||
lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ | |||||
dir=$(localedir)/$$lang/LC_MESSAGES; \ | |||||
$(mkinstalldirs) $(DESTDIR)$$dir; \ | |||||
if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ | |||||
$(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ | |||||
echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ | |||||
for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ | |||||
if test -n "$$lc"; then \ | |||||
if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ | |||||
link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ | |||||
mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ | |||||
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ | |||||
(cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ | |||||
for file in *; do \ | |||||
if test -f $$file; then \ | |||||
ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ | |||||
fi; \ | |||||
done); \ | |||||
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ | |||||
else \ | |||||
if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ | |||||
:; \ | |||||
else \ | |||||
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ | |||||
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ | |||||
fi; \ | |||||
fi; \ | |||||
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ | |||||
ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ | |||||
ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ | |||||
cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ | |||||
echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ | |||||
fi; \ | |||||
done; \ | |||||
done | |||||
install-strip: install | |||||
installdirs: installdirs-exec installdirs-data | |||||
installdirs-exec: | |||||
installdirs-data: installdirs-data-@USE_NLS@ | |||||
if test "$(PACKAGE)" = "gettext-tools"; then \ | |||||
$(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
installdirs-data-no: | |||||
installdirs-data-yes: | |||||
$(mkinstalldirs) $(DESTDIR)$(datadir) | |||||
@catalogs='$(CATALOGS)'; \ | |||||
for cat in $$catalogs; do \ | |||||
cat=`basename $$cat`; \ | |||||
lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ | |||||
dir=$(localedir)/$$lang/LC_MESSAGES; \ | |||||
$(mkinstalldirs) $(DESTDIR)$$dir; \ | |||||
for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ | |||||
if test -n "$$lc"; then \ | |||||
if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ | |||||
link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ | |||||
mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ | |||||
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ | |||||
(cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ | |||||
for file in *; do \ | |||||
if test -f $$file; then \ | |||||
ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ | |||||
fi; \ | |||||
done); \ | |||||
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ | |||||
else \ | |||||
if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ | |||||
:; \ | |||||
else \ | |||||
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ | |||||
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ | |||||
fi; \ | |||||
fi; \ | |||||
fi; \ | |||||
done; \ | |||||
done | |||||
# Define this as empty until I found a useful application. | |||||
installcheck: | |||||
uninstall: uninstall-exec uninstall-data | |||||
uninstall-exec: | |||||
uninstall-data: uninstall-data-@USE_NLS@ | |||||
if test "$(PACKAGE)" = "gettext-tools"; then \ | |||||
for file in $(DISTFILES.common) Makevars.template; do \ | |||||
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ | |||||
done; \ | |||||
else \ | |||||
: ; \ | |||||
fi | |||||
uninstall-data-no: | |||||
uninstall-data-yes: | |||||
catalogs='$(CATALOGS)'; \ | |||||
for cat in $$catalogs; do \ | |||||
cat=`basename $$cat`; \ | |||||
lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ | |||||
for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ | |||||
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ | |||||
done; \ | |||||
done | |||||
check: all | |||||
info dvi ps pdf html tags TAGS ctags CTAGS ID: | |||||
mostlyclean: | |||||
rm -f remove-potcdate.sed | |||||
rm -f stamp-poT | |||||
rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po | |||||
rm -fr *.o | |||||
clean: mostlyclean | |||||
distclean: clean | |||||
rm -f Makefile Makefile.in POTFILES *.mo | |||||
maintainer-clean: distclean | |||||
@echo "This command is intended for maintainers to use;" | |||||
@echo "it deletes files that may require special tools to rebuild." | |||||
rm -f stamp-po $(GMOFILES) | |||||
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) | |||||
dist distdir: | |||||
$(MAKE) update-po | |||||
@$(MAKE) dist2 | |||||
# This is a separate target because 'update-po' must be executed before. | |||||
dist2: $(DISTFILES) | |||||
dists="$(DISTFILES)"; \ | |||||
if test "$(PACKAGE)" = "gettext-tools"; then \ | |||||
dists="$$dists Makevars.template"; \ | |||||
fi; \ | |||||
if test -f $(srcdir)/ChangeLog; then \ | |||||
dists="$$dists ChangeLog"; \ | |||||
fi; \ | |||||
for i in 0 1 2 3 4 5 6 7 8 9; do \ | |||||
if test -f $(srcdir)/ChangeLog.$$i; then \ | |||||
dists="$$dists ChangeLog.$$i"; \ | |||||
fi; \ | |||||
done; \ | |||||
if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ | |||||
for file in $$dists; do \ | |||||
if test -f $$file; then \ | |||||
cp -p $$file $(distdir); \ | |||||
else \ | |||||
cp -p $(srcdir)/$$file $(distdir); \ | |||||
fi; \ | |||||
done | |||||
update-po: Makefile | |||||
$(MAKE) $(DOMAIN).pot-update | |||||
test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) | |||||
$(MAKE) update-gmo | |||||
# General rule for creating PO files. | |||||
.nop.po-create: | |||||
@lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ | |||||
echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ | |||||
exit 1 | |||||
# General rule for updating PO files. | |||||
.nop.po-update: | |||||
@lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ | |||||
if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ | |||||
tmpdir=`pwd`; \ | |||||
echo "$$lang:"; \ | |||||
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ | |||||
echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ | |||||
cd $(srcdir); \ | |||||
if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ | |||||
if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ | |||||
rm -f $$tmpdir/$$lang.new.po; \ | |||||
else \ | |||||
if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ | |||||
:; \ | |||||
else \ | |||||
echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ | |||||
exit 1; \ | |||||
fi; \ | |||||
fi; \ | |||||
else \ | |||||
echo "msgmerge for $$lang.po failed!" 1>&2; \ | |||||
rm -f $$tmpdir/$$lang.new.po; \ | |||||
fi | |||||
$(DUMMYPOFILES): | |||||
update-gmo: Makefile $(GMOFILES) | |||||
@: | |||||
Makefile: Makefile.in.in $(top_builddir)/config.status @POMAKEFILEDEPS@ | |||||
cd $(top_builddir) \ | |||||
&& CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ | |||||
$(SHELL) ./config.status | |||||
force: | |||||
# Tell versions [3.59,3.63) of GNU make not to export all variables. | |||||
# Otherwise a system limit (for SysV at least) may be exceeded. | |||||
.NOEXPORT: |
# Makefile variables for PO directory in any package using GNU gettext. | |||||
# Usually the message domain is the same as the package name. | |||||
DOMAIN = $(PACKAGE) | |||||
# These two variables depend on the location of this directory. | |||||
subdir = po | |||||
top_builddir = .. | |||||
# These options get passed to xgettext. | |||||
XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ | |||||
# This is the copyright holder that gets inserted into the header of the | |||||
# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding | |||||
# package. (Note that the msgstr strings, extracted from the package's | |||||
# sources, belong to the copyright holder of the package.) Translators are | |||||
# expected to transfer the copyright for their translations to this person | |||||
# or entity, or to disclaim their copyright. The empty string stands for | |||||
# the public domain; in this case the translators are expected to disclaim | |||||
# their copyright. | |||||
COPYRIGHT_HOLDER = RealVNC Ltd, Constantin Kaplinsky, Peter Astrand, Cendio AB | |||||
# This is the email address or URL to which the translators shall report | |||||
# bugs in the untranslated strings: | |||||
# - Strings which are not entire sentences, see the maintainer guidelines | |||||
# in the GNU gettext documentation, section 'Preparing Strings'. | |||||
# - Strings which use unclear terms or require additional context to be | |||||
# understood. | |||||
# - Strings which make invalid assumptions about notation of date, time or | |||||
# money. | |||||
# - Pluralisation problems. | |||||
# - Incorrect English spelling. | |||||
# - Incorrect formatting. | |||||
# It can be your email address, or a mailing list address where translators | |||||
# can write to without being subscribed, or the URL of a web page through | |||||
# which the translators can contact you. | |||||
MSGID_BUGS_ADDRESS = devteam@tightvnc.com | |||||
# This is the list of locale categories, beyond LC_MESSAGES, for which the | |||||
# message catalogs shall be used. It is usually empty. | |||||
EXTRA_LOCALE_CATEGORIES = |
# vncviewer_unix | |||||
vncviewer_unix/AboutDialog.h | |||||
vncviewer_unix/CConn.cxx | |||||
vncviewer_unix/CConn.h | |||||
vncviewer_unix/DesktopWindow.cxx | |||||
vncviewer_unix/DesktopWindow.h | |||||
vncviewer_unix/InfoDialog.h | |||||
vncviewer_unix/OptionsDialog.h | |||||
vncviewer_unix/parameters.h | |||||
vncviewer_unix/PasswdDialog.h | |||||
vncviewer_unix/ServerDialog.h | |||||
vncviewer_unix/vncviewer.cxx |
# Special Makefile rules for English message catalogs with quotation marks. | |||||
DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot | |||||
.SUFFIXES: .insert-header .po-update-en | |||||
en@quot.po-create: | |||||
$(MAKE) en@quot.po-update | |||||
en@boldquot.po-create: | |||||
$(MAKE) en@boldquot.po-update | |||||
en@quot.po-update: en@quot.po-update-en | |||||
en@boldquot.po-update: en@boldquot.po-update-en | |||||
.insert-header.po-update-en: | |||||
@lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ | |||||
if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ | |||||
tmpdir=`pwd`; \ | |||||
echo "$$lang:"; \ | |||||
ll=`echo $$lang | sed -e 's/@.*//'`; \ | |||||
LC_ALL=C; export LC_ALL; \ | |||||
cd $(srcdir); \ | |||||
if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ | |||||
if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ | |||||
rm -f $$tmpdir/$$lang.new.po; \ | |||||
else \ | |||||
if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ | |||||
:; \ | |||||
else \ | |||||
echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ | |||||
exit 1; \ | |||||
fi; \ | |||||
fi; \ | |||||
else \ | |||||
echo "creation of $$lang.po failed!" 1>&2; \ | |||||
rm -f $$tmpdir/$$lang.new.po; \ | |||||
fi | |||||
en@quot.insert-header: insert-header.sin | |||||
sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header | |||||
en@boldquot.insert-header: insert-header.sin | |||||
sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header | |||||
mostlyclean: mostlyclean-quot | |||||
mostlyclean-quot: | |||||
rm -f *.insert-header |
s/"\([^"]*\)"/“\1”/g | |||||
s/`\([^`']*\)'/‘\1’/g | |||||
s/ '\([^`']*\)' / ‘\1’ /g | |||||
s/ '\([^`']*\)'$/ ‘\1’/g | |||||
s/^'\([^`']*\)' /‘\1’ /g | |||||
s/“”/""/g | |||||
s/“/“[1m/g | |||||
s/”/[0m”/g | |||||
s/‘/‘[1m/g | |||||
s/’/[0m’/g |
# All this catalog "translates" are quotation characters. | |||||
# The msgids must be ASCII and therefore cannot contain real quotation | |||||
# characters, only substitutes like grave accent (0x60), apostrophe (0x27) | |||||
# and double quote (0x22). These substitutes look strange; see | |||||
# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html | |||||
# | |||||
# This catalog translates grave accent (0x60) and apostrophe (0x27) to | |||||
# left single quotation mark (U+2018) and right single quotation mark (U+2019). | |||||
# It also translates pairs of apostrophe (0x27) to | |||||
# left single quotation mark (U+2018) and right single quotation mark (U+2019) | |||||
# and pairs of quotation mark (0x22) to | |||||
# left double quotation mark (U+201C) and right double quotation mark (U+201D). | |||||
# | |||||
# When output to an UTF-8 terminal, the quotation characters appear perfectly. | |||||
# When output to an ISO-8859-1 terminal, the single quotation marks are | |||||
# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to | |||||
# grave/acute accent (by libiconv), and the double quotation marks are | |||||
# transliterated to 0x22. | |||||
# When output to an ASCII terminal, the single quotation marks are | |||||
# transliterated to apostrophes, and the double quotation marks are | |||||
# transliterated to 0x22. | |||||
# | |||||
# This catalog furthermore displays the text between the quotation marks in | |||||
# bold face, assuming the VT100/XTerm escape sequences. | |||||
# |
# All this catalog "translates" are quotation characters. | |||||
# The msgids must be ASCII and therefore cannot contain real quotation | |||||
# characters, only substitutes like grave accent (0x60), apostrophe (0x27) | |||||
# and double quote (0x22). These substitutes look strange; see | |||||
# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html | |||||
# | |||||
# This catalog translates grave accent (0x60) and apostrophe (0x27) to | |||||
# left single quotation mark (U+2018) and right single quotation mark (U+2019). | |||||
# It also translates pairs of apostrophe (0x27) to | |||||
# left single quotation mark (U+2018) and right single quotation mark (U+2019) | |||||
# and pairs of quotation mark (0x22) to | |||||
# left double quotation mark (U+201C) and right double quotation mark (U+201D). | |||||
# | |||||
# When output to an UTF-8 terminal, the quotation characters appear perfectly. | |||||
# When output to an ISO-8859-1 terminal, the single quotation marks are | |||||
# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to | |||||
# grave/acute accent (by libiconv), and the double quotation marks are | |||||
# transliterated to 0x22. | |||||
# When output to an ASCII terminal, the single quotation marks are | |||||
# transliterated to apostrophes, and the double quotation marks are | |||||
# transliterated to 0x22. | |||||
# |
# Sed script that inserts the file called HEADER before the header entry. | |||||
# | |||||
# At each occurrence of a line starting with "msgid ", we execute the following | |||||
# commands. At the first occurrence, insert the file. At the following | |||||
# occurrences, do nothing. The distinction between the first and the following | |||||
# occurrences is achieved by looking at the hold space. | |||||
/^msgid /{ | |||||
x | |||||
# Test if the hold space is empty. | |||||
s/m/m/ | |||||
ta | |||||
# Yes it was empty. First occurrence. Read the file. | |||||
r HEADER | |||||
# Output the file's contents by reading the next line. But don't lose the | |||||
# current line while doing this. | |||||
g | |||||
N | |||||
bb | |||||
:a | |||||
# The hold space was nonempty. Following occurrences. Do nothing. | |||||
x | |||||
:b | |||||
} |
s/"\([^"]*\)"/“\1”/g | |||||
s/`\([^`']*\)'/‘\1’/g | |||||
s/ '\([^`']*\)' / ‘\1’ /g | |||||
s/ '\([^`']*\)'$/ ‘\1’/g | |||||
s/^'\([^`']*\)' /‘\1’ /g | |||||
s/“”/""/g |
# Sed script that remove the POT-Creation-Date line in the header entry | |||||
# from a POT file. | |||||
# | |||||
# The distinction between the first and the following occurrences of the | |||||
# pattern is achieved by looking at the hold space. | |||||
/^"POT-Creation-Date: .*"$/{ | |||||
x | |||||
# Test if the hold space is empty. | |||||
s/P/P/ | |||||
ta | |||||
# Yes it was empty. First occurrence. Remove the line. | |||||
g | |||||
d | |||||
bb | |||||
:a | |||||
# The hold space was nonempty. Following occurrences. Do nothing. | |||||
x | |||||
:b | |||||
} |
PACKAGE = @PACKAGE@ | |||||
VERSION = @VERSION@ | |||||
prefix = @prefix@ | |||||
datadir = @datadir@ | |||||
localedir = $(datadir)/locale | |||||
SRCS = DesktopWindow.cxx CConn.cxx vncviewer.cxx | SRCS = DesktopWindow.cxx CConn.cxx vncviewer.cxx | ||||
OBJS = $(SRCS:.cxx=.o) | OBJS = $(SRCS:.cxx=.o) | ||||
DEP_LIBS = ../tx/libtx.a ../rfb/librfb.a ../network/libnetwork.a \ | DEP_LIBS = ../tx/libtx.a ../rfb/librfb.a ../network/libnetwork.a \ | ||||
../rdr/librdr.a | ../rdr/librdr.a | ||||
EXTRA_LIBS = @ZLIB_LIB@ @JPEG_LIB@ @X_PRE_LIBS@ @X_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@ | |||||
EXTRA_LIBS = @ZLIB_LIB@ @JPEG_LIB@ @X_PRE_LIBS@ @X_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@ @LIBINTL@ | |||||
DIR_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/tx @X_CFLAGS@ # X_CFLAGS are really CPPFLAGS | |||||
DIR_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" -I$(top_srcdir) -I$(top_srcdir)/tx -I$(top_srcdir)/intl @X_CFLAGS@ # X_CFLAGS are really CPPFLAGS | |||||
all:: $(program) | all:: $(program) | ||||
#include "TXWindow.h" | #include "TXWindow.h" | ||||
#include "CConn.h" | #include "CConn.h" | ||||
#include <intl/gettext.h> | |||||
#define _(String) gettext (String) | |||||
#define gettext_noop(String) String | |||||
#define N_(String) gettext_noop (String) | |||||
rfb::LogWriter vlog("main"); | rfb::LogWriter vlog("main"); | ||||
using namespace network; | using namespace network; | ||||
int main(int argc, char** argv) | int main(int argc, char** argv) | ||||
{ | { | ||||
setlocale(LC_ALL, ""); | |||||
bindtextdomain(PACKAGE, LOCALEDIR); | |||||
textdomain(PACKAGE); | |||||
snprintf(aboutText, sizeof(aboutText), | snprintf(aboutText, sizeof(aboutText), | ||||
"TightVNC viewer for X version 4.0 - built %s\n" | |||||
"Copyright (C) 2002-2004 RealVNC Ltd.\n" | |||||
"Copyright (C) 2000-2004 Constantin Kaplinsky.\n" | |||||
"Copyright (C) 2004 Peter Astrand, Cendio AB\n" | |||||
"See http://www.tightvnc.com for information on TightVNC.", | |||||
buildtime); | |||||
_("TightVNC viewer for X version 4.0 - built %s\n" | |||||
"Copyright (C) 2002-2004 RealVNC Ltd.\n" | |||||
"Copyright (C) 2000-2004 Constantin Kaplinsky.\n" | |||||
"Copyright (C) 2004 Peter Astrand, Cendio AB\n" | |||||
"See http://www.tightvnc.com for information on TightVNC."), | |||||
buildtime); | |||||
fprintf(stderr,"\n%s\n", aboutText); | fprintf(stderr,"\n%s\n", aboutText); | ||||
rfb::initStdIOLoggers(); | rfb::initStdIOLoggers(); |