git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@108 3789f03b-4d11-0410-bbf8-ca57d06f2519tags/v0.0.90
@@ -0,0 +1,768 @@ | |||
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. | |||
@@ -1,5 +1,8 @@ | |||
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 |
@@ -0,0 +1,548 @@ | |||
#! /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 |
@@ -1,6 +1,13 @@ | |||
dnl Process this file with autoconf to produce a configure script. | |||
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 | |||
ac_cv_prog_cc_g=no | |||
ac_cv_prog_cxx_g=no | |||
@@ -98,6 +105,8 @@ AC_MSG_RESULT(using int) | |||
SOCKLEN_T_DEFINE='-DVNC_SOCKLEN_T=int') | |||
AC_SUBST(SOCKLEN_T_DEFINE) | |||
AM_GNU_GETTEXT | |||
BOILERPLATE=boilerplate.mk | |||
if (sh -c "make --version" 2>/dev/null | grep GNU 2>&1 >/dev/null); then | |||
@@ -106,7 +115,7 @@ if (sh -c "make --version" 2>/dev/null | grep GNU 2>&1 >/dev/null); then | |||
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 \ | |||
network/Makefile:network/Makefile.in:$BOILERPLATE \ | |||
Xregion/Makefile:Xregion/Makefile.in:$BOILERPLATE \ |
@@ -0,0 +1,322 @@ | |||
#!/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: |
@@ -0,0 +1,4 @@ | |||
2004-01-29 GNU <bug-gnu-gettext@gnu.org> | |||
* Version 0.14.1 released. | |||
@@ -0,0 +1,493 @@ | |||
# 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: |
@@ -0,0 +1 @@ | |||
GNU gettext library from gettext-0.14.1 |
@@ -0,0 +1,363 @@ | |||
/* 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 |
@@ -0,0 +1,608 @@ | |||
#! /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 |
@@ -0,0 +1,56 @@ | |||
/* 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 |
@@ -0,0 +1,57 @@ | |||
/* 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 |
@@ -0,0 +1,58 @@ | |||
/* 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 |
@@ -0,0 +1,59 @@ | |||
/* 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 |
@@ -0,0 +1,108 @@ | |||
/* 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; | |||
} |
@@ -0,0 +1,185 @@ | |||
/* 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; | |||
} |
@@ -0,0 +1,192 @@ | |||
/* 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 |
@@ -0,0 +1,63 @@ | |||
/* 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 |
@@ -0,0 +1,69 @@ | |||
/* 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 */ |
@@ -0,0 +1,215 @@ | |||
/* 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 */ |
@@ -0,0 +1,149 @@ | |||
/* 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 */ |
@@ -0,0 +1,48 @@ | |||
/* 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; | |||
} |
@@ -0,0 +1,131 @@ | |||
/* 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); | |||
} |
@@ -0,0 +1,421 @@ | |||
/* 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 |
@@ -0,0 +1,383 @@ | |||
/* 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 */ |
@@ -0,0 +1,145 @@ | |||
/* 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 */ |
@@ -0,0 +1,398 @@ | |||
/* 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; | |||
} |
@@ -0,0 +1,42 @@ | |||
/* 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 */ |
@@ -0,0 +1,78 @@ | |||
# 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 |
@@ -0,0 +1,414 @@ | |||
/* 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 | |||
} |
@@ -0,0 +1,98 @@ | |||
/* 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); | |||
} |
@@ -0,0 +1,65 @@ | |||
/* 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 |
@@ -0,0 +1,98 @@ | |||
/* 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); | |||
} |
@@ -0,0 +1,46 @@ | |||
/* 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) |
@@ -0,0 +1,24 @@ | |||
/* 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 |
@@ -0,0 +1,154 @@ | |||
/* 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; | |||
} | |||
} |
@@ -0,0 +1,118 @@ | |||
/* 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 */ |
@@ -0,0 +1,381 @@ | |||
%{ | |||
/* 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. */ | |||
} |
@@ -0,0 +1,119 @@ | |||
/* 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; | |||
} |
@@ -0,0 +1,137 @@ | |||
/* 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 */ |
@@ -0,0 +1,537 @@ | |||
/* 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 |
@@ -0,0 +1,75 @@ | |||
/* 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 */ |
@@ -0,0 +1,371 @@ | |||
/* 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 |
@@ -0,0 +1,31 @@ | |||
# 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:/ | |||
} |
@@ -0,0 +1,26 @@ | |||
# 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:/ | |||
} |
@@ -0,0 +1,449 @@ | |||
/* 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 |
@@ -0,0 +1,77 @@ | |||
/* 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 */ |
@@ -0,0 +1,141 @@ | |||
/* 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 |
@@ -0,0 +1,887 @@ | |||
/* 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 |
@@ -0,0 +1,61 @@ | |||
/* 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 */ |
@@ -0,0 +1,46 @@ | |||
/* 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 */ |
@@ -0,0 +1,75 @@ | |||
/* 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 */ |
@@ -0,0 +1,109 @@ | |||
/* 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 */ |
@@ -0,0 +1,111 @@ | |||
#! /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 |
@@ -0,0 +1 @@ | |||
sv |
@@ -0,0 +1,366 @@ | |||
# 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: |
@@ -0,0 +1,41 @@ | |||
# 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 = |
@@ -0,0 +1,12 @@ | |||
# 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 |
@@ -0,0 +1,47 @@ | |||
# 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 |
@@ -0,0 +1,10 @@ | |||
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 |
@@ -0,0 +1,25 @@ | |||
# 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. | |||
# |
@@ -0,0 +1,22 @@ | |||
# 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. | |||
# |
@@ -0,0 +1,23 @@ | |||
# 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 | |||
} |
@@ -0,0 +1,6 @@ | |||
s/"\([^"]*\)"/“\1”/g | |||
s/`\([^`']*\)'/‘\1’/g | |||
s/ '\([^`']*\)' / ‘\1’ /g | |||
s/ '\([^`']*\)'$/ ‘\1’/g | |||
s/^'\([^`']*\)' /‘\1’ /g | |||
s/“”/""/g |
@@ -0,0 +1,19 @@ | |||
# 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 | |||
} |
@@ -1,4 +1,11 @@ | |||
PACKAGE = @PACKAGE@ | |||
VERSION = @VERSION@ | |||
prefix = @prefix@ | |||
datadir = @datadir@ | |||
localedir = $(datadir)/locale | |||
SRCS = DesktopWindow.cxx CConn.cxx vncviewer.cxx | |||
OBJS = $(SRCS:.cxx=.o) | |||
@@ -8,9 +15,9 @@ program = vncviewer | |||
DEP_LIBS = ../tx/libtx.a ../rfb/librfb.a ../network/libnetwork.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) | |||
@@ -35,6 +35,11 @@ | |||
#include "TXWindow.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"); | |||
using namespace network; | |||
@@ -176,13 +181,17 @@ static void usage() | |||
int main(int argc, char** argv) | |||
{ | |||
setlocale(LC_ALL, ""); | |||
bindtextdomain(PACKAGE, LOCALEDIR); | |||
textdomain(PACKAGE); | |||
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); | |||
rfb::initStdIOLoggers(); |