mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-25 02:49:46 +00:00
Update gettext
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8781 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
fdc1609e39
commit
b02093873e
798
ABOUT-NLS
798
ABOUT-NLS
@ -1,8 +1,8 @@
|
|||||||
Notes on the Free Translation Project
|
Notes on the Free Translation Project
|
||||||
*************************************
|
*************************************
|
||||||
|
|
||||||
Free software is going international! The Free Translation Project
|
Free software is going international! The Free Translation Project is
|
||||||
is a way to get maintainers of free software, translators, and users all
|
a way to get maintainers of free software, translators, and users all
|
||||||
together, so that will gradually become able to speak many languages.
|
together, so that will gradually become able to speak many languages.
|
||||||
A few packages already provide translations for their messages.
|
A few packages already provide translations for their messages.
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ related to internationalization, you should tell about the version of
|
|||||||
Quick configuration advice
|
Quick configuration advice
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
If you want to exploit the full power of internationalization, you
|
If you want to exploit the full power of internationalization, you
|
||||||
should configure it using
|
should configure it using
|
||||||
|
|
||||||
./configure --with-included-gettext
|
./configure --with-included-gettext
|
||||||
@ -48,10 +48,10 @@ included `libintl'.
|
|||||||
INSTALL Matters
|
INSTALL Matters
|
||||||
===============
|
===============
|
||||||
|
|
||||||
Some packages are "localizable" when properly installed; the
|
Some packages are "localizable" when properly installed; the programs
|
||||||
programs they contain can be made to speak your own native language.
|
they contain can be made to speak your own native language. Most such
|
||||||
Most such packages use GNU `gettext'. Other packages have their own
|
packages use GNU `gettext'. Other packages have their own ways to
|
||||||
ways to internationalization, predating GNU `gettext'.
|
internationalization, predating GNU `gettext'.
|
||||||
|
|
||||||
By default, this package will be installed to allow translation of
|
By default, this package will be installed to allow translation of
|
||||||
messages. It will automatically detect whether the system already
|
messages. It will automatically detect whether the system already
|
||||||
@ -98,7 +98,7 @@ codes, stating which languages are allowed.
|
|||||||
Using This Package
|
Using This Package
|
||||||
==================
|
==================
|
||||||
|
|
||||||
As a user, if your language has been installed for this package, you
|
As a user, if your language has been installed for this package, you
|
||||||
only have to set the `LANG' environment variable to the appropriate
|
only have to set the `LANG' environment variable to the appropriate
|
||||||
`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code,
|
`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
|
and `CC' is an ISO 3166 two-letter country code. For example, let's
|
||||||
@ -131,6 +131,13 @@ system libraries. For example, some Swedish users who would rather
|
|||||||
read translations in German than English for when Swedish is not
|
read translations in German than English for when Swedish is not
|
||||||
available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
|
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'
|
In the `LANGUAGE' environment variable, but not in the `LANG'
|
||||||
environment variable, `LL_CC' combinations can be abbreviated as `LL'
|
environment variable, `LL_CC' combinations can be abbreviated as `LL'
|
||||||
to denote the language's main dialect. For example, `de' is equivalent
|
to denote the language's main dialect. For example, `de' is equivalent
|
||||||
@ -140,7 +147,7 @@ to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
|
|||||||
Translating Teams
|
Translating Teams
|
||||||
=================
|
=================
|
||||||
|
|
||||||
For the Free Translation Project to be a success, we need interested
|
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
|
people who like their own language and write it well, and who are also
|
||||||
able to synergize with other translators speaking the same language.
|
able to synergize with other translators speaking the same language.
|
||||||
Each translation team has its own mailing list. The up-to-date list of
|
Each translation team has its own mailing list. The up-to-date list of
|
||||||
@ -170,230 +177,559 @@ programming skill, here.
|
|||||||
Available Packages
|
Available Packages
|
||||||
==================
|
==================
|
||||||
|
|
||||||
Languages are not equally supported in all packages. The following
|
Languages are not equally supported in all packages. The following
|
||||||
matrix shows the current state of internationalization, as of July
|
matrix shows the current state of internationalization, as of January
|
||||||
2002. The matrix shows, in regard of each package, for which languages
|
2004. The matrix shows, in regard of each package, for which languages
|
||||||
PO files have been submitted to translation coordination, with a
|
PO files have been submitted to translation coordination, with a
|
||||||
translation percentage of at least 50%.
|
translation percentage of at least 50%.
|
||||||
|
|
||||||
Ready PO files be bg ca cs da de el en eo es et fi fr
|
Ready PO files af am ar az be bg bs ca cs da de el en en_GB eo es
|
||||||
+----------------------------------------+
|
+----------------------------------------------------+
|
||||||
a2ps | [] [] [] [] |
|
a2ps | [] [] [] [] |
|
||||||
bash | [] [] [] [] |
|
aegis | () |
|
||||||
bfd | [] [] |
|
ant-phone | () |
|
||||||
binutils | [] [] |
|
anubis | |
|
||||||
bison | [] [] [] [] |
|
ap-utils | |
|
||||||
clisp | [] [] [] [] |
|
aspell | [] |
|
||||||
clisp | |
|
bash | [] [] [] [] |
|
||||||
clisplow | |
|
batchelor | |
|
||||||
cpio | [] [] [] [] |
|
bfd | [] [] |
|
||||||
darkstat | () |
|
binutils | [] [] |
|
||||||
diffutils | [] [] [] [] [] [] |
|
bison | [] [] [] |
|
||||||
enscript | [] [] |
|
bluez-pin | [] [] [] |
|
||||||
error | [] [] [] |
|
clisp | |
|
||||||
fetchmail | [] () [] [] [] () |
|
clisp | [] [] [] |
|
||||||
fileutils | [] [] [] [] [] |
|
console-tools | [] [] |
|
||||||
findutils | [] [] [] [] [] [] |
|
coreutils | [] [] [] [] |
|
||||||
flex | [] [] [] [] [] |
|
cpio | [] [] [] |
|
||||||
gas | [] [] |
|
darkstat | [] () [] |
|
||||||
gawk | [] [] [] |
|
diffutils | [] [] [] [] [] [] [] |
|
||||||
gcal | [] [] |
|
e2fsprogs | [] [] [] |
|
||||||
gcc | [] [] |
|
enscript | [] [] [] [] |
|
||||||
gettext | [] [] [] [] [] |
|
error | [] [] [] [] [] |
|
||||||
gnupg | [] [] [] [] [] [] [] |
|
fetchmail | [] () [] [] [] [] |
|
||||||
gprof | [] [] |
|
fileutils | [] [] [] |
|
||||||
gpsdrive | () () () () () |
|
findutils | [] [] [] [] [] [] [] |
|
||||||
grep | [] [] [] [] [] [] [] |
|
flex | [] [] [] [] |
|
||||||
gretl | [] |
|
fslint | |
|
||||||
gthumb | () () () |
|
gas | [] |
|
||||||
hello | [] [] [] [] [] [] [] [] [] |
|
gawk | [] [] [] [] |
|
||||||
id-utils | [] [] [] |
|
gbiff | [] |
|
||||||
indent | [] [] [] [] [] |
|
gcal | [] |
|
||||||
jpilot | () [] [] [] |
|
gcc | [] [] |
|
||||||
jwhois | [] [] |
|
gettext | [] [] [] [] [] |
|
||||||
kbd | [] [] [] |
|
gettext-examples | [] [] [] [] |
|
||||||
ld | [] [] |
|
gettext-runtime | [] [] [] [] [] |
|
||||||
libc | [] [] [] [] [] [] [] |
|
gettext-tools | [] [] [] |
|
||||||
libiconv | [] [] [] [] |
|
gimp-print | [] [] [] [] [] |
|
||||||
lifelines | () () |
|
gliv | |
|
||||||
lilypond | [] [] [] |
|
glunarclock | [] [] |
|
||||||
lingoteach | [] [] |
|
gnubiff | [] |
|
||||||
lingoteach_lessons| () () |
|
gnucash | [] () [] [] |
|
||||||
lynx | [] [] [] [] [] |
|
gnucash-glossary | [] () [] |
|
||||||
m4 | [] [] [] [] [] |
|
gnupg | [] () [] [] [] [] |
|
||||||
make | [] [] [] [] |
|
gpe-aerial | [] |
|
||||||
man-db | [] () () [] () () |
|
gpe-beam | [] [] |
|
||||||
mysecretdiary | [] [] [] |
|
gpe-calendar | [] [] |
|
||||||
nano | [] () [] [] [] [] |
|
gpe-clock | [] [] |
|
||||||
nano_1_0 | [] () [] [] [] [] |
|
gpe-conf | [] [] |
|
||||||
opcodes | [] [] [] |
|
gpe-contacts | [] [] |
|
||||||
parted | [] [] [] [] [] |
|
gpe-edit | [] |
|
||||||
ptx | [] [] [] [] [] [] [] |
|
gpe-go | [] |
|
||||||
python | |
|
gpe-login | [] [] |
|
||||||
recode | [] [] [] [] [] [] |
|
gpe-ownerinfo | [] [] |
|
||||||
sed | [] [] [] [] [] [] [] [] [] |
|
gpe-sketchbook | [] [] |
|
||||||
sh-utils | [] [] [] [] |
|
gpe-su | [] [] |
|
||||||
sharutils | [] [] [] [] [] [] |
|
gpe-taskmanager | [] [] |
|
||||||
sketch | () [] () |
|
gpe-timesheet | [] |
|
||||||
soundtracker | [] [] [] |
|
gpe-today | [] [] |
|
||||||
sp | [] |
|
gpe-todo | [] [] |
|
||||||
tar | [] [] [] [] [] [] |
|
gphoto2 | [] [] [] [] |
|
||||||
texinfo | [] [] [] [] [] |
|
gprof | [] [] [] |
|
||||||
textutils | [] [] [] [] [] |
|
gpsdrive | () () () |
|
||||||
util-linux | [] [] [] [] [] [] |
|
gramadoir | [] |
|
||||||
vorbis-tools | [] |
|
grep | [] [] [] [] [] [] |
|
||||||
wastesedge | |
|
gretl | [] |
|
||||||
wdiff | [] [] [] [] [] [] |
|
gtick | [] () |
|
||||||
wget | [] [] [] [] [] [] [] [] [] [] |
|
hello | [] [] [] [] [] [] |
|
||||||
+----------------------------------------+
|
id-utils | [] [] |
|
||||||
be bg ca cs da de el en eo es et fi fr
|
indent | [] [] [] [] |
|
||||||
0 2 19 10 30 44 9 1 12 45 16 3 53
|
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
|
||||||
|
|
||||||
gl he hr hu id it ja ko lv nb nl nn
|
et eu fa fi fr ga gl he hr hu id is it ja ko lg
|
||||||
+-------------------------------------+
|
+-------------------------------------------------+
|
||||||
a2ps | () () [] |
|
a2ps | [] [] [] () () |
|
||||||
bash | [] |
|
aegis | |
|
||||||
bfd | [] |
|
ant-phone | [] |
|
||||||
binutils | [] |
|
anubis | [] |
|
||||||
bison | [] [] [] [] |
|
ap-utils | [] |
|
||||||
clisp | [] |
|
aspell | [] [] |
|
||||||
clisp | |
|
bash | [] [] |
|
||||||
clisplow | |
|
batchelor | [] [] |
|
||||||
cpio | [] [] [] [] |
|
bfd | [] |
|
||||||
darkstat | () |
|
binutils | [] [] |
|
||||||
diffutils | [] [] [] [] [] |
|
bison | [] [] [] [] |
|
||||||
enscript | [] [] |
|
bluez-pin | [] [] [] [] [] |
|
||||||
error | [] |
|
clisp | |
|
||||||
fetchmail | [] |
|
clisp | [] |
|
||||||
fileutils | [] [] [] |
|
console-tools | |
|
||||||
findutils | [] [] [] [] [] [] [] [] |
|
coreutils | [] [] [] [] [] [] |
|
||||||
flex | [] |
|
cpio | [] [] [] [] |
|
||||||
gas | |
|
darkstat | () [] [] [] |
|
||||||
gawk | [] |
|
diffutils | [] [] [] [] [] [] [] |
|
||||||
gcal | |
|
e2fsprogs | |
|
||||||
gcc | [] |
|
enscript | [] [] |
|
||||||
gettext | [] [] |
|
error | [] [] [] [] |
|
||||||
gnupg | [] [] [] [] |
|
fetchmail | [] |
|
||||||
gprof | |
|
fileutils | [] [] [] [] [] [] |
|
||||||
gpsdrive | [] () () |
|
findutils | [] [] [] [] [] [] [] [] [] [] [] |
|
||||||
grep | [] [] [] [] [] [] [] |
|
flex | [] [] [] |
|
||||||
gretl | |
|
fslint | [] |
|
||||||
gthumb | () () |
|
gas | [] |
|
||||||
hello | [] [] [] [] [] [] [] [] [] [] [] [] |
|
gawk | [] [] [] |
|
||||||
id-utils | [] [] |
|
gbiff | [] |
|
||||||
indent | [] [] [] [] |
|
gcal | [] |
|
||||||
jpilot | () () |
|
gcc | [] |
|
||||||
jwhois | [] [] |
|
gettext | [] [] [] |
|
||||||
kbd | |
|
gettext-examples | [] [] |
|
||||||
ld | |
|
gettext-runtime | [] [] [] [] [] |
|
||||||
libc | [] [] [] [] |
|
gettext-tools | [] [] [] |
|
||||||
libiconv | [] [] [] |
|
gimp-print | [] [] |
|
||||||
lifelines | |
|
gliv | () |
|
||||||
lilypond | [] [] |
|
glunarclock | [] [] [] [] |
|
||||||
lingoteach | [] |
|
gnubiff | [] |
|
||||||
lingoteach_lessons| |
|
gnucash | () [] |
|
||||||
lynx | [] [] [] [] |
|
gnucash-glossary | [] |
|
||||||
m4 | [] [] [] [] |
|
gnupg | [] [] [] [] [] [] [] |
|
||||||
make | [] [] [] [] [] [] |
|
gpe-aerial | [] |
|
||||||
man-db | () () |
|
gpe-beam | [] |
|
||||||
mysecretdiary | [] |
|
gpe-calendar | [] [] [] |
|
||||||
nano | [] [] [] [] [] [] |
|
gpe-clock | [] |
|
||||||
nano_1_0 | [] [] [] [] [] |
|
gpe-conf | [] |
|
||||||
opcodes | [] [] |
|
gpe-contacts | [] [] |
|
||||||
parted | [] [] [] |
|
gpe-edit | [] [] |
|
||||||
ptx | [] [] [] [] [] |
|
gpe-go | [] |
|
||||||
python | |
|
gpe-login | [] [] |
|
||||||
recode | [] [] [] |
|
gpe-ownerinfo | [] [] [] |
|
||||||
sed | [] [] [] [] [] [] [] [] |
|
gpe-sketchbook | [] |
|
||||||
sh-utils | [] [] [] |
|
gpe-su | [] |
|
||||||
sharutils | [] [] [] |
|
gpe-taskmanager | [] |
|
||||||
sketch | () |
|
gpe-timesheet | [] [] [] |
|
||||||
soundtracker | [] [] |
|
gpe-today | [] [] |
|
||||||
sp | |
|
gpe-todo | [] [] |
|
||||||
tar | [] [] [] [] [] |
|
gphoto2 | [] [] [] |
|
||||||
texinfo | [] [] [] |
|
gprof | [] [] |
|
||||||
textutils | [] [] [] |
|
gpsdrive | () () () |
|
||||||
util-linux | () [] |
|
gramadoir | [] [] |
|
||||||
vorbis-tools | |
|
grep | [] [] [] [] [] [] [] [] [] [] [] |
|
||||||
wastesedge | |
|
gretl | [] [] |
|
||||||
wdiff | [] [] [] |
|
gtick | [] [] [] |
|
||||||
wget | [] [] [] [] [] [] |
|
hello | [] [] [] [] [] [] [] [] [] [] [] [] [] |
|
||||||
+-------------------------------------+
|
id-utils | [] [] [] [] |
|
||||||
gl he hr hu id it ja ko lv nb nl nn
|
indent | [] [] [] [] [] [] [] [] [] |
|
||||||
23 9 12 18 14 13 26 9 1 8 19 4
|
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
|
||||||
|
|
||||||
no pl pt pt_BR ru sk sl sv tr uk zh_TW
|
lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru
|
||||||
+----------------------------------------+
|
+-----------------------------------------------------+
|
||||||
a2ps | () () () [] [] [] [] [] | 10
|
a2ps | [] [] () () [] [] [] |
|
||||||
bash | [] | 6
|
aegis | () () () |
|
||||||
bfd | [] [] | 5
|
ant-phone | [] [] |
|
||||||
binutils | [] [] | 5
|
anubis | [] [] [] [] [] [] |
|
||||||
bison | [] [] [] | 11
|
ap-utils | [] () [] |
|
||||||
clisp | | 5
|
aspell | [] |
|
||||||
clisp | | 0
|
bash | [] [] [] |
|
||||||
clisplow | | 0
|
batchelor | [] |
|
||||||
cpio | [] [] [] [] | 12
|
bfd | [] |
|
||||||
darkstat | [] () | 1
|
binutils | [] |
|
||||||
diffutils | [] [] [] [] [] [] | 17
|
bison | [] [] [] [] [] |
|
||||||
enscript | [] [] [] [] | 8
|
bluez-pin | [] [] [] |
|
||||||
error | [] [] [] | 7
|
clisp | |
|
||||||
fetchmail | () () [] | 6
|
clisp | [] |
|
||||||
fileutils | [] [] [] [] [] | 13
|
console-tools | [] |
|
||||||
findutils | [] [] [] [] [] [] [] | 21
|
coreutils | [] [] |
|
||||||
flex | [] [] [] | 9
|
cpio | [] [] [] [] [] |
|
||||||
gas | [] | 3
|
darkstat | [] [] [] [] |
|
||||||
gawk | [] [] | 6
|
diffutils | [] [] [] [] [] [] |
|
||||||
gcal | [] [] | 4
|
e2fsprogs | [] |
|
||||||
gcc | [] | 4
|
enscript | [] [] [] [] |
|
||||||
gettext | [] [] [] [] [] [] | 13
|
error | [] [] [] |
|
||||||
gnupg | [] [] [] | 14
|
fetchmail | [] [] () [] |
|
||||||
gprof | [] [] | 4
|
fileutils | [] [] [] |
|
||||||
gpsdrive | [] [] () | 3
|
findutils | [] [] [] [] [] |
|
||||||
grep | [] [] [] [] | 18
|
flex | [] [] [] [] |
|
||||||
gretl | | 1
|
fslint | [] [] |
|
||||||
gthumb | () () [] | 1
|
gas | |
|
||||||
hello | [] [] [] [] [] [] [] | 28
|
gawk | [] [] [] |
|
||||||
id-utils | [] [] [] [] | 9
|
gbiff | [] [] |
|
||||||
indent | [] [] [] [] [] | 14
|
gcal | |
|
||||||
jpilot | () () [] | 4
|
gcc | |
|
||||||
jwhois | [] () () [] [] | 7
|
gettext | [] [] [] |
|
||||||
kbd | [] [] | 5
|
gettext-examples | [] [] [] |
|
||||||
ld | [] [] | 4
|
gettext-runtime | [] [] [] [] |
|
||||||
libc | [] [] [] [] [] [] | 17
|
gettext-tools | [] [] |
|
||||||
libiconv | [] [] [] [] | 11
|
gimp-print | [] |
|
||||||
lifelines | [] | 1
|
gliv | [] [] [] |
|
||||||
lilypond | [] | 6
|
glunarclock | [] [] [] [] |
|
||||||
lingoteach | [] [] | 5
|
gnubiff | [] |
|
||||||
lingoteach_lessons| | 0
|
gnucash | [] [] () [] |
|
||||||
lynx | [] [] [] [] | 13
|
gnucash-glossary | [] [] |
|
||||||
m4 | [] [] [] | 12
|
gnupg | [] |
|
||||||
make | [] [] [] [] | 14
|
gpe-aerial | [] [] [] [] |
|
||||||
man-db | | 3
|
gpe-beam | [] [] [] [] |
|
||||||
mysecretdiary | [] [] [] | 7
|
gpe-calendar | [] [] [] [] |
|
||||||
nano | [] [] [] [] | 15
|
gpe-clock | [] [] [] [] |
|
||||||
nano_1_0 | [] [] [] [] | 14
|
gpe-conf | [] [] [] [] |
|
||||||
opcodes | [] [] | 7
|
gpe-contacts | [] [] [] [] |
|
||||||
parted | [] [] [] | 11
|
gpe-edit | [] [] [] [] |
|
||||||
ptx | [] [] [] [] [] [] [] | 19
|
gpe-go | [] [] [] |
|
||||||
python | | 0
|
gpe-login | [] [] [] [] |
|
||||||
recode | [] [] [] [] [] [] | 15
|
gpe-ownerinfo | [] [] [] [] |
|
||||||
sed | [] [] [] [] [] [] | 23
|
gpe-sketchbook | [] [] [] [] |
|
||||||
sh-utils | [] | 8
|
gpe-su | [] [] [] [] |
|
||||||
sharutils | [] [] [] [] | 13
|
gpe-taskmanager | [] [] [] [] |
|
||||||
sketch | [] () [] | 4
|
gpe-timesheet | [] [] [] [] |
|
||||||
soundtracker | [] | 6
|
gpe-today | [] [] [] [] |
|
||||||
sp | | 1
|
gpe-todo | [] [] [] [] |
|
||||||
tar | [] [] [] [] [] [] [] | 18
|
gphoto2 | [] |
|
||||||
texinfo | [] [] | 10
|
gprof | [] [] |
|
||||||
textutils | [] [] [] [] [] | 13
|
gpsdrive | () () [] |
|
||||||
util-linux | [] [] [] | 10
|
gramadoir | () [] |
|
||||||
vorbis-tools | [] | 2
|
grep | [] [] [] [] [] |
|
||||||
wastesedge | | 0
|
gretl | |
|
||||||
wdiff | [] [] [] [] [] | 14
|
gtick | [] [] [] |
|
||||||
wget | [] [] [] [] [] [] [] [] | 24
|
hello | [] [] [] [] [] [] [] [] [] [] |
|
||||||
+----------------------------------------+
|
id-utils | [] [] [] [] |
|
||||||
36 teams no pl pt pt_BR ru sk sl sv tr uk zh_TW
|
indent | [] [] [] [] |
|
||||||
67 domains 4 15 2 24 26 12 10 47 42 4 8 594
|
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
|
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
|
visible blocks let us expect. This is because a few extra PO files are
|
||||||
@ -406,7 +742,7 @@ 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
|
lag between the mere existence a PO file and its wide availability in a
|
||||||
distribution.
|
distribution.
|
||||||
|
|
||||||
If July 2002 seems to be old, you may fetch a more recent copy of
|
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
|
this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date
|
||||||
matrix with full percentage details can be found at
|
matrix with full percentage details can be found at
|
||||||
`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
|
`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
|
||||||
@ -414,7 +750,7 @@ matrix with full percentage details can be found at
|
|||||||
Using `gettext' in new packages
|
Using `gettext' in new packages
|
||||||
===============================
|
===============================
|
||||||
|
|
||||||
If you are writing a freely available program and want to
|
If you are writing a freely available program and want to
|
||||||
internationalize it you are welcome to use GNU `gettext' in your
|
internationalize it you are welcome to use GNU `gettext' in your
|
||||||
package. Of course you have to respect the GNU Library General Public
|
package. Of course you have to respect the GNU Library General Public
|
||||||
License which covers the use of the GNU `gettext' library. This means
|
License which covers the use of the GNU `gettext' library. This means
|
||||||
@ -423,7 +759,7 @@ library, whereas only free software can use `libintl' as a static
|
|||||||
library or use modified versions of `libintl'.
|
library or use modified versions of `libintl'.
|
||||||
|
|
||||||
Once the sources are changed appropriately and the setup can handle
|
Once the sources are changed appropriately and the setup can handle
|
||||||
to use of `gettext' the only thing missing are the translations. The
|
the use of `gettext' the only thing missing are the translations. The
|
||||||
Free Translation Project is also available for packages which are not
|
Free Translation Project is also available for packages which are not
|
||||||
developed inside the GNU project. Therefore the information given above
|
developed inside the GNU project. Therefore the information given above
|
||||||
applies also for every other Free Software Project. Contact
|
applies also for every other Free Software Project. Contact
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
2004-05-26 gettextize <bug-gnu-gettext@gnu.org>
|
||||||
|
|
||||||
|
* Makefile.am (SUBDIRS): Add m4.
|
||||||
|
(DIST_SUBDIRS): Add m4.
|
||||||
|
(ACLOCAL_AMFLAGS): New variable.
|
||||||
|
* configure.ac (AC_CONFIG_FILES): Add m4/Makefile.
|
||||||
|
|
||||||
2004-04-19 Angus Leeming <leeming@lyx.org>
|
2004-04-19 Angus Leeming <leeming@lyx.org>
|
||||||
|
|
||||||
* README.MacOSX: update to reflect Jean-Marc's comments to the list.
|
* README.MacOSX: update to reflect Jean-Marc's comments to the list.
|
||||||
|
@ -6,12 +6,12 @@ MAINTAINERCLEANFILES += $(srcdir)/aclocal.m4 \
|
|||||||
$(srcdir)/configure \
|
$(srcdir)/configure \
|
||||||
$(srcdir)/acinclude.m4
|
$(srcdir)/acinclude.m4
|
||||||
|
|
||||||
DIST_SUBDIRS = config development intl po boost src sourcedoc lib
|
DIST_SUBDIRS = m4 config development intl po boost src sourcedoc lib
|
||||||
|
|
||||||
if USE_INCLUDED_BOOST
|
if USE_INCLUDED_BOOST
|
||||||
SUBDIRS = config development intl po boost src sourcedoc lib
|
SUBDIRS = m4 config development intl po boost src sourcedoc lib
|
||||||
else
|
else
|
||||||
SUBDIRS = config development intl po src sourcedoc lib
|
SUBDIRS = m4 config development intl po src sourcedoc lib
|
||||||
endif
|
endif
|
||||||
|
|
||||||
EXTRA_DIST = ANNOUNCE INSTALL.OS2 INSTALL.autoconf README.OS2 \
|
EXTRA_DIST = ANNOUNCE INSTALL.OS2 INSTALL.autoconf README.OS2 \
|
||||||
@ -71,3 +71,5 @@ lgbtags:
|
|||||||
etags --totals=yes --recurse=yes -o TAGS $(top_srcdir)/*
|
etags --totals=yes --recurse=yes -o TAGS $(top_srcdir)/*
|
||||||
|
|
||||||
.PHONY: doxydoc
|
.PHONY: doxydoc
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
ACLOCAL="aclocal"
|
ACLOCAL="aclocal -I m4"
|
||||||
AUTOHEADER="autoheader"
|
AUTOHEADER="autoheader"
|
||||||
AUTOMAKE="automake -a -c --foreign"
|
AUTOMAKE="automake -a -c --foreign"
|
||||||
AUTOCONF="autoconf"
|
AUTOCONF="autoconf"
|
||||||
ACINCLUDE_FILES="lyxinclude.m4 libtool.m4 codeset.m4 intmax.m4 longdouble.m4 longlong.m4 nls.m4 printf-posix.m4 signed.m4 size_max.m4 wchar_t.m4 wint_t.m4 xsize.m4 gettext.m4 glibc21.m4 iconv.m4 isc-posix.m4 lcmessage.m4 progtest.m4 xforms.m4 qt.m4 gtk--.m4 gnome--.m4 gnome.m4 aspell.m4 pspell.m4 cygwin.m4 pkg.m4"
|
ACINCLUDE_FILES="lyxinclude.m4 libtool.m4 xforms.m4 qt.m4 gtk--.m4 gnome--.m4 gnome.m4 aspell.m4 pspell.m4 cygwin.m4 pkg.m4"
|
||||||
|
|
||||||
# Discover what version of autoconf we are using.
|
# Discover what version of autoconf we are using.
|
||||||
autoversion=`$AUTOCONF --version | head -n 1`
|
autoversion=`$AUTOCONF --version | head -n 1`
|
||||||
|
@ -3,31 +3,14 @@ include $(top_srcdir)/config/common.am
|
|||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
common.am \
|
common.am \
|
||||||
aspell.m4 \
|
aspell.m4 \
|
||||||
codeset.m4 \
|
|
||||||
cygwin.m4 \
|
cygwin.m4 \
|
||||||
gettext.m4 \
|
|
||||||
glibc21.m4 \
|
|
||||||
gnome--.m4 \
|
gnome--.m4 \
|
||||||
gnome.m4 \
|
gnome.m4 \
|
||||||
gtk--.m4 \
|
gtk--.m4 \
|
||||||
iconv.m4 \
|
|
||||||
intmax.m4 \
|
|
||||||
isc-posix.m4 \
|
|
||||||
lcmessage.m4 \
|
|
||||||
libtool.m4 \
|
libtool.m4 \
|
||||||
longdouble.m4 \
|
|
||||||
longlong.m4 \
|
|
||||||
lyxinclude25x.m4 \
|
lyxinclude25x.m4 \
|
||||||
lyxinclude.m4 \
|
lyxinclude.m4 \
|
||||||
nls.m4 \
|
|
||||||
pkg.m4 \
|
pkg.m4 \
|
||||||
printf-posix.m4 \
|
|
||||||
progtest.m4 \
|
|
||||||
pspell.m4 \
|
pspell.m4 \
|
||||||
qt.m4 \
|
qt.m4 \
|
||||||
signed.m4 \
|
xforms.m4
|
||||||
size_max.m4 \
|
|
||||||
wchar_t.m4 \
|
|
||||||
wint_t.m4 \
|
|
||||||
xforms.m4 \
|
|
||||||
xsize.m4
|
|
||||||
|
@ -1,32 +1,20 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# mkinstalldirs --- make directory hierarchy
|
# mkinstalldirs --- make directory hierarchy
|
||||||
|
# Author: Noah Friedman <friedman@prep.ai.mit.edu>
|
||||||
scriptversion=2004-02-15.20
|
|
||||||
|
|
||||||
# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
|
|
||||||
# Created: 1993-05-16
|
# Created: 1993-05-16
|
||||||
# Public domain.
|
# Public domain
|
||||||
#
|
|
||||||
# This file is maintained in Automake, please report
|
|
||||||
# bugs to <bug-automake@gnu.org> or send patches to
|
|
||||||
# <automake-patches@gnu.org>.
|
|
||||||
|
|
||||||
errstatus=0
|
errstatus=0
|
||||||
dirmode=""
|
dirmode=""
|
||||||
|
|
||||||
usage="\
|
usage="\
|
||||||
Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
|
Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
|
||||||
|
|
||||||
Create each directory DIR (with mode MODE, if specified), including all
|
|
||||||
leading file name components.
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>."
|
|
||||||
|
|
||||||
# process command line arguments
|
# process command line arguments
|
||||||
while test $# -gt 0 ; do
|
while test $# -gt 0 ; do
|
||||||
case $1 in
|
case $1 in
|
||||||
-h | --help | --h*) # -h for help
|
-h | --help | --h*) # -h for help
|
||||||
echo "$usage"
|
echo "$usage" 1>&2
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
-m) # -m PERM arg
|
-m) # -m PERM arg
|
||||||
@ -35,10 +23,6 @@ while test $# -gt 0 ; do
|
|||||||
dirmode=$1
|
dirmode=$1
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
--version)
|
|
||||||
echo "$0 $scriptversion"
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
--) # stop option processing
|
--) # stop option processing
|
||||||
shift
|
shift
|
||||||
break
|
break
|
||||||
@ -66,37 +50,17 @@ case $# in
|
|||||||
0) exit 0 ;;
|
0) exit 0 ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
|
|
||||||
# mkdir -p a/c at the same time, both will detect that a is missing,
|
|
||||||
# one will create a, then the other will try to create a and die with
|
|
||||||
# a "File exists" error. This is a problem when calling mkinstalldirs
|
|
||||||
# from a parallel make. We use --version in the probe to restrict
|
|
||||||
# ourselves to GNU mkdir, which is thread-safe.
|
|
||||||
case $dirmode in
|
case $dirmode in
|
||||||
'')
|
'')
|
||||||
if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
|
if mkdir -p -- . 2>/dev/null; then
|
||||||
echo "mkdir -p -- $*"
|
echo "mkdir -p -- $*"
|
||||||
exec mkdir -p -- "$@"
|
exec mkdir -p -- "$@"
|
||||||
else
|
|
||||||
# On NextStep and OpenStep, the `mkdir' command does not
|
|
||||||
# recognize any option. It will interpret all options as
|
|
||||||
# directories to create, and then abort because `.' already
|
|
||||||
# exists.
|
|
||||||
test -d ./-p && rmdir ./-p
|
|
||||||
test -d ./--version && rmdir ./--version
|
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
|
if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
|
||||||
test ! -d ./--version; then
|
|
||||||
echo "mkdir -m $dirmode -p -- $*"
|
echo "mkdir -m $dirmode -p -- $*"
|
||||||
exec mkdir -m "$dirmode" -p -- "$@"
|
exec mkdir -m "$dirmode" -p -- "$@"
|
||||||
else
|
|
||||||
# Clean up after NextStep and OpenStep mkdir.
|
|
||||||
for d in ./-m ./-p ./--version "./$dirmode";
|
|
||||||
do
|
|
||||||
test -d $d && rmdir $d
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@ -120,17 +84,17 @@ do
|
|||||||
mkdir "$pathcomp" || lasterr=$?
|
mkdir "$pathcomp" || lasterr=$?
|
||||||
|
|
||||||
if test ! -d "$pathcomp"; then
|
if test ! -d "$pathcomp"; then
|
||||||
errstatus=$lasterr
|
errstatus=$lasterr
|
||||||
else
|
else
|
||||||
if test ! -z "$dirmode"; then
|
if test ! -z "$dirmode"; then
|
||||||
echo "chmod $dirmode $pathcomp"
|
echo "chmod $dirmode $pathcomp"
|
||||||
lasterr=""
|
lasterr=""
|
||||||
chmod "$dirmode" "$pathcomp" || lasterr=$?
|
chmod "$dirmode" "$pathcomp" || lasterr=$?
|
||||||
|
|
||||||
if test ! -z "$lasterr"; then
|
if test ! -z "$lasterr"; then
|
||||||
errstatus=$lasterr
|
errstatus=$lasterr
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -143,8 +107,5 @@ exit $errstatus
|
|||||||
# Local Variables:
|
# Local Variables:
|
||||||
# mode: shell-script
|
# mode: shell-script
|
||||||
# sh-indentation: 2
|
# sh-indentation: 2
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-end: "$"
|
|
||||||
# End:
|
# End:
|
||||||
|
# mkinstalldirs ends here
|
||||||
|
@ -388,7 +388,7 @@ int mkstemp(char*);
|
|||||||
|
|
||||||
### Finish the work.
|
### Finish the work.
|
||||||
AC_CONFIG_SUBDIRS(lib lib/reLyX)
|
AC_CONFIG_SUBDIRS(lib lib/reLyX)
|
||||||
AC_CONFIG_FILES([Makefile \
|
AC_CONFIG_FILES([Makefile m4/Makefile \
|
||||||
boost/Makefile \
|
boost/Makefile \
|
||||||
boost/libs/Makefile \
|
boost/libs/Makefile \
|
||||||
boost/libs/filesystem/Makefile \
|
boost/libs/filesystem/Makefile \
|
||||||
|
@ -1,13 +1,4 @@
|
|||||||
2001-10-08 Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>
|
2004-01-29 GNU <bug-gnu-gettext@gnu.org>
|
||||||
|
|
||||||
* update to gettext 0.10.40
|
* Version 0.14.1 released.
|
||||||
|
|
||||||
2001-07-04 Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>
|
|
||||||
|
|
||||||
* Makefile.in ($(OBJECTS)):
|
|
||||||
(INCLUDES): config.h is in src/
|
|
||||||
|
|
||||||
2001-05-23 GNU <bug-gnu-utils@gnu.org>
|
|
||||||
|
|
||||||
* update to gettext 0.10.38.
|
|
||||||
|
|
||||||
|
340
intl/Makefile.in
340
intl/Makefile.in
@ -1,5 +1,5 @@
|
|||||||
# Makefile for directory with message catalog handling in GNU NLS Utilities.
|
# Makefile for directory with message catalog handling library of GNU gettext
|
||||||
# Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc.
|
# Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify it
|
# 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
|
# under the terms of the GNU Library General Public License as published
|
||||||
@ -24,7 +24,7 @@ SHELL = /bin/sh
|
|||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
top_builddir = ..
|
top_builddir = ..
|
||||||
VPATH = @srcdir@
|
VPATH = $(srcdir)
|
||||||
|
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
@ -40,7 +40,7 @@ subdir = intl
|
|||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
MKINSTALLDIRS = @MKINSTALLDIRS@
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac`
|
mkinstalldirs = $(SHELL) $(MKINSTALLDIRS)
|
||||||
|
|
||||||
l = @INTL_LIBTOOL_SUFFIX_PREFIX@
|
l = @INTL_LIBTOOL_SUFFIX_PREFIX@
|
||||||
|
|
||||||
@ -52,57 +52,91 @@ YACC = @INTLBISON@ -y -d
|
|||||||
YFLAGS = --name-prefix=__gettext
|
YFLAGS = --name-prefix=__gettext
|
||||||
|
|
||||||
DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \
|
DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \
|
||||||
-DLIBDIR=\"$(libdir)\" @DEFS@
|
-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@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
|
||||||
COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
|
COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
|
||||||
|
|
||||||
HEADERS = $(COMHDRS) libgnuintl.h libgettext.h loadinfo.h
|
HEADERS = \
|
||||||
COMHDRS = gettext.h gettextP.h hash-string.h
|
gmo.h \
|
||||||
SOURCES = $(COMSRCS) intl-compat.c
|
gettextP.h \
|
||||||
COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \
|
hash-string.h \
|
||||||
finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \
|
loadinfo.h \
|
||||||
explodename.c dcigettext.c dcngettext.c dngettext.c ngettext.c plural.y \
|
plural-exp.h \
|
||||||
localcharset.c
|
eval-plural.h \
|
||||||
OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \
|
localcharset.h \
|
||||||
finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \
|
relocatable.h \
|
||||||
explodename.$lo dcigettext.$lo dcngettext.$lo dngettext.$lo ngettext.$lo \
|
xsize.h \
|
||||||
plural.$lo localcharset.$lo
|
printf-args.h printf-args.c \
|
||||||
GETTOBJS = intl-compat.$lo
|
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 \
|
DISTFILES.common = Makefile.in \
|
||||||
config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES)
|
config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES)
|
||||||
DISTFILES.generated = plural.c
|
DISTFILES.generated = plural.c
|
||||||
DISTFILES.normal = VERSION
|
DISTFILES.normal = VERSION
|
||||||
DISTFILES.gettext = COPYING.LIB-2 COPYING.LIB-2.1 libintl.glibc
|
DISTFILES.gettext = COPYING.LIB-2.0 COPYING.LIB-2.1 libintl.glibc \
|
||||||
DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c
|
libgnuintl.h_vms Makefile.vms \
|
||||||
|
libgnuintl.h.msvc-static libgnuintl.h.msvc-shared README.woe32 Makefile.msvc
|
||||||
# Libtool's library version information for libintl.
|
DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c \
|
||||||
# Before making a gettext release, the gettext maintainer must change this
|
COPYING.LIB-2 gettext.h libgettext.h plural-eval.c libgnuintl.h
|
||||||
# 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=1
|
|
||||||
LTV_REVISION=1
|
|
||||||
LTV_AGE=0
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
.SUFFIXES: .c .y .o .lo .sin .sed
|
|
||||||
.c.o:
|
|
||||||
$(COMPILE) $<
|
|
||||||
.c.lo:
|
|
||||||
$(LIBTOOL) --mode=compile $(COMPILE) $<
|
|
||||||
|
|
||||||
.y.c:
|
|
||||||
$(YACC) $(YFLAGS) --output $@ $<
|
|
||||||
rm -f $*.h
|
|
||||||
|
|
||||||
.sin.sed:
|
|
||||||
sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $< > t-$@
|
|
||||||
mv t-$@ $@
|
|
||||||
|
|
||||||
INCLUDES = -I../src -I. -I$(top_srcdir)/intl
|
|
||||||
|
|
||||||
all: all-@USE_INCLUDED_LIBINTL@
|
all: all-@USE_INCLUDED_LIBINTL@
|
||||||
all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed
|
all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed
|
||||||
@ -118,23 +152,102 @@ libintl.a libgnuintl.a: $(OBJECTS)
|
|||||||
libintl.la libgnuintl.la: $(OBJECTS)
|
libintl.la libgnuintl.la: $(OBJECTS)
|
||||||
$(LIBTOOL) --mode=link \
|
$(LIBTOOL) --mode=link \
|
||||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \
|
$(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \
|
||||||
$(OBJECTS) @LIBICONV@ \
|
$(OBJECTS) @LTLIBICONV@ $(LIBS) -lc \
|
||||||
-version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \
|
-version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \
|
||||||
-rpath $(libdir) \
|
-rpath $(libdir) \
|
||||||
-no-undefined
|
-no-undefined
|
||||||
|
|
||||||
libintl.h: libgnuintl.h
|
# Libtool's library version information for libintl.
|
||||||
cp $(srcdir)/libgnuintl.h libintl.h
|
# 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
|
||||||
|
|
||||||
charset.alias: config.charset
|
.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../src
|
||||||
|
|
||||||
|
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-$@
|
$(SHELL) $(srcdir)/config.charset '@host@' > t-$@
|
||||||
mv t-$@ $@
|
mv t-$@ $@
|
||||||
|
|
||||||
check: all
|
check: all
|
||||||
|
|
||||||
# This installation goal is only used in GNU gettext. Packages which
|
|
||||||
# only use the library should use install instead.
|
|
||||||
|
|
||||||
# We must not install the libintl.h/libintl.a files if we are on a
|
# 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
|
# system which has the GNU gettext() function in its C library or in a
|
||||||
# separate library.
|
# separate library.
|
||||||
@ -142,17 +255,35 @@ check: all
|
|||||||
# package, you have to use `configure --with-included-gettext'.
|
# package, you have to use `configure --with-included-gettext'.
|
||||||
install: install-exec install-data
|
install: install-exec install-data
|
||||||
install-exec: all
|
install-exec: all
|
||||||
if test "$(PACKAGE)" = "gettext" \
|
if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
|
||||||
&& test '@INTLOBJS@' = '$(GETTOBJS)'; then \
|
&& test '@USE_INCLUDED_LIBINTL@' = yes; then \
|
||||||
$(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \
|
$(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \
|
||||||
$(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \
|
$(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \
|
||||||
$(LIBTOOL) --mode=install \
|
$(LIBTOOL) --mode=install \
|
||||||
$(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \
|
$(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 \
|
else \
|
||||||
: ; \
|
: ; \
|
||||||
fi
|
fi
|
||||||
if test '@USE_INCLUDED_LIBINTL@' = yes; then \
|
if test '@USE_INCLUDED_LIBINTL@' = yes; then \
|
||||||
$(mkinstalldirs) $(DESTDIR)$(libdir); \
|
test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \
|
||||||
temp=$(DESTDIR)$(libdir)/t-charset.alias; \
|
temp=$(DESTDIR)$(libdir)/t-charset.alias; \
|
||||||
dest=$(DESTDIR)$(libdir)/charset.alias; \
|
dest=$(DESTDIR)$(libdir)/charset.alias; \
|
||||||
if test -f $(DESTDIR)$(libdir)/charset.alias; then \
|
if test -f $(DESTDIR)$(libdir)/charset.alias; then \
|
||||||
@ -181,11 +312,11 @@ install-exec: all
|
|||||||
: ; \
|
: ; \
|
||||||
fi
|
fi
|
||||||
install-data: all
|
install-data: all
|
||||||
if test "$(PACKAGE)" = "gettext"; then \
|
if test "$(PACKAGE)" = "gettext-tools"; then \
|
||||||
$(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
|
$(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
|
||||||
$(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \
|
$(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \
|
||||||
$(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \
|
$(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \
|
||||||
dists="COPYING.LIB-2 COPYING.LIB-2.1 $(DISTFILES.common)"; \
|
dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \
|
||||||
for file in $$dists; do \
|
for file in $$dists; do \
|
||||||
$(INSTALL_DATA) $(srcdir)/$$file \
|
$(INSTALL_DATA) $(srcdir)/$$file \
|
||||||
$(DESTDIR)$(gettextsrcdir)/$$file; \
|
$(DESTDIR)$(gettextsrcdir)/$$file; \
|
||||||
@ -205,18 +336,51 @@ install-data: all
|
|||||||
: ; \
|
: ; \
|
||||||
fi
|
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.
|
# Define this as empty until I found a useful application.
|
||||||
installcheck:
|
installcheck:
|
||||||
|
|
||||||
uninstall:
|
uninstall:
|
||||||
if test "$(PACKAGE)" = "gettext" \
|
if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
|
||||||
&& test '@INTLOBJS@' = '$(GETTOBJS)'; then \
|
&& test '@USE_INCLUDED_LIBINTL@' = yes; then \
|
||||||
rm -f $(DESTDIR)$(includedir)/libintl.h; \
|
rm -f $(DESTDIR)$(includedir)/libintl.h; \
|
||||||
$(LIBTOOL) --mode=uninstall \
|
$(LIBTOOL) --mode=uninstall \
|
||||||
rm -f $(DESTDIR)$(libdir)/libintl.$la; \
|
rm -f $(DESTDIR)$(libdir)/libintl.$la; \
|
||||||
else \
|
else \
|
||||||
: ; \
|
: ; \
|
||||||
fi
|
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 '@USE_INCLUDED_LIBINTL@' = yes; then \
|
||||||
if test -f $(DESTDIR)$(libdir)/charset.alias; then \
|
if test -f $(DESTDIR)$(libdir)/charset.alias; then \
|
||||||
temp=$(DESTDIR)$(libdir)/t-charset.alias; \
|
temp=$(DESTDIR)$(libdir)/t-charset.alias; \
|
||||||
@ -243,25 +407,36 @@ uninstall:
|
|||||||
else \
|
else \
|
||||||
: ; \
|
: ; \
|
||||||
fi
|
fi
|
||||||
if test "$(PACKAGE)" = "gettext"; then \
|
if test "$(PACKAGE)" = "gettext-tools"; then \
|
||||||
for file in VERSION ChangeLog COPYING.LIB-2 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \
|
for file in VERSION ChangeLog COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \
|
||||||
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
|
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
|
||||||
done; \
|
done; \
|
||||||
else \
|
else \
|
||||||
: ; \
|
: ; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
info dvi:
|
info dvi ps pdf html:
|
||||||
|
|
||||||
$(OBJECTS): ../src/config.h libgnuintl.h
|
$(OBJECTS): ../src/config.h libgnuintl.h
|
||||||
bindtextdom.$lo finddomain.$lo loadmsgcat.$lo: gettextP.h gettext.h loadinfo.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
|
||||||
dcgettext.$lo: gettextP.h gettext.h hash-string.h 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: TAGS
|
||||||
|
|
||||||
TAGS: $(HEADERS) $(SOURCES)
|
TAGS: $(HEADERS) $(SOURCES)
|
||||||
here=`pwd`; cd $(srcdir) && etags -o $$here/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: ID
|
||||||
|
|
||||||
ID: $(HEADERS) $(SOURCES)
|
ID: $(HEADERS) $(SOURCES)
|
||||||
@ -269,15 +444,15 @@ ID: $(HEADERS) $(SOURCES)
|
|||||||
|
|
||||||
|
|
||||||
mostlyclean:
|
mostlyclean:
|
||||||
rm -f *.a *.la *.o *.lo core core.*
|
rm -f *.a *.la *.o *.obj *.lo core core.*
|
||||||
rm -f libintl.h charset.alias ref-add.sed ref-del.sed
|
rm -f libgnuintl.h libintl.h charset.alias ref-add.sed ref-del.sed
|
||||||
rm -f -r .libs _libs
|
rm -f -r .libs _libs
|
||||||
|
|
||||||
clean: mostlyclean
|
clean: mostlyclean
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
rm -f Makefile ID TAGS
|
rm -f Makefile ID TAGS
|
||||||
if test "$(PACKAGE)" = gettext; then \
|
if test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; then \
|
||||||
rm -f ChangeLog.inst $(DISTFILES.normal); \
|
rm -f ChangeLog.inst $(DISTFILES.normal); \
|
||||||
else \
|
else \
|
||||||
: ; \
|
: ; \
|
||||||
@ -292,21 +467,26 @@ maintainer-clean: distclean
|
|||||||
# other files which should not be distributed in other packages.
|
# other files which should not be distributed in other packages.
|
||||||
distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
|
distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
|
||||||
dist distdir: Makefile
|
dist distdir: Makefile
|
||||||
if test "$(PACKAGE)" = gettext; then \
|
if test "$(PACKAGE)" = "gettext-tools"; then \
|
||||||
additional="$(DISTFILES.gettext)"; \
|
: ; \
|
||||||
else \
|
else \
|
||||||
additional="$(DISTFILES.normal)"; \
|
if test "$(PACKAGE)" = "gettext-runtime"; then \
|
||||||
fi; \
|
additional="$(DISTFILES.gettext)"; \
|
||||||
$(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \
|
else \
|
||||||
for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \
|
additional="$(DISTFILES.normal)"; \
|
||||||
if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
|
fi; \
|
||||||
ln $$dir/$$file $(distdir) 2> /dev/null \
|
$(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \
|
||||||
|| cp -p $$dir/$$file $(distdir); \
|
for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \
|
||||||
done
|
if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
|
||||||
|
cp -p $$dir/$$file $(distdir); \
|
||||||
|
done; \
|
||||||
|
fi
|
||||||
|
|
||||||
Makefile: Makefile.in ../config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
cd .. \
|
cd $(top_builddir) && $(SHELL) ./config.status
|
||||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(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.
|
# 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.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
@ -1 +1 @@
|
|||||||
GNU gettext library from gettext-0.10.40
|
GNU gettext library from gettext-0.14.1
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Implementation of the bindtextdomain(3) function
|
/* Implementation of the bindtextdomain(3) function
|
||||||
Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -45,8 +45,8 @@
|
|||||||
names than the internal variables in GNU libc, otherwise programs
|
names than the internal variables in GNU libc, otherwise programs
|
||||||
using libintl.a cannot be linked statically. */
|
using libintl.a cannot be linked statically. */
|
||||||
#if !defined _LIBC
|
#if !defined _LIBC
|
||||||
# define _nl_default_dirname _nl_default_dirname__
|
# define _nl_default_dirname libintl_nl_default_dirname
|
||||||
# define _nl_domain_bindings _nl_domain_bindings__
|
# define _nl_domain_bindings libintl_nl_domain_bindings
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */
|
/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */
|
||||||
@ -58,12 +58,17 @@
|
|||||||
|
|
||||||
/* Contains the default location of the message catalogs. */
|
/* Contains the default location of the message catalogs. */
|
||||||
extern const char _nl_default_dirname[];
|
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. */
|
/* List with bindings of specific domains. */
|
||||||
extern struct binding *_nl_domain_bindings;
|
extern struct binding *_nl_domain_bindings;
|
||||||
|
|
||||||
/* Lock variable to protect the global data in the gettext implementation. */
|
/* Lock variable to protect the global data in the gettext implementation. */
|
||||||
__libc_rwlock_define (extern, _nl_state_lock)
|
__libc_rwlock_define (extern, _nl_state_lock attribute_hidden)
|
||||||
|
|
||||||
|
|
||||||
/* Names for the libintl functions are a problem. They must not clash
|
/* Names for the libintl functions are a problem. They must not clash
|
||||||
@ -77,15 +82,10 @@ __libc_rwlock_define (extern, _nl_state_lock)
|
|||||||
# define strdup(str) __strdup (str)
|
# define strdup(str) __strdup (str)
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
# define BINDTEXTDOMAIN bindtextdomain__
|
# define BINDTEXTDOMAIN libintl_bindtextdomain
|
||||||
# define BIND_TEXTDOMAIN_CODESET bind_textdomain_codeset__
|
# define BIND_TEXTDOMAIN_CODESET libintl_bind_textdomain_codeset
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Prototypes for local functions. */
|
|
||||||
static void set_binding_values PARAMS ((const char *domainname,
|
|
||||||
const char **dirnamep,
|
|
||||||
const char **codesetp));
|
|
||||||
|
|
||||||
/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP
|
/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP
|
||||||
to be used for the DOMAINNAME message catalog.
|
to be used for the DOMAINNAME message catalog.
|
||||||
If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not
|
If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not
|
||||||
@ -93,10 +93,8 @@ static void set_binding_values PARAMS ((const char *domainname,
|
|||||||
If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither
|
If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither
|
||||||
modified nor returned. */
|
modified nor returned. */
|
||||||
static void
|
static void
|
||||||
set_binding_values (domainname, dirnamep, codesetp)
|
set_binding_values (const char *domainname,
|
||||||
const char *domainname;
|
const char **dirnamep, const char **codesetp)
|
||||||
const char **dirnamep;
|
|
||||||
const char **codesetp;
|
|
||||||
{
|
{
|
||||||
struct binding *binding;
|
struct binding *binding;
|
||||||
int modified;
|
int modified;
|
||||||
@ -146,8 +144,8 @@ set_binding_values (domainname, dirnamep, codesetp)
|
|||||||
char *result = binding->dirname;
|
char *result = binding->dirname;
|
||||||
if (strcmp (dirname, result) != 0)
|
if (strcmp (dirname, result) != 0)
|
||||||
{
|
{
|
||||||
if (strcmp (dirname, _nl_default_dirname) == 0)
|
if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0)
|
||||||
result = (char *) _nl_default_dirname;
|
result = (char *) INTUSE(_nl_default_dirname);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if defined _LIBC || defined HAVE_STRDUP
|
#if defined _LIBC || defined HAVE_STRDUP
|
||||||
@ -162,7 +160,7 @@ set_binding_values (domainname, dirnamep, codesetp)
|
|||||||
|
|
||||||
if (__builtin_expect (result != NULL, 1))
|
if (__builtin_expect (result != NULL, 1))
|
||||||
{
|
{
|
||||||
if (binding->dirname != _nl_default_dirname)
|
if (binding->dirname != INTUSE(_nl_default_dirname))
|
||||||
free (binding->dirname);
|
free (binding->dirname);
|
||||||
|
|
||||||
binding->dirname = result;
|
binding->dirname = result;
|
||||||
@ -216,7 +214,7 @@ set_binding_values (domainname, dirnamep, codesetp)
|
|||||||
{
|
{
|
||||||
/* Simply return the default values. */
|
/* Simply return the default values. */
|
||||||
if (dirnamep)
|
if (dirnamep)
|
||||||
*dirnamep = _nl_default_dirname;
|
*dirnamep = INTUSE(_nl_default_dirname);
|
||||||
if (codesetp)
|
if (codesetp)
|
||||||
*codesetp = NULL;
|
*codesetp = NULL;
|
||||||
}
|
}
|
||||||
@ -238,11 +236,11 @@ set_binding_values (domainname, dirnamep, codesetp)
|
|||||||
|
|
||||||
if (dirname == NULL)
|
if (dirname == NULL)
|
||||||
/* The default value. */
|
/* The default value. */
|
||||||
dirname = _nl_default_dirname;
|
dirname = INTUSE(_nl_default_dirname);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (strcmp (dirname, _nl_default_dirname) == 0)
|
if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0)
|
||||||
dirname = _nl_default_dirname;
|
dirname = INTUSE(_nl_default_dirname);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char *result;
|
char *result;
|
||||||
@ -265,7 +263,7 @@ set_binding_values (domainname, dirnamep, codesetp)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* The default value. */
|
/* The default value. */
|
||||||
new_binding->dirname = (char *) _nl_default_dirname;
|
new_binding->dirname = (char *) INTUSE(_nl_default_dirname);
|
||||||
|
|
||||||
new_binding->codeset_cntr = 0;
|
new_binding->codeset_cntr = 0;
|
||||||
|
|
||||||
@ -321,7 +319,7 @@ set_binding_values (domainname, dirnamep, codesetp)
|
|||||||
if (0)
|
if (0)
|
||||||
{
|
{
|
||||||
failed_codeset:
|
failed_codeset:
|
||||||
if (new_binding->dirname != _nl_default_dirname)
|
if (new_binding->dirname != INTUSE(_nl_default_dirname))
|
||||||
free (new_binding->dirname);
|
free (new_binding->dirname);
|
||||||
failed_dirname:
|
failed_dirname:
|
||||||
free (new_binding);
|
free (new_binding);
|
||||||
@ -343,9 +341,7 @@ set_binding_values (domainname, dirnamep, codesetp)
|
|||||||
/* Specify that the DOMAINNAME message catalog will be found
|
/* Specify that the DOMAINNAME message catalog will be found
|
||||||
in DIRNAME rather than in the system locale data base. */
|
in DIRNAME rather than in the system locale data base. */
|
||||||
char *
|
char *
|
||||||
BINDTEXTDOMAIN (domainname, dirname)
|
BINDTEXTDOMAIN (const char *domainname, const char *dirname)
|
||||||
const char *domainname;
|
|
||||||
const char *dirname;
|
|
||||||
{
|
{
|
||||||
set_binding_values (domainname, &dirname, NULL);
|
set_binding_values (domainname, &dirname, NULL);
|
||||||
return (char *) dirname;
|
return (char *) dirname;
|
||||||
@ -354,9 +350,7 @@ BINDTEXTDOMAIN (domainname, dirname)
|
|||||||
/* Specify the character encoding in which the messages from the
|
/* Specify the character encoding in which the messages from the
|
||||||
DOMAINNAME message catalog will be returned. */
|
DOMAINNAME message catalog will be returned. */
|
||||||
char *
|
char *
|
||||||
BIND_TEXTDOMAIN_CODESET (domainname, codeset)
|
BIND_TEXTDOMAIN_CODESET (const char *domainname, const char *codeset)
|
||||||
const char *domainname;
|
|
||||||
const char *codeset;
|
|
||||||
{
|
{
|
||||||
set_binding_values (domainname, NULL, &codeset);
|
set_binding_values (domainname, NULL, &codeset);
|
||||||
return (char *) codeset;
|
return (char *) codeset;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Output a system dependent table of character encoding aliases.
|
# Output a system dependent table of character encoding aliases.
|
||||||
#
|
#
|
||||||
# Copyright (C) 2000-2001 Free Software Foundation, Inc.
|
# Copyright (C) 2000-2004 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify it
|
# 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
|
# under the terms of the GNU Library General Public License as published
|
||||||
@ -30,72 +30,77 @@
|
|||||||
# MIME charset name is preferred.
|
# MIME charset name is preferred.
|
||||||
# The current list of GNU canonical charset names is as follows.
|
# The current list of GNU canonical charset names is as follows.
|
||||||
#
|
#
|
||||||
# name used by which systems a MIME name?
|
# name MIME? used by which systems
|
||||||
# ASCII, ANSI_X3.4-1968 glibc solaris freebsd
|
# ASCII, ANSI_X3.4-1968 glibc solaris freebsd darwin
|
||||||
# ISO-8859-1 glibc aix hpux irix osf solaris freebsd yes
|
# ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd darwin
|
||||||
# ISO-8859-2 glibc aix hpux irix osf solaris freebsd yes
|
# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd darwin
|
||||||
# ISO-8859-3 glibc yes
|
# ISO-8859-3 Y glibc solaris
|
||||||
# ISO-8859-4 osf solaris freebsd yes
|
# ISO-8859-4 Y osf solaris freebsd darwin
|
||||||
# ISO-8859-5 glibc aix hpux irix osf solaris freebsd yes
|
# ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd darwin
|
||||||
# ISO-8859-6 glibc aix hpux solaris yes
|
# ISO-8859-6 Y glibc aix hpux solaris
|
||||||
# ISO-8859-7 glibc aix hpux irix osf solaris yes
|
# ISO-8859-7 Y glibc aix hpux irix osf solaris
|
||||||
# ISO-8859-8 glibc aix hpux osf solaris yes
|
# ISO-8859-8 Y glibc aix hpux osf solaris
|
||||||
# ISO-8859-9 glibc aix hpux irix osf solaris yes
|
# ISO-8859-9 Y glibc aix hpux irix osf solaris
|
||||||
# ISO-8859-13 glibc
|
# ISO-8859-13 glibc
|
||||||
# ISO-8859-15 glibc aix osf solaris freebsd
|
# ISO-8859-14 glibc
|
||||||
# KOI8-R glibc solaris freebsd yes
|
# ISO-8859-15 glibc aix osf solaris freebsd
|
||||||
# KOI8-U glibc freebsd yes
|
# KOI8-R Y glibc solaris freebsd darwin
|
||||||
# CP437 dos
|
# KOI8-U Y glibc freebsd darwin
|
||||||
# CP775 dos
|
# KOI8-T glibc
|
||||||
# CP850 aix osf dos
|
# CP437 dos
|
||||||
# CP852 dos
|
# CP775 dos
|
||||||
# CP855 dos
|
# CP850 aix osf dos
|
||||||
# CP856 aix
|
# CP852 dos
|
||||||
# CP857 dos
|
# CP855 dos
|
||||||
# CP861 dos
|
# CP856 aix
|
||||||
# CP862 dos
|
# CP857 dos
|
||||||
# CP864 dos
|
# CP861 dos
|
||||||
# CP865 dos
|
# CP862 dos
|
||||||
# CP866 freebsd dos
|
# CP864 dos
|
||||||
# CP869 dos
|
# CP865 dos
|
||||||
# CP874 win32 dos
|
# CP866 freebsd darwin dos
|
||||||
# CP922 aix
|
# CP869 dos
|
||||||
# CP932 aix win32 dos
|
# CP874 woe32 dos
|
||||||
# CP943 aix
|
# CP922 aix
|
||||||
# CP949 osf win32 dos
|
# CP932 aix woe32 dos
|
||||||
# CP950 win32 dos
|
# CP943 aix
|
||||||
# CP1046 aix
|
# CP949 osf woe32 dos
|
||||||
# CP1124 aix
|
# CP950 woe32 dos
|
||||||
# CP1129 aix
|
# CP1046 aix
|
||||||
# CP1250 win32
|
# CP1124 aix
|
||||||
# CP1251 glibc win32
|
# CP1125 dos
|
||||||
# CP1252 aix win32
|
# CP1129 aix
|
||||||
# CP1253 win32
|
# CP1250 woe32
|
||||||
# CP1254 win32
|
# CP1251 glibc solaris darwin woe32
|
||||||
# CP1255 win32
|
# CP1252 aix woe32
|
||||||
# CP1256 win32
|
# CP1253 woe32
|
||||||
# CP1257 win32
|
# CP1254 woe32
|
||||||
# GB2312 glibc aix hpux irix solaris freebsd yes
|
# CP1255 glibc woe32
|
||||||
# EUC-JP glibc aix hpux irix osf solaris freebsd yes
|
# CP1256 woe32
|
||||||
# EUC-KR glibc aix hpux irix osf solaris freebsd yes
|
# CP1257 woe32
|
||||||
# EUC-TW glibc aix hpux irix osf solaris
|
# GB2312 Y glibc aix hpux irix solaris freebsd darwin
|
||||||
# BIG5 glibc aix hpux osf solaris freebsd yes
|
# EUC-JP Y glibc aix hpux irix osf solaris freebsd darwin
|
||||||
# BIG5-HKSCS glibc
|
# EUC-KR Y glibc aix hpux irix osf solaris freebsd darwin
|
||||||
# GBK aix osf win32 dos
|
# EUC-TW glibc aix hpux irix osf solaris
|
||||||
# GB18030 glibc
|
# BIG5 Y glibc aix hpux osf solaris freebsd darwin
|
||||||
# SHIFT_JIS hpux osf solaris freebsd yes
|
# BIG5-HKSCS glibc solaris
|
||||||
# JOHAB glibc win32
|
# GBK glibc aix osf solaris woe32 dos
|
||||||
# TIS-620 glibc aix hpux osf solaris
|
# GB18030 glibc solaris
|
||||||
# VISCII glibc yes
|
# SHIFT_JIS Y hpux osf solaris freebsd darwin
|
||||||
# HP-ROMAN8 hpux
|
# JOHAB glibc solaris woe32
|
||||||
# HP-ARABIC8 hpux
|
# TIS-620 glibc aix hpux osf solaris
|
||||||
# HP-GREEK8 hpux
|
# VISCII Y glibc
|
||||||
# HP-HEBREW8 hpux
|
# TCVN5712-1 glibc
|
||||||
# HP-TURKISH8 hpux
|
# GEORGIAN-PS glibc
|
||||||
# HP-KANA8 hpux
|
# HP-ROMAN8 hpux
|
||||||
# DEC-KANJI osf
|
# HP-ARABIC8 hpux
|
||||||
# DEC-HANYU osf
|
# HP-GREEK8 hpux
|
||||||
# UTF-8 glibc aix hpux osf solaris yes
|
# 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
|
# Note: Names which are not marked as being a MIME name should not be used in
|
||||||
# Internet protocols for information interchange (mail, news, etc.).
|
# Internet protocols for information interchange (mail, news, etc.).
|
||||||
@ -116,6 +121,105 @@ echo "# It was automatically generated from config.charset."
|
|||||||
# List of references, updated during installation:
|
# List of references, updated during installation:
|
||||||
echo "# Packages using this file: "
|
echo "# Packages using this file: "
|
||||||
case "$os" in
|
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*)
|
linux* | *-gnu*)
|
||||||
# With glibc-2.1 or newer, we don't need any canonicalization,
|
# With glibc-2.1 or newer, we don't need any canonicalization,
|
||||||
# because glibc has iconv and both glibc and libiconv support all
|
# because glibc has iconv and both glibc and libiconv support all
|
||||||
@ -217,6 +321,7 @@ case "$os" in
|
|||||||
echo "646 ASCII"
|
echo "646 ASCII"
|
||||||
echo "ISO8859-1 ISO-8859-1"
|
echo "ISO8859-1 ISO-8859-1"
|
||||||
echo "ISO8859-2 ISO-8859-2"
|
echo "ISO8859-2 ISO-8859-2"
|
||||||
|
echo "ISO8859-3 ISO-8859-3"
|
||||||
echo "ISO8859-4 ISO-8859-4"
|
echo "ISO8859-4 ISO-8859-4"
|
||||||
echo "ISO8859-5 ISO-8859-5"
|
echo "ISO8859-5 ISO-8859-5"
|
||||||
echo "ISO8859-6 ISO-8859-6"
|
echo "ISO8859-6 ISO-8859-6"
|
||||||
@ -225,20 +330,27 @@ case "$os" in
|
|||||||
echo "ISO8859-9 ISO-8859-9"
|
echo "ISO8859-9 ISO-8859-9"
|
||||||
echo "ISO8859-15 ISO-8859-15"
|
echo "ISO8859-15 ISO-8859-15"
|
||||||
echo "koi8-r KOI8-R"
|
echo "koi8-r KOI8-R"
|
||||||
|
echo "ansi-1251 CP1251"
|
||||||
echo "BIG5 BIG5"
|
echo "BIG5 BIG5"
|
||||||
|
echo "Big5-HKSCS BIG5-HKSCS"
|
||||||
echo "gb2312 GB2312"
|
echo "gb2312 GB2312"
|
||||||
|
echo "GBK GBK"
|
||||||
|
echo "GB18030 GB18030"
|
||||||
echo "cns11643 EUC-TW"
|
echo "cns11643 EUC-TW"
|
||||||
echo "5601 EUC-KR"
|
echo "5601 EUC-KR"
|
||||||
|
echo "ko_KR.johap92 JOHAB"
|
||||||
echo "eucJP EUC-JP"
|
echo "eucJP EUC-JP"
|
||||||
echo "PCK SHIFT_JIS"
|
echo "PCK SHIFT_JIS"
|
||||||
echo "TIS620.2533 TIS-620"
|
echo "TIS620.2533 TIS-620"
|
||||||
#echo "sun_eu_greek ?" # what is this?
|
#echo "sun_eu_greek ?" # what is this?
|
||||||
echo "UTF-8 UTF-8"
|
echo "UTF-8 UTF-8"
|
||||||
;;
|
;;
|
||||||
freebsd*)
|
freebsd* | os2*)
|
||||||
# FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore
|
# FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore
|
||||||
# localcharset.c falls back to using the full locale name
|
# localcharset.c falls back to using the full locale name
|
||||||
# from the environment variables.
|
# 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 "C ASCII"
|
||||||
echo "US-ASCII ASCII"
|
echo "US-ASCII ASCII"
|
||||||
for l in la_LN lt_LN; do
|
for l in la_LN lt_LN; do
|
||||||
@ -270,6 +382,61 @@ case "$os" in
|
|||||||
echo "ja_JP.Shift_JIS SHIFT_JIS"
|
echo "ja_JP.Shift_JIS SHIFT_JIS"
|
||||||
echo "ko_KR.EUC EUC-KR"
|
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*)
|
||||||
# BeOS has a single locale, and it has UTF-8 encoding.
|
# BeOS has a single locale, and it has UTF-8 encoding.
|
||||||
echo "* UTF-8"
|
echo "* UTF-8"
|
||||||
@ -284,7 +451,7 @@ case "$os" in
|
|||||||
echo "# country is not the one your DOS machine actually uses, just"
|
echo "# country is not the one your DOS machine actually uses, just"
|
||||||
echo "# correct it in this file, and send a mail to"
|
echo "# correct it in this file, and send a mail to"
|
||||||
echo "# Juan Manuel Guerrero <st001906@hrz1.hrz.tu-darmstadt.de>"
|
echo "# Juan Manuel Guerrero <st001906@hrz1.hrz.tu-darmstadt.de>"
|
||||||
echo "# and Bruno Haible <haible@clisp.cons.org>."
|
echo "# and Bruno Haible <bruno@clisp.org>."
|
||||||
echo "#"
|
echo "#"
|
||||||
echo "C ASCII"
|
echo "C ASCII"
|
||||||
# ISO-8859-1 languages
|
# ISO-8859-1 languages
|
||||||
@ -383,6 +550,7 @@ case "$os" in
|
|||||||
echo "sq CP852"
|
echo "sq CP852"
|
||||||
echo "sq_AL CP852"
|
echo "sq_AL CP852"
|
||||||
echo "sr CP852" # CP852 or CP866 or CP855 ??
|
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 ??
|
echo "sr_YU CP852" # CP852 or CP866 or CP855 ??
|
||||||
# ISO-8859-3 languages
|
# ISO-8859-3 languages
|
||||||
echo "mt CP850"
|
echo "mt CP850"
|
||||||
@ -394,8 +562,10 @@ case "$os" in
|
|||||||
echo "bg_BG CP866" # not CP855 ??
|
echo "bg_BG CP866" # not CP855 ??
|
||||||
echo "mk CP866" # not CP855 ??
|
echo "mk CP866" # not CP855 ??
|
||||||
echo "mk_MK CP866" # not CP855 ??
|
echo "mk_MK CP866" # not CP855 ??
|
||||||
echo "ru KOI8-R" # not CP866 ??
|
echo "ru CP866"
|
||||||
echo "ru_RU KOI8-R" # not CP866 ??
|
echo "ru_RU CP866"
|
||||||
|
echo "uk CP1125"
|
||||||
|
echo "uk_UA CP1125"
|
||||||
# ISO-8859-6 languages
|
# ISO-8859-6 languages
|
||||||
echo "ar CP864"
|
echo "ar CP864"
|
||||||
echo "ar_AE CP864"
|
echo "ar_AE CP864"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Implementation of the dcgettext(3) function.
|
/* Implementation of the dcgettext(3) function.
|
||||||
Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -37,22 +37,20 @@
|
|||||||
# define DCGETTEXT __dcgettext
|
# define DCGETTEXT __dcgettext
|
||||||
# define DCIGETTEXT __dcigettext
|
# define DCIGETTEXT __dcigettext
|
||||||
#else
|
#else
|
||||||
# define DCGETTEXT dcgettext__
|
# define DCGETTEXT libintl_dcgettext
|
||||||
# define DCIGETTEXT dcigettext__
|
# define DCIGETTEXT libintl_dcigettext
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
|
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
|
||||||
locale. */
|
locale. */
|
||||||
char *
|
char *
|
||||||
DCGETTEXT (domainname, msgid, category)
|
DCGETTEXT (const char *domainname, const char *msgid, int category)
|
||||||
const char *domainname;
|
|
||||||
const char *msgid;
|
|
||||||
int category;
|
|
||||||
{
|
{
|
||||||
return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category);
|
return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
/* Alias for function name in GNU C Library. */
|
/* Alias for function name in GNU C Library. */
|
||||||
|
INTDEF(__dcgettext)
|
||||||
weak_alias (__dcgettext, dcgettext);
|
weak_alias (__dcgettext, dcgettext);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Implementation of the internal dcigettext function.
|
/* Implementation of the internal dcigettext function.
|
||||||
Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -33,14 +33,19 @@
|
|||||||
# define alloca __builtin_alloca
|
# define alloca __builtin_alloca
|
||||||
# define HAVE_ALLOCA 1
|
# define HAVE_ALLOCA 1
|
||||||
#else
|
#else
|
||||||
# if defined HAVE_ALLOCA_H || defined _LIBC
|
# ifdef _MSC_VER
|
||||||
# include <alloca.h>
|
# include <malloc.h>
|
||||||
|
# define alloca _alloca
|
||||||
# else
|
# else
|
||||||
# ifdef _AIX
|
# if defined HAVE_ALLOCA_H || defined _LIBC
|
||||||
#pragma alloca
|
# include <alloca.h>
|
||||||
# else
|
# else
|
||||||
# ifndef alloca
|
# ifdef _AIX
|
||||||
|
#pragma alloca
|
||||||
|
# else
|
||||||
|
# ifndef alloca
|
||||||
char *alloca ();
|
char *alloca ();
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
@ -56,13 +61,7 @@ extern int errno;
|
|||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#if !HAVE_STRCHR && !defined _LIBC
|
|
||||||
# ifndef strchr
|
|
||||||
# define strchr index
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined HAVE_UNISTD_H || defined _LIBC
|
#if defined HAVE_UNISTD_H || defined _LIBC
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
@ -70,11 +69,26 @@ extern int errno;
|
|||||||
|
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Guess whether integer division by zero raises signal SIGFPE.
|
||||||
|
Set to 1 only if you know for sure. In case of doubt, set to 0. */
|
||||||
|
# if defined __alpha__ || defined __arm__ || defined __i386__ \
|
||||||
|
|| defined __m68k__ || defined __s390__
|
||||||
|
# define INTDIV0_RAISES_SIGFPE 1
|
||||||
|
# else
|
||||||
|
# define INTDIV0_RAISES_SIGFPE 0
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if !INTDIV0_RAISES_SIGFPE
|
||||||
|
# include <signal.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined HAVE_SYS_PARAM_H || defined _LIBC
|
#if defined HAVE_SYS_PARAM_H || defined _LIBC
|
||||||
# include <sys/param.h>
|
# include <sys/param.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "gettextP.h"
|
#include "gettextP.h"
|
||||||
|
#include "plural-exp.h"
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
# include <libintl.h>
|
# include <libintl.h>
|
||||||
#else
|
#else
|
||||||
@ -107,10 +121,10 @@ extern int errno;
|
|||||||
names than the internal variables in GNU libc, otherwise programs
|
names than the internal variables in GNU libc, otherwise programs
|
||||||
using libintl.a cannot be linked statically. */
|
using libintl.a cannot be linked statically. */
|
||||||
#if !defined _LIBC
|
#if !defined _LIBC
|
||||||
# define _nl_default_default_domain _nl_default_default_domain__
|
# define _nl_default_default_domain libintl_nl_default_default_domain
|
||||||
# define _nl_current_default_domain _nl_current_default_domain__
|
# define _nl_current_default_domain libintl_nl_current_default_domain
|
||||||
# define _nl_default_dirname _nl_default_dirname__
|
# define _nl_default_dirname libintl_nl_default_dirname
|
||||||
# define _nl_domain_bindings _nl_domain_bindings__
|
# define _nl_domain_bindings libintl_nl_domain_bindings
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */
|
/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */
|
||||||
@ -134,13 +148,17 @@ extern int errno;
|
|||||||
char *getwd ();
|
char *getwd ();
|
||||||
# define getcwd(buf, max) getwd (buf)
|
# define getcwd(buf, max) getwd (buf)
|
||||||
# else
|
# else
|
||||||
|
# if VMS
|
||||||
|
# define getcwd(buf, max) (getcwd) (buf, max, 0)
|
||||||
|
# else
|
||||||
char *getcwd ();
|
char *getcwd ();
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# ifndef HAVE_STPCPY
|
# ifndef HAVE_STPCPY
|
||||||
static char *stpcpy PARAMS ((char *dest, const char *src));
|
static char *stpcpy (char *dest, const char *src);
|
||||||
# endif
|
# endif
|
||||||
# ifndef HAVE_MEMPCPY
|
# ifndef HAVE_MEMPCPY
|
||||||
static void *mempcpy PARAMS ((void *dest, const void *src, size_t n));
|
static void *mempcpy (void *dest, const void *src, size_t n);
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -198,16 +216,6 @@ static void *mempcpy PARAMS ((void *dest, const void *src, size_t n));
|
|||||||
# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
|
# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* XPG3 defines the result of `setlocale (category, NULL)' as:
|
|
||||||
``Directs `setlocale()' to query `category' and return the current
|
|
||||||
setting of `local'.''
|
|
||||||
However it does not specify the exact format. Neither do SUSV2 and
|
|
||||||
ISO C 99. So we can use this feature only on selected systems (e.g.
|
|
||||||
those using GNU C Library). */
|
|
||||||
#if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2)
|
|
||||||
# define HAVE_LOCALE_NULL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This is the type used for the search tree where known translations
|
/* This is the type used for the search tree where known translations
|
||||||
are stored. */
|
are stored. */
|
||||||
struct known_translation_t
|
struct known_translation_t
|
||||||
@ -244,11 +252,8 @@ static void *root;
|
|||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Function to compare two entries in the table of known translations. */
|
/* Function to compare two entries in the table of known translations. */
|
||||||
static int transcmp PARAMS ((const void *p1, const void *p2));
|
|
||||||
static int
|
static int
|
||||||
transcmp (p1, p2)
|
transcmp (const void *p1, const void *p2)
|
||||||
const void *p1;
|
|
||||||
const void *p2;
|
|
||||||
{
|
{
|
||||||
const struct known_translation_t *s1;
|
const struct known_translation_t *s1;
|
||||||
const struct known_translation_t *s2;
|
const struct known_translation_t *s2;
|
||||||
@ -272,39 +277,54 @@ transcmp (p1, p2)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef INTVARDEF
|
||||||
|
# define INTVARDEF(name)
|
||||||
|
#endif
|
||||||
|
#ifndef INTUSE
|
||||||
|
# define INTUSE(name) name
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Name of the default domain used for gettext(3) prior any call to
|
/* Name of the default domain used for gettext(3) prior any call to
|
||||||
textdomain(3). The default value for this is "messages". */
|
textdomain(3). The default value for this is "messages". */
|
||||||
const char _nl_default_default_domain[] = "messages";
|
const char _nl_default_default_domain[] attribute_hidden = "messages";
|
||||||
|
|
||||||
/* Value used as the default domain for gettext(3). */
|
/* Value used as the default domain for gettext(3). */
|
||||||
const char *_nl_current_default_domain = _nl_default_default_domain;
|
const char *_nl_current_default_domain attribute_hidden
|
||||||
|
= _nl_default_default_domain;
|
||||||
|
|
||||||
/* Contains the default location of the message catalogs. */
|
/* Contains the default location of the message catalogs. */
|
||||||
|
#if defined __EMX__
|
||||||
|
extern const char _nl_default_dirname[];
|
||||||
|
#else
|
||||||
const char _nl_default_dirname[] = LOCALEDIR;
|
const char _nl_default_dirname[] = LOCALEDIR;
|
||||||
|
INTVARDEF (_nl_default_dirname)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* List with bindings of specific domains created by bindtextdomain()
|
/* List with bindings of specific domains created by bindtextdomain()
|
||||||
calls. */
|
calls. */
|
||||||
struct binding *_nl_domain_bindings;
|
struct binding *_nl_domain_bindings;
|
||||||
|
|
||||||
/* Prototypes for local functions. */
|
/* Prototypes for local functions. */
|
||||||
static char *plural_lookup PARAMS ((struct loaded_l10nfile *domain,
|
static char *plural_lookup (struct loaded_l10nfile *domain,
|
||||||
unsigned long int n,
|
unsigned long int n,
|
||||||
const char *translation,
|
const char *translation, size_t translation_len)
|
||||||
size_t translation_len))
|
|
||||||
internal_function;
|
internal_function;
|
||||||
static unsigned long int plural_eval PARAMS ((struct expression *pexp,
|
static const char *guess_category_value (int category,
|
||||||
unsigned long int n))
|
const char *categoryname)
|
||||||
internal_function;
|
|
||||||
static const char *category_to_name PARAMS ((int category)) internal_function;
|
|
||||||
static const char *guess_category_value PARAMS ((int category,
|
|
||||||
const char *categoryname))
|
|
||||||
internal_function;
|
internal_function;
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include "../locale/localeinfo.h"
|
||||||
|
# define category_to_name(category) _nl_category_names[category]
|
||||||
|
#else
|
||||||
|
static const char *category_to_name (int category) internal_function;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* For those loosing systems which don't have `alloca' we have to add
|
/* For those loosing systems which don't have `alloca' we have to add
|
||||||
some additional code emulating it. */
|
some additional code emulating it. */
|
||||||
#ifdef HAVE_ALLOCA
|
#ifdef HAVE_ALLOCA
|
||||||
/* Nothing has to be done. */
|
/* Nothing has to be done. */
|
||||||
|
# define freea(p) /* nothing */
|
||||||
# define ADD_BLOCK(list, address) /* nothing */
|
# define ADD_BLOCK(list, address) /* nothing */
|
||||||
# define FREE_BLOCKS(list) /* nothing */
|
# define FREE_BLOCKS(list) /* nothing */
|
||||||
#else
|
#else
|
||||||
@ -329,11 +349,13 @@ struct block_list
|
|||||||
while (list != NULL) { \
|
while (list != NULL) { \
|
||||||
struct block_list *old = list; \
|
struct block_list *old = list; \
|
||||||
list = list->next; \
|
list = list->next; \
|
||||||
|
free (old->address); \
|
||||||
free (old); \
|
free (old); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
# undef alloca
|
# undef alloca
|
||||||
# define alloca(size) (malloc (size))
|
# define alloca(size) (malloc (size))
|
||||||
|
# define freea(p) free (p)
|
||||||
#endif /* have alloca */
|
#endif /* have alloca */
|
||||||
|
|
||||||
|
|
||||||
@ -357,12 +379,12 @@ typedef unsigned char transmem_block_t;
|
|||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
# define DCIGETTEXT __dcigettext
|
# define DCIGETTEXT __dcigettext
|
||||||
#else
|
#else
|
||||||
# define DCIGETTEXT dcigettext__
|
# define DCIGETTEXT libintl_dcigettext
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Lock variable to protect the global data in the gettext implementation. */
|
/* Lock variable to protect the global data in the gettext implementation. */
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
__libc_rwlock_define_initialized (, _nl_state_lock)
|
__libc_rwlock_define_initialized (, _nl_state_lock attribute_hidden)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Checking whether the binaries runs SUID must be done and glibc provides
|
/* Checking whether the binaries runs SUID must be done and glibc provides
|
||||||
@ -395,17 +417,15 @@ static int enable_secure;
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Get the function to evaluate the plural expression. */
|
||||||
|
#include "eval-plural.h"
|
||||||
|
|
||||||
/* Look up MSGID in the DOMAINNAME message catalog for the current
|
/* Look up MSGID in the DOMAINNAME message catalog for the current
|
||||||
CATEGORY locale and, if PLURAL is nonzero, search over string
|
CATEGORY locale and, if PLURAL is nonzero, search over string
|
||||||
depending on the plural form determined by N. */
|
depending on the plural form determined by N. */
|
||||||
char *
|
char *
|
||||||
DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
|
DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
|
||||||
const char *domainname;
|
int plural, unsigned long int n, int category)
|
||||||
const char *msgid1;
|
|
||||||
const char *msgid2;
|
|
||||||
int plural;
|
|
||||||
unsigned long int n;
|
|
||||||
int category;
|
|
||||||
{
|
{
|
||||||
#ifndef HAVE_ALLOCA
|
#ifndef HAVE_ALLOCA
|
||||||
struct block_list *block_list = NULL;
|
struct block_list *block_list = NULL;
|
||||||
@ -430,6 +450,15 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
|
|||||||
if (msgid1 == NULL)
|
if (msgid1 == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
if (category < 0 || category >= __LC_LAST || category == LC_ALL)
|
||||||
|
/* Bogus. */
|
||||||
|
return (plural == 0
|
||||||
|
? (char *) msgid1
|
||||||
|
/* Use the Germanic plural rule. */
|
||||||
|
: n == 1 ? (char *) msgid1 : (char *) msgid2);
|
||||||
|
#endif
|
||||||
|
|
||||||
__libc_rwlock_rdlock (_nl_state_lock);
|
__libc_rwlock_rdlock (_nl_state_lock);
|
||||||
|
|
||||||
/* If DOMAINNAME is NULL, we are interested in the default domain. If
|
/* If DOMAINNAME is NULL, we are interested in the default domain. If
|
||||||
@ -438,6 +467,12 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
|
|||||||
if (domainname == NULL)
|
if (domainname == NULL)
|
||||||
domainname = _nl_current_default_domain;
|
domainname = _nl_current_default_domain;
|
||||||
|
|
||||||
|
/* OS/2 specific: backward compatibility with older libintl versions */
|
||||||
|
#ifdef LC_MESSAGES_COMPAT
|
||||||
|
if (category == LC_MESSAGES_COMPAT)
|
||||||
|
category = LC_MESSAGES;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined HAVE_TSEARCH || defined _LIBC
|
#if defined HAVE_TSEARCH || defined _LIBC
|
||||||
msgid_len = strlen (msgid1) + 1;
|
msgid_len = strlen (msgid1) + 1;
|
||||||
|
|
||||||
@ -450,6 +485,7 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
|
|||||||
search->category = category;
|
search->category = category;
|
||||||
|
|
||||||
foundp = (struct known_translation_t **) tfind (search, &root, transcmp);
|
foundp = (struct known_translation_t **) tfind (search, &root, transcmp);
|
||||||
|
freea (search);
|
||||||
if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr)
|
if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr)
|
||||||
{
|
{
|
||||||
/* Now deal with plural. */
|
/* Now deal with plural. */
|
||||||
@ -486,7 +522,7 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (binding == NULL)
|
if (binding == NULL)
|
||||||
dirname = (char *) _nl_default_dirname;
|
dirname = (char *) INTUSE(_nl_default_dirname);
|
||||||
else if (IS_ABSOLUTE_PATH (binding->dirname))
|
else if (IS_ABSOLUTE_PATH (binding->dirname))
|
||||||
dirname = binding->dirname;
|
dirname = binding->dirname;
|
||||||
else
|
else
|
||||||
@ -514,17 +550,9 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ret == NULL)
|
if (ret == NULL)
|
||||||
{
|
/* We cannot get the current working directory. Don't signal an
|
||||||
/* We cannot get the current working directory. Don't signal an
|
error but simply return the default string. */
|
||||||
error but simply return the default string. */
|
goto return_untranslated;
|
||||||
FREE_BLOCKS (block_list);
|
|
||||||
__libc_rwlock_unlock (_nl_state_lock);
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
return (plural == 0
|
|
||||||
? (char *) msgid1
|
|
||||||
/* Use the Germanic plural rule. */
|
|
||||||
: n == 1 ? (char *) msgid1 : (char *) msgid2);
|
|
||||||
}
|
|
||||||
|
|
||||||
stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname);
|
stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname);
|
||||||
}
|
}
|
||||||
@ -581,16 +609,7 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
|
|||||||
domain. Return the MSGID. */
|
domain. Return the MSGID. */
|
||||||
if (strcmp (single_locale, "C") == 0
|
if (strcmp (single_locale, "C") == 0
|
||||||
|| strcmp (single_locale, "POSIX") == 0)
|
|| strcmp (single_locale, "POSIX") == 0)
|
||||||
{
|
break;
|
||||||
FREE_BLOCKS (block_list);
|
|
||||||
__libc_rwlock_unlock (_nl_state_lock);
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
return (plural == 0
|
|
||||||
? (char *) msgid1
|
|
||||||
/* Use the Germanic plural rule. */
|
|
||||||
: n == 1 ? (char *) msgid1 : (char *) msgid2);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Find structure describing the message catalog matching the
|
/* Find structure describing the message catalog matching the
|
||||||
DOMAINNAME and CATEGORY. */
|
DOMAINNAME and CATEGORY. */
|
||||||
@ -622,7 +641,6 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
|
|||||||
/* Found the translation of MSGID1 in domain DOMAIN:
|
/* Found the translation of MSGID1 in domain DOMAIN:
|
||||||
starting at RETVAL, RETLEN bytes. */
|
starting at RETVAL, RETLEN bytes. */
|
||||||
FREE_BLOCKS (block_list);
|
FREE_BLOCKS (block_list);
|
||||||
__set_errno (saved_errno);
|
|
||||||
#if defined HAVE_TSEARCH || defined _LIBC
|
#if defined HAVE_TSEARCH || defined _LIBC
|
||||||
if (foundp == NULL)
|
if (foundp == NULL)
|
||||||
{
|
{
|
||||||
@ -661,6 +679,8 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
|
|||||||
(*foundp)->translation_length = retlen;
|
(*foundp)->translation_length = retlen;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
__set_errno (saved_errno);
|
||||||
|
|
||||||
/* Now deal with plural. */
|
/* Now deal with plural. */
|
||||||
if (plural)
|
if (plural)
|
||||||
retval = plural_lookup (domain, n, retval, retlen);
|
retval = plural_lookup (domain, n, retval, retlen);
|
||||||
@ -670,19 +690,40 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* NOTREACHED */
|
|
||||||
|
return_untranslated:
|
||||||
|
/* Return the untranslated MSGID. */
|
||||||
|
FREE_BLOCKS (block_list);
|
||||||
|
__libc_rwlock_unlock (_nl_state_lock);
|
||||||
|
#ifndef _LIBC
|
||||||
|
if (!ENABLE_SECURE)
|
||||||
|
{
|
||||||
|
extern void _nl_log_untranslated (const char *logfilename,
|
||||||
|
const char *domainname,
|
||||||
|
const char *msgid1, const char *msgid2,
|
||||||
|
int plural);
|
||||||
|
const char *logfilename = getenv ("GETTEXT_LOG_UNTRANSLATED");
|
||||||
|
|
||||||
|
if (logfilename != NULL && logfilename[0] != '\0')
|
||||||
|
_nl_log_untranslated (logfilename, domainname, msgid1, msgid2, plural);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
__set_errno (saved_errno);
|
||||||
|
return (plural == 0
|
||||||
|
? (char *) msgid1
|
||||||
|
/* Use the Germanic plural rule. */
|
||||||
|
: n == 1 ? (char *) msgid1 : (char *) msgid2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char *
|
char *
|
||||||
internal_function
|
internal_function
|
||||||
_nl_find_msg (domain_file, domainbinding, msgid, lengthp)
|
_nl_find_msg (struct loaded_l10nfile *domain_file,
|
||||||
struct loaded_l10nfile *domain_file;
|
struct binding *domainbinding, const char *msgid,
|
||||||
struct binding *domainbinding;
|
size_t *lengthp)
|
||||||
const char *msgid;
|
|
||||||
size_t *lengthp;
|
|
||||||
{
|
{
|
||||||
struct loaded_domain *domain;
|
struct loaded_domain *domain;
|
||||||
|
nls_uint32 nstrings;
|
||||||
size_t act;
|
size_t act;
|
||||||
char *result;
|
char *result;
|
||||||
size_t resultlen;
|
size_t resultlen;
|
||||||
@ -695,8 +736,10 @@ _nl_find_msg (domain_file, domainbinding, msgid, lengthp)
|
|||||||
|
|
||||||
domain = (struct loaded_domain *) domain_file->data;
|
domain = (struct loaded_domain *) domain_file->data;
|
||||||
|
|
||||||
|
nstrings = domain->nstrings;
|
||||||
|
|
||||||
/* Locate the MSGID and its translation. */
|
/* Locate the MSGID and its translation. */
|
||||||
if (domain->hash_size > 2 && domain->hash_tab != NULL)
|
if (domain->hash_tab != NULL)
|
||||||
{
|
{
|
||||||
/* Use the hashing table. */
|
/* Use the hashing table. */
|
||||||
nls_uint32 len = strlen (msgid);
|
nls_uint32 len = strlen (msgid);
|
||||||
@ -706,22 +749,30 @@ _nl_find_msg (domain_file, domainbinding, msgid, lengthp)
|
|||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]);
|
nls_uint32 nstr =
|
||||||
|
W (domain->must_swap_hash_tab, domain->hash_tab[idx]);
|
||||||
|
|
||||||
if (nstr == 0)
|
if (nstr == 0)
|
||||||
/* Hash table entry is empty. */
|
/* Hash table entry is empty. */
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Compare msgid with the original string at index nstr-1.
|
nstr--;
|
||||||
|
|
||||||
|
/* Compare msgid with the original string at index nstr.
|
||||||
We compare the lengths with >=, not ==, because plural entries
|
We compare the lengths with >=, not ==, because plural entries
|
||||||
are represented by strings with an embedded NUL. */
|
are represented by strings with an embedded NUL. */
|
||||||
if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) >= len
|
if (nstr < nstrings
|
||||||
&& (strcmp (msgid,
|
? W (domain->must_swap, domain->orig_tab[nstr].length) >= len
|
||||||
domain->data + W (domain->must_swap,
|
&& (strcmp (msgid,
|
||||||
domain->orig_tab[nstr - 1].offset))
|
domain->data + W (domain->must_swap,
|
||||||
== 0))
|
domain->orig_tab[nstr].offset))
|
||||||
|
== 0)
|
||||||
|
: domain->orig_sysdep_tab[nstr - nstrings].length > len
|
||||||
|
&& (strcmp (msgid,
|
||||||
|
domain->orig_sysdep_tab[nstr - nstrings].pointer)
|
||||||
|
== 0))
|
||||||
{
|
{
|
||||||
act = nstr - 1;
|
act = nstr;
|
||||||
goto found;
|
goto found;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -739,7 +790,7 @@ _nl_find_msg (domain_file, domainbinding, msgid, lengthp)
|
|||||||
size_t top, bottom;
|
size_t top, bottom;
|
||||||
|
|
||||||
bottom = 0;
|
bottom = 0;
|
||||||
top = domain->nstrings;
|
top = nstrings;
|
||||||
while (bottom < top)
|
while (bottom < top)
|
||||||
{
|
{
|
||||||
int cmp_val;
|
int cmp_val;
|
||||||
@ -762,9 +813,17 @@ _nl_find_msg (domain_file, domainbinding, msgid, lengthp)
|
|||||||
found:
|
found:
|
||||||
/* The translation was found at index ACT. If we have to convert the
|
/* The translation was found at index ACT. If we have to convert the
|
||||||
string to use a different character set, this is the time. */
|
string to use a different character set, this is the time. */
|
||||||
result = ((char *) domain->data
|
if (act < nstrings)
|
||||||
+ W (domain->must_swap, domain->trans_tab[act].offset));
|
{
|
||||||
resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1;
|
result = (char *)
|
||||||
|
(domain->data + W (domain->must_swap, domain->trans_tab[act].offset));
|
||||||
|
resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = (char *) domain->trans_sysdep_tab[act - nstrings].pointer;
|
||||||
|
resultlen = domain->trans_sysdep_tab[act - nstrings].length;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined _LIBC || HAVE_ICONV
|
#if defined _LIBC || HAVE_ICONV
|
||||||
if (domain->codeset_cntr
|
if (domain->codeset_cntr
|
||||||
@ -797,8 +856,9 @@ _nl_find_msg (domain_file, domainbinding, msgid, lengthp)
|
|||||||
NULs. */
|
NULs. */
|
||||||
|
|
||||||
if (domain->conv_tab == NULL
|
if (domain->conv_tab == NULL
|
||||||
&& ((domain->conv_tab = (char **) calloc (domain->nstrings,
|
&& ((domain->conv_tab =
|
||||||
sizeof (char *)))
|
(char **) calloc (nstrings + domain->n_sysdep_strings,
|
||||||
|
sizeof (char *)))
|
||||||
== NULL))
|
== NULL))
|
||||||
/* Mark that we didn't succeed allocating a table. */
|
/* Mark that we didn't succeed allocating a table. */
|
||||||
domain->conv_tab = (char **) -1;
|
domain->conv_tab = (char **) -1;
|
||||||
@ -967,11 +1027,8 @@ _nl_find_msg (domain_file, domainbinding, msgid, lengthp)
|
|||||||
/* Look up a plural variant. */
|
/* Look up a plural variant. */
|
||||||
static char *
|
static char *
|
||||||
internal_function
|
internal_function
|
||||||
plural_lookup (domain, n, translation, translation_len)
|
plural_lookup (struct loaded_l10nfile *domain, unsigned long int n,
|
||||||
struct loaded_l10nfile *domain;
|
const char *translation, size_t translation_len)
|
||||||
unsigned long int n;
|
|
||||||
const char *translation;
|
|
||||||
size_t translation_len;
|
|
||||||
{
|
{
|
||||||
struct loaded_domain *domaindata = (struct loaded_domain *) domain->data;
|
struct loaded_domain *domaindata = (struct loaded_domain *) domain->data;
|
||||||
unsigned long int index;
|
unsigned long int index;
|
||||||
@ -1004,93 +1061,11 @@ plural_lookup (domain, n, translation, translation_len)
|
|||||||
return (char *) p;
|
return (char *) p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef _LIBC
|
||||||
/* Function to evaluate the plural expression and return an index value. */
|
|
||||||
static unsigned long int
|
|
||||||
internal_function
|
|
||||||
plural_eval (pexp, n)
|
|
||||||
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:
|
|
||||||
return leftarg / rightarg;
|
|
||||||
case module:
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Return string representation of locale CATEGORY. */
|
/* Return string representation of locale CATEGORY. */
|
||||||
static const char *
|
static const char *
|
||||||
internal_function
|
internal_function
|
||||||
category_to_name (category)
|
category_to_name (int category)
|
||||||
int category;
|
|
||||||
{
|
{
|
||||||
const char *retval;
|
const char *retval;
|
||||||
|
|
||||||
@ -1145,13 +1120,12 @@ category_to_name (category)
|
|||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Guess value of current locale from value of the environment variables. */
|
/* Guess value of current locale from value of the environment variables. */
|
||||||
static const char *
|
static const char *
|
||||||
internal_function
|
internal_function
|
||||||
guess_category_value (category, categoryname)
|
guess_category_value (int category, const char *categoryname)
|
||||||
int category;
|
|
||||||
const char *categoryname;
|
|
||||||
{
|
{
|
||||||
const char *language;
|
const char *language;
|
||||||
const char *retval;
|
const char *retval;
|
||||||
@ -1166,27 +1140,21 @@ guess_category_value (category, categoryname)
|
|||||||
/* We have to proceed with the POSIX methods of looking to `LC_ALL',
|
/* We have to proceed with the POSIX methods of looking to `LC_ALL',
|
||||||
`LC_xxx', and `LANG'. On some systems this can be done by the
|
`LC_xxx', and `LANG'. On some systems this can be done by the
|
||||||
`setlocale' function itself. */
|
`setlocale' function itself. */
|
||||||
#if defined _LIBC || (defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL)
|
#ifdef _LIBC
|
||||||
retval = setlocale (category, NULL);
|
retval = __current_locale_name (category);
|
||||||
#else
|
#else
|
||||||
/* Setting of LC_ALL overwrites all other. */
|
retval = _nl_locale_name (category, categoryname);
|
||||||
retval = getenv ("LC_ALL");
|
|
||||||
if (retval == NULL || retval[0] == '\0')
|
|
||||||
{
|
|
||||||
/* Next comes the name of the desired category. */
|
|
||||||
retval = getenv (categoryname);
|
|
||||||
if (retval == NULL || retval[0] == '\0')
|
|
||||||
{
|
|
||||||
/* Last possibility is the LANG environment variable. */
|
|
||||||
retval = getenv ("LANG");
|
|
||||||
if (retval == NULL || retval[0] == '\0')
|
|
||||||
/* We use C as the default domain. POSIX says this is
|
|
||||||
implementation defined. */
|
|
||||||
return "C";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Ignore LANGUAGE if the locale is set to "C" because
|
||||||
|
1. "C" locale usually uses the ASCII encoding, and most international
|
||||||
|
messages use non-ASCII characters. These characters get displayed
|
||||||
|
as question marks (if using glibc's iconv()) or as invalid 8-bit
|
||||||
|
characters (because other iconv()s refuse to convert most non-ASCII
|
||||||
|
characters to ASCII). In any case, the output is ugly.
|
||||||
|
2. The precise output of some programs in the "C" locale is specified
|
||||||
|
by POSIX and should not depend on environment variables like
|
||||||
|
"LANGUAGE". We allow such programs to use gettext(). */
|
||||||
return language != NULL && strcmp (retval, "C") != 0 ? language : retval;
|
return language != NULL && strcmp (retval, "C") != 0 ? language : retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1198,9 +1166,7 @@ guess_category_value (category, categoryname)
|
|||||||
to be defined. */
|
to be defined. */
|
||||||
#if !_LIBC && !HAVE_STPCPY
|
#if !_LIBC && !HAVE_STPCPY
|
||||||
static char *
|
static char *
|
||||||
stpcpy (dest, src)
|
stpcpy (char *dest, const char *src)
|
||||||
char *dest;
|
|
||||||
const char *src;
|
|
||||||
{
|
{
|
||||||
while ((*dest++ = *src++) != '\0')
|
while ((*dest++ = *src++) != '\0')
|
||||||
/* Do nothing. */ ;
|
/* Do nothing. */ ;
|
||||||
@ -1210,10 +1176,7 @@ stpcpy (dest, src)
|
|||||||
|
|
||||||
#if !_LIBC && !HAVE_MEMPCPY
|
#if !_LIBC && !HAVE_MEMPCPY
|
||||||
static void *
|
static void *
|
||||||
mempcpy (dest, src, n)
|
mempcpy (void *dest, const void *src, size_t n)
|
||||||
void *dest;
|
|
||||||
const void *src;
|
|
||||||
size_t n;
|
|
||||||
{
|
{
|
||||||
return (void *) ((char *) memcpy (dest, src, n) + n);
|
return (void *) ((char *) memcpy (dest, src, n) + n);
|
||||||
}
|
}
|
||||||
@ -1223,8 +1186,7 @@ mempcpy (dest, src, n)
|
|||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
/* If we want to free all resources we have to do some work at
|
/* If we want to free all resources we have to do some work at
|
||||||
program's end. */
|
program's end. */
|
||||||
static void __attribute__ ((unused))
|
libc_freeres_fn (free_mem)
|
||||||
free_mem (void)
|
|
||||||
{
|
{
|
||||||
void *old;
|
void *old;
|
||||||
|
|
||||||
@ -1232,7 +1194,7 @@ free_mem (void)
|
|||||||
{
|
{
|
||||||
struct binding *oldp = _nl_domain_bindings;
|
struct binding *oldp = _nl_domain_bindings;
|
||||||
_nl_domain_bindings = _nl_domain_bindings->next;
|
_nl_domain_bindings = _nl_domain_bindings->next;
|
||||||
if (oldp->dirname != _nl_default_dirname)
|
if (oldp->dirname != INTUSE(_nl_default_dirname))
|
||||||
/* Yes, this is a pointer comparison. */
|
/* Yes, this is a pointer comparison. */
|
||||||
free (oldp->dirname);
|
free (oldp->dirname);
|
||||||
free (oldp->codeset);
|
free (oldp->codeset);
|
||||||
@ -1254,6 +1216,4 @@ free_mem (void)
|
|||||||
free (old);
|
free (old);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
text_set_element (__libc_subfreeres, free_mem);
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Implementation of the dcngettext(3) function.
|
/* Implementation of the dcngettext(3) function.
|
||||||
Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -37,19 +37,16 @@
|
|||||||
# define DCNGETTEXT __dcngettext
|
# define DCNGETTEXT __dcngettext
|
||||||
# define DCIGETTEXT __dcigettext
|
# define DCIGETTEXT __dcigettext
|
||||||
#else
|
#else
|
||||||
# define DCNGETTEXT dcngettext__
|
# define DCNGETTEXT libintl_dcngettext
|
||||||
# define DCIGETTEXT dcigettext__
|
# define DCIGETTEXT libintl_dcigettext
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
|
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
|
||||||
locale. */
|
locale. */
|
||||||
char *
|
char *
|
||||||
DCNGETTEXT (domainname, msgid1, msgid2, n, category)
|
DCNGETTEXT (const char *domainname,
|
||||||
const char *domainname;
|
const char *msgid1, const char *msgid2, unsigned long int n,
|
||||||
const char *msgid1;
|
int category)
|
||||||
const char *msgid2;
|
|
||||||
unsigned long int n;
|
|
||||||
int category;
|
|
||||||
{
|
{
|
||||||
return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category);
|
return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Implementation of the dgettext(3) function.
|
/* Implementation of the dgettext(3) function.
|
||||||
Copyright (C) 1995-1997, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -20,9 +20,10 @@
|
|||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "gettextP.h"
|
||||||
|
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
|
||||||
#include "gettextP.h"
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
# include <libintl.h>
|
# include <libintl.h>
|
||||||
#else
|
#else
|
||||||
@ -37,18 +38,16 @@
|
|||||||
prefix. So we have to make a difference here. */
|
prefix. So we have to make a difference here. */
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
# define DGETTEXT __dgettext
|
# define DGETTEXT __dgettext
|
||||||
# define DCGETTEXT __dcgettext
|
# define DCGETTEXT INTUSE(__dcgettext)
|
||||||
#else
|
#else
|
||||||
# define DGETTEXT dgettext__
|
# define DGETTEXT libintl_dgettext
|
||||||
# define DCGETTEXT dcgettext__
|
# define DCGETTEXT libintl_dcgettext
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Look up MSGID in the DOMAINNAME message catalog of the current
|
/* Look up MSGID in the DOMAINNAME message catalog of the current
|
||||||
LC_MESSAGES locale. */
|
LC_MESSAGES locale. */
|
||||||
char *
|
char *
|
||||||
DGETTEXT (domainname, msgid)
|
DGETTEXT (const char *domainname, const char *msgid)
|
||||||
const char *domainname;
|
|
||||||
const char *msgid;
|
|
||||||
{
|
{
|
||||||
return DCGETTEXT (domainname, msgid, LC_MESSAGES);
|
return DCGETTEXT (domainname, msgid, LC_MESSAGES);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Implementation of the dngettext(3) function.
|
/* Implementation of the dngettext(3) function.
|
||||||
Copyright (C) 1995-1997, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -20,9 +20,10 @@
|
|||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "gettextP.h"
|
||||||
|
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
|
||||||
#include "gettextP.h"
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
# include <libintl.h>
|
# include <libintl.h>
|
||||||
#else
|
#else
|
||||||
@ -39,18 +40,15 @@
|
|||||||
# define DNGETTEXT __dngettext
|
# define DNGETTEXT __dngettext
|
||||||
# define DCNGETTEXT __dcngettext
|
# define DCNGETTEXT __dcngettext
|
||||||
#else
|
#else
|
||||||
# define DNGETTEXT dngettext__
|
# define DNGETTEXT libintl_dngettext
|
||||||
# define DCNGETTEXT dcngettext__
|
# define DCNGETTEXT libintl_dcngettext
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Look up MSGID in the DOMAINNAME message catalog of the current
|
/* Look up MSGID in the DOMAINNAME message catalog of the current
|
||||||
LC_MESSAGES locale and skip message according to the plural form. */
|
LC_MESSAGES locale and skip message according to the plural form. */
|
||||||
char *
|
char *
|
||||||
DNGETTEXT (domainname, msgid1, msgid2, n)
|
DNGETTEXT (const char *domainname,
|
||||||
const char *domainname;
|
const char *msgid1, const char *msgid2, unsigned long int n)
|
||||||
const char *msgid1;
|
|
||||||
const char *msgid2;
|
|
||||||
unsigned long int n;
|
|
||||||
{
|
{
|
||||||
return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES);
|
return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES);
|
||||||
}
|
}
|
||||||
|
108
intl/eval-plural.h
Normal file
108
intl/eval-plural.h
Normal file
@ -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;
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc.
|
/* Copyright (C) 1995-1998, 2000-2001, 2003 Free Software Foundation, Inc.
|
||||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
This program is free software; you can redistribute it and/or modify it
|
||||||
@ -38,8 +38,7 @@
|
|||||||
/* @@ end of prolog @@ */
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
char *
|
char *
|
||||||
_nl_find_language (name)
|
_nl_find_language (const char *name)
|
||||||
const char *name;
|
|
||||||
{
|
{
|
||||||
while (name[0] != '\0' && name[0] != '_' && name[0] != '@'
|
while (name[0] != '\0' && name[0] != '_' && name[0] != '@'
|
||||||
&& name[0] != '+' && name[0] != ',')
|
&& name[0] != '+' && name[0] != ',')
|
||||||
@ -50,17 +49,11 @@ _nl_find_language (name)
|
|||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
_nl_explode_name (name, language, modifier, territory, codeset,
|
_nl_explode_name (char *name,
|
||||||
normalized_codeset, special, sponsor, revision)
|
const char **language, const char **modifier,
|
||||||
char *name;
|
const char **territory, const char **codeset,
|
||||||
const char **language;
|
const char **normalized_codeset, const char **special,
|
||||||
const char **modifier;
|
const char **sponsor, const char **revision)
|
||||||
const char **territory;
|
|
||||||
const char **codeset;
|
|
||||||
const char **normalized_codeset;
|
|
||||||
const char **special;
|
|
||||||
const char **sponsor;
|
|
||||||
const char **revision;
|
|
||||||
{
|
{
|
||||||
enum { undecided, xpg, cen } syntax;
|
enum { undecided, xpg, cen } syntax;
|
||||||
char *cp;
|
char *cp;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Handle list of needed message catalogs
|
/* Handle list of needed message catalogs
|
||||||
Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc.
|
||||||
Written by Ulrich Drepper <drepper@gnu.org>, 1995.
|
Written by Ulrich Drepper <drepper@gnu.org>, 1995.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
This program is free software; you can redistribute it and/or modify it
|
||||||
@ -47,11 +47,8 @@ static struct loaded_l10nfile *_nl_loaded_domains;
|
|||||||
established bindings. */
|
established bindings. */
|
||||||
struct loaded_l10nfile *
|
struct loaded_l10nfile *
|
||||||
internal_function
|
internal_function
|
||||||
_nl_find_domain (dirname, locale, domainname, domainbinding)
|
_nl_find_domain (const char *dirname, char *locale,
|
||||||
const char *dirname;
|
const char *domainname, struct binding *domainbinding)
|
||||||
char *locale;
|
|
||||||
const char *domainname;
|
|
||||||
struct binding *domainbinding;
|
|
||||||
{
|
{
|
||||||
struct loaded_l10nfile *retval;
|
struct loaded_l10nfile *retval;
|
||||||
const char *language;
|
const char *language;
|
||||||
@ -178,8 +175,7 @@ _nl_find_domain (dirname, locale, domainname, domainbinding)
|
|||||||
|
|
||||||
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
static void __attribute__ ((unused))
|
libc_freeres_fn (free_mem)
|
||||||
free_mem (void)
|
|
||||||
{
|
{
|
||||||
struct loaded_l10nfile *runp = _nl_loaded_domains;
|
struct loaded_l10nfile *runp = _nl_loaded_domains;
|
||||||
|
|
||||||
@ -193,6 +189,4 @@ free_mem (void)
|
|||||||
free (here);
|
free (here);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
text_set_element (__libc_subfreeres, free_mem);
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Implementation of gettext(3) function.
|
/* Implementation of gettext(3) function.
|
||||||
Copyright (C) 1995, 1997, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -42,18 +42,17 @@
|
|||||||
prefix. So we have to make a difference here. */
|
prefix. So we have to make a difference here. */
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
# define GETTEXT __gettext
|
# define GETTEXT __gettext
|
||||||
# define DCGETTEXT __dcgettext
|
# define DCGETTEXT INTUSE(__dcgettext)
|
||||||
#else
|
#else
|
||||||
# define GETTEXT gettext__
|
# define GETTEXT libintl_gettext
|
||||||
# define DCGETTEXT dcgettext__
|
# define DCGETTEXT libintl_dcgettext
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Look up MSGID in the current default message catalog for the current
|
/* Look up MSGID in the current default message catalog for the current
|
||||||
LC_MESSAGES locale. If not found, returns MSGID itself (the default
|
LC_MESSAGES locale. If not found, returns MSGID itself (the default
|
||||||
text). */
|
text). */
|
||||||
char *
|
char *
|
||||||
GETTEXT (msgid)
|
GETTEXT (const char *msgid)
|
||||||
const char *msgid;
|
|
||||||
{
|
{
|
||||||
return DCGETTEXT (NULL, msgid, LC_MESSAGES);
|
return DCGETTEXT (NULL, msgid, LC_MESSAGES);
|
||||||
}
|
}
|
||||||
|
221
intl/gettextP.h
221
intl/gettextP.h
@ -1,5 +1,5 @@
|
|||||||
/* Header describing internals of libintl library.
|
/* Header describing internals of libintl library.
|
||||||
Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
|
||||||
Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
|
Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
This program is free software; you can redistribute it and/or modify it
|
||||||
@ -32,22 +32,18 @@
|
|||||||
|
|
||||||
#include "loadinfo.h"
|
#include "loadinfo.h"
|
||||||
|
|
||||||
#include "gettext.h" /* Get nls_uint32. */
|
#include "gmo.h" /* Get nls_uint32. */
|
||||||
|
|
||||||
/* @@ end of prolog @@ */
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
#ifndef PARAMS
|
|
||||||
# if __STDC__
|
|
||||||
# define PARAMS(args) args
|
|
||||||
# else
|
|
||||||
# define PARAMS(args) ()
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef internal_function
|
#ifndef internal_function
|
||||||
# define internal_function
|
# define internal_function
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef attribute_hidden
|
||||||
|
# define attribute_hidden
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Tell the compiler when a conditional or integer expression is
|
/* Tell the compiler when a conditional or integer expression is
|
||||||
almost always true or almost always false. */
|
almost always true or almost always false. */
|
||||||
#ifndef HAVE_BUILTIN_EXPECT
|
#ifndef HAVE_BUILTIN_EXPECT
|
||||||
@ -72,63 +68,50 @@ SWAP (i)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* This is the representation of the expressions to determine the
|
/* In-memory representation of system dependent string. */
|
||||||
plural form. */
|
struct sysdep_string_desc
|
||||||
struct expression
|
|
||||||
{
|
{
|
||||||
int nargs; /* Number of arguments. */
|
/* Length of addressed string, including the trailing NUL. */
|
||||||
enum operator
|
size_t length;
|
||||||
{
|
/* Pointer to addressed string. */
|
||||||
/* Without arguments: */
|
const char *pointer;
|
||||||
var, /* The variable "n". */
|
|
||||||
num, /* Decimal number. */
|
|
||||||
/* Unary operators: */
|
|
||||||
lnot, /* Logical NOT. */
|
|
||||||
/* Binary operators: */
|
|
||||||
mult, /* Multiplication. */
|
|
||||||
divide, /* Division. */
|
|
||||||
module, /* Module operation. */
|
|
||||||
plus, /* Addition. */
|
|
||||||
minus, /* Subtraction. */
|
|
||||||
less_than, /* Comparison. */
|
|
||||||
greater_than, /* Comparison. */
|
|
||||||
less_or_equal, /* Comparison. */
|
|
||||||
greater_or_equal, /* Comparison. */
|
|
||||||
equal, /* Comparision for equality. */
|
|
||||||
not_equal, /* Comparision 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;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* The representation of an opened message catalog. */
|
/* The representation of an opened message catalog. */
|
||||||
struct loaded_domain
|
struct loaded_domain
|
||||||
{
|
{
|
||||||
|
/* Pointer to memory containing the .mo file. */
|
||||||
const char *data;
|
const char *data;
|
||||||
|
/* 1 if the memory is mmap()ed, 0 if the memory is malloc()ed. */
|
||||||
int use_mmap;
|
int use_mmap;
|
||||||
|
/* Size of mmap()ed memory. */
|
||||||
size_t mmap_size;
|
size_t mmap_size;
|
||||||
|
/* 1 if the .mo file uses a different endianness than this machine. */
|
||||||
int must_swap;
|
int must_swap;
|
||||||
|
/* Pointer to additional malloc()ed memory. */
|
||||||
|
void *malloced;
|
||||||
|
|
||||||
|
/* Number of static strings pairs. */
|
||||||
nls_uint32 nstrings;
|
nls_uint32 nstrings;
|
||||||
struct string_desc *orig_tab;
|
/* Pointer to descriptors of original strings in the file. */
|
||||||
struct string_desc *trans_tab;
|
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;
|
nls_uint32 hash_size;
|
||||||
nls_uint32 *hash_tab;
|
/* 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;
|
int codeset_cntr;
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
__gconv_t conv;
|
__gconv_t conv;
|
||||||
@ -167,84 +150,64 @@ struct binding
|
|||||||
This variable is part of the external ABI of the GNU libintl. */
|
This variable is part of the external ABI of the GNU libintl. */
|
||||||
extern int _nl_msg_cat_cntr;
|
extern int _nl_msg_cat_cntr;
|
||||||
|
|
||||||
struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname,
|
#ifndef _LIBC
|
||||||
char *__locale,
|
const char *_nl_locale_name (int category, const char *categoryname);
|
||||||
const char *__domainname,
|
|
||||||
struct binding *__domainbinding))
|
|
||||||
internal_function;
|
|
||||||
void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain,
|
|
||||||
struct binding *__domainbinding))
|
|
||||||
internal_function;
|
|
||||||
void _nl_unload_domain PARAMS ((struct loaded_domain *__domain))
|
|
||||||
internal_function;
|
|
||||||
const char *_nl_init_domain_conv PARAMS ((struct loaded_l10nfile *__domain_file,
|
|
||||||
struct loaded_domain *__domain,
|
|
||||||
struct binding *__domainbinding))
|
|
||||||
internal_function;
|
|
||||||
void _nl_free_domain_conv PARAMS ((struct loaded_domain *__domain))
|
|
||||||
internal_function;
|
|
||||||
|
|
||||||
char *_nl_find_msg PARAMS ((struct loaded_l10nfile *domain_file,
|
|
||||||
struct binding *domainbinding,
|
|
||||||
const char *msgid, size_t *lengthp))
|
|
||||||
internal_function;
|
|
||||||
|
|
||||||
#ifdef _LIBC
|
|
||||||
extern char *__gettext PARAMS ((const char *__msgid));
|
|
||||||
extern char *__dgettext PARAMS ((const char *__domainname,
|
|
||||||
const char *__msgid));
|
|
||||||
extern char *__dcgettext PARAMS ((const char *__domainname,
|
|
||||||
const char *__msgid, int __category));
|
|
||||||
extern char *__ngettext PARAMS ((const char *__msgid1, const char *__msgid2,
|
|
||||||
unsigned long int __n));
|
|
||||||
extern char *__dngettext PARAMS ((const char *__domainname,
|
|
||||||
const char *__msgid1, const char *__msgid2,
|
|
||||||
unsigned long int n));
|
|
||||||
extern char *__dcngettext PARAMS ((const char *__domainname,
|
|
||||||
const char *__msgid1, const char *__msgid2,
|
|
||||||
unsigned long int __n, int __category));
|
|
||||||
extern char *__dcigettext PARAMS ((const char *__domainname,
|
|
||||||
const char *__msgid1, const char *__msgid2,
|
|
||||||
int __plural, unsigned long int __n,
|
|
||||||
int __category));
|
|
||||||
extern char *__textdomain PARAMS ((const char *__domainname));
|
|
||||||
extern char *__bindtextdomain PARAMS ((const char *__domainname,
|
|
||||||
const char *__dirname));
|
|
||||||
extern char *__bind_textdomain_codeset PARAMS ((const char *__domainname,
|
|
||||||
const char *__codeset));
|
|
||||||
#else
|
|
||||||
extern char *gettext__ PARAMS ((const char *__msgid));
|
|
||||||
extern char *dgettext__ PARAMS ((const char *__domainname,
|
|
||||||
const char *__msgid));
|
|
||||||
extern char *dcgettext__ PARAMS ((const char *__domainname,
|
|
||||||
const char *__msgid, int __category));
|
|
||||||
extern char *ngettext__ PARAMS ((const char *__msgid1, const char *__msgid2,
|
|
||||||
unsigned long int __n));
|
|
||||||
extern char *dngettext__ PARAMS ((const char *__domainname,
|
|
||||||
const char *__msgid1, const char *__msgid2,
|
|
||||||
unsigned long int __n));
|
|
||||||
extern char *dcngettext__ PARAMS ((const char *__domainname,
|
|
||||||
const char *__msgid1, const char *__msgid2,
|
|
||||||
unsigned long int __n, int __category));
|
|
||||||
extern char *dcigettext__ PARAMS ((const char *__domainname,
|
|
||||||
const char *__msgid1, const char *__msgid2,
|
|
||||||
int __plural, unsigned long int __n,
|
|
||||||
int __category));
|
|
||||||
extern char *textdomain__ PARAMS ((const char *__domainname));
|
|
||||||
extern char *bindtextdomain__ PARAMS ((const char *__domainname,
|
|
||||||
const char *__dirname));
|
|
||||||
extern char *bind_textdomain_codeset__ PARAMS ((const char *__domainname,
|
|
||||||
const char *__codeset));
|
|
||||||
#endif
|
#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
|
#ifdef _LIBC
|
||||||
extern void __gettext_free_exp PARAMS ((struct expression *exp))
|
extern char *__gettext (const char *__msgid);
|
||||||
internal_function;
|
extern char *__dgettext (const char *__domainname, const char *__msgid);
|
||||||
extern int __gettextparse PARAMS ((void *arg));
|
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
|
#else
|
||||||
extern void gettext_free_exp__ PARAMS ((struct expression *exp))
|
/* Declare the exported libintl_* functions, in a way that allows us to
|
||||||
internal_function;
|
call them under their real name. */
|
||||||
extern int gettextparse__ PARAMS ((void *arg));
|
# 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
|
#endif
|
||||||
|
|
||||||
/* @@ begin of epilog @@ */
|
/* @@ begin of epilog @@ */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Description of GNU message catalog format: general file layout.
|
/* Description of GNU message catalog format: general file layout.
|
||||||
Copyright (C) 1995, 1997, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995, 1997, 2000-2002, 2004 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -19,9 +19,7 @@
|
|||||||
#ifndef _GETTEXT_H
|
#ifndef _GETTEXT_H
|
||||||
#define _GETTEXT_H 1
|
#define _GETTEXT_H 1
|
||||||
|
|
||||||
#if HAVE_LIMITS_H || _LIBC
|
#include <limits.h>
|
||||||
# include <limits.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* @@ end of prolog @@ */
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
@ -31,6 +29,7 @@
|
|||||||
|
|
||||||
/* Revision number of the currently used .mo (binary) file format. */
|
/* Revision number of the currently used .mo (binary) file format. */
|
||||||
#define MO_REVISION_NUMBER 0
|
#define MO_REVISION_NUMBER 0
|
||||||
|
#define MO_REVISION_NUMBER_WITH_SYSDEP_I 1
|
||||||
|
|
||||||
/* The following contortions are an attempt to use the C preprocessor
|
/* The following contortions are an attempt to use the C preprocessor
|
||||||
to determine an unsigned integral type that is 32 bits wide. An
|
to determine an unsigned integral type that is 32 bits wide. An
|
||||||
@ -77,26 +76,74 @@ struct mo_file_header
|
|||||||
nls_uint32 magic;
|
nls_uint32 magic;
|
||||||
/* The revision number of the file format. */
|
/* The revision number of the file format. */
|
||||||
nls_uint32 revision;
|
nls_uint32 revision;
|
||||||
|
|
||||||
|
/* The following are only used in .mo files with major revision 0 or 1. */
|
||||||
|
|
||||||
/* The number of strings pairs. */
|
/* The number of strings pairs. */
|
||||||
nls_uint32 nstrings;
|
nls_uint32 nstrings;
|
||||||
/* Offset of table with start offsets of original strings. */
|
/* Offset of table with start offsets of original strings. */
|
||||||
nls_uint32 orig_tab_offset;
|
nls_uint32 orig_tab_offset;
|
||||||
/* Offset of table with start offsets of translation strings. */
|
/* Offset of table with start offsets of translated strings. */
|
||||||
nls_uint32 trans_tab_offset;
|
nls_uint32 trans_tab_offset;
|
||||||
/* Size of hashing table. */
|
/* Size of hash table. */
|
||||||
nls_uint32 hash_tab_size;
|
nls_uint32 hash_tab_size;
|
||||||
/* Offset of first hashing entry. */
|
/* Offset of first hash table entry. */
|
||||||
nls_uint32 hash_tab_offset;
|
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
|
struct string_desc
|
||||||
{
|
{
|
||||||
/* Length of addressed string. */
|
/* Length of addressed string, not including the trailing NUL. */
|
||||||
nls_uint32 length;
|
nls_uint32 length;
|
||||||
/* Offset of string in file. */
|
/* Offset of string in file. */
|
||||||
nls_uint32 offset;
|
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 @@ */
|
/* @@ begin of epilog @@ */
|
||||||
|
|
||||||
#endif /* gettext.h */
|
#endif /* gettext.h */
|
@ -1,5 +1,5 @@
|
|||||||
/* Description of GNU message catalog format: string hashing function.
|
/* Description of GNU message catalog format: string hashing function.
|
||||||
Copyright (C) 1995, 1997, 1998, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995, 1997-1998, 2000-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -18,14 +18,6 @@
|
|||||||
|
|
||||||
/* @@ end of prolog @@ */
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
#ifndef PARAMS
|
|
||||||
# if __STDC__
|
|
||||||
# define PARAMS(Args) Args
|
|
||||||
# else
|
|
||||||
# define PARAMS(Args) ()
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* We assume to have `unsigned long int' value with at least 32 bits. */
|
/* We assume to have `unsigned long int' value with at least 32 bits. */
|
||||||
#define HASHWORDBITS 32
|
#define HASHWORDBITS 32
|
||||||
|
|
||||||
@ -33,11 +25,8 @@
|
|||||||
/* Defines the so called `hashpjw' function by P.J. Weinberger
|
/* Defines the so called `hashpjw' function by P.J. Weinberger
|
||||||
[see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
|
[see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
|
||||||
1986, 1987 Bell Telephone Laboratories, Inc.] */
|
1986, 1987 Bell Telephone Laboratories, Inc.] */
|
||||||
static unsigned long int hash_string PARAMS ((const char *__str_param));
|
|
||||||
|
|
||||||
static inline unsigned long int
|
static inline unsigned long int
|
||||||
hash_string (str_param)
|
hash_string (const char *str_param)
|
||||||
const char *str_param;
|
|
||||||
{
|
{
|
||||||
unsigned long int hval, g;
|
unsigned long int hval, g;
|
||||||
const char *str = str_param;
|
const char *str = str_param;
|
||||||
@ -47,7 +36,7 @@ hash_string (str_param)
|
|||||||
while (*str != '\0')
|
while (*str != '\0')
|
||||||
{
|
{
|
||||||
hval <<= 4;
|
hval <<= 4;
|
||||||
hval += (unsigned long int) *str++;
|
hval += (unsigned char) *str++;
|
||||||
g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
|
g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
|
||||||
if (g != 0)
|
if (g != 0)
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* intl-compat.c - Stub functions to call gettext functions from GNU gettext
|
/* intl-compat.c - Stub functions to call gettext functions from GNU gettext
|
||||||
Library.
|
Library.
|
||||||
Copyright (C) 1995, 2000, 2001 Software Foundation, Inc.
|
Copyright (C) 1995, 2000-2003 Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -21,52 +21,18 @@
|
|||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "libgnuintl.h"
|
|
||||||
#include "gettextP.h"
|
#include "gettextP.h"
|
||||||
|
|
||||||
/* @@ end of prolog @@ */
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
/* This file redirects the gettext functions (without prefix or suffix) to
|
/* This file redirects the gettext functions (without prefix) to those
|
||||||
those defined in the included GNU gettext library (with "__" suffix).
|
defined in the included GNU libintl library (with "libintl_" prefix).
|
||||||
It is compiled into libintl when the included GNU gettext library is
|
It is compiled into libintl in order to make the AM_GNU_GETTEXT test
|
||||||
configured --with-included-gettext.
|
of gettext <= 0.11.2 work with the libintl library >= 0.11.3 which
|
||||||
|
has the redirections primarily in the <libintl.h> include file.
|
||||||
This redirection works also in the case that the system C library or
|
It is also compiled into libgnuintl so that libgnuintl.so can be used
|
||||||
the system libintl library contain gettext/textdomain/... functions.
|
as LD_PRELOADable library on glibc systems, to provide the extra
|
||||||
If it didn't, we would need to add preprocessor level redirections to
|
features that the functions in the libc don't have (namely, logging). */
|
||||||
libgnuintl.h of the following form:
|
|
||||||
|
|
||||||
# define gettext gettext__
|
|
||||||
# define dgettext dgettext__
|
|
||||||
# define dcgettext dcgettext__
|
|
||||||
# define ngettext ngettext__
|
|
||||||
# define dngettext dngettext__
|
|
||||||
# define dcngettext dcngettext__
|
|
||||||
# define textdomain textdomain__
|
|
||||||
# define bindtextdomain bindtextdomain__
|
|
||||||
# define bind_textdomain_codeset bind_textdomain_codeset__
|
|
||||||
|
|
||||||
How does this redirection work? There are two cases.
|
|
||||||
A. When libintl.a is linked into an executable, it works because
|
|
||||||
functions defined in the executable always override functions in
|
|
||||||
the shared libraries.
|
|
||||||
B. When libintl.so is used, it works because
|
|
||||||
1. those systems defining gettext/textdomain/... in the C library
|
|
||||||
(namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer) are
|
|
||||||
ELF systems and define these symbols as weak, thus explicitly
|
|
||||||
letting other shared libraries override it.
|
|
||||||
2. those systems defining gettext/textdomain/... in a standalone
|
|
||||||
libintl.so library (namely, Solaris 2.3 and newer) have this
|
|
||||||
shared library in /usr/lib, and the linker will search /usr/lib
|
|
||||||
*after* the directory where the GNU gettext library is installed.
|
|
||||||
|
|
||||||
A third case, namely when libintl.a is linked into a shared library
|
|
||||||
whose name is not libintl.so, is not supported. In this case, on
|
|
||||||
Solaris, when -lintl precedes the linker option for the shared library
|
|
||||||
containing GNU gettext, the system's gettext would indeed override
|
|
||||||
the GNU gettext. Anyone doing this kind of stuff must be clever enough
|
|
||||||
to 1. compile libintl.a with -fPIC, 2. remove -lintl from his linker
|
|
||||||
command line. */
|
|
||||||
|
|
||||||
|
|
||||||
#undef gettext
|
#undef gettext
|
||||||
@ -80,87 +46,86 @@
|
|||||||
#undef bind_textdomain_codeset
|
#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 *
|
char *
|
||||||
gettext (msgid)
|
gettext (const char *msgid)
|
||||||
const char *msgid;
|
|
||||||
{
|
{
|
||||||
return gettext__ (msgid);
|
return libintl_gettext (msgid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
char *
|
char *
|
||||||
dgettext (domainname, msgid)
|
dgettext (const char *domainname, const char *msgid)
|
||||||
const char *domainname;
|
|
||||||
const char *msgid;
|
|
||||||
{
|
{
|
||||||
return dgettext__ (domainname, msgid);
|
return libintl_dgettext (domainname, msgid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
char *
|
char *
|
||||||
dcgettext (domainname, msgid, category)
|
dcgettext (const char *domainname, const char *msgid, int category)
|
||||||
const char *domainname;
|
|
||||||
const char *msgid;
|
|
||||||
int category;
|
|
||||||
{
|
{
|
||||||
return dcgettext__ (domainname, msgid, category);
|
return libintl_dcgettext (domainname, msgid, category);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
char *
|
char *
|
||||||
ngettext (msgid1, msgid2, n)
|
ngettext (const char *msgid1, const char *msgid2, unsigned long int n)
|
||||||
const char *msgid1;
|
|
||||||
const char *msgid2;
|
|
||||||
unsigned long int n;
|
|
||||||
{
|
{
|
||||||
return ngettext__ (msgid1, msgid2, n);
|
return libintl_ngettext (msgid1, msgid2, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
char *
|
char *
|
||||||
dngettext (domainname, msgid1, msgid2, n)
|
dngettext (const char *domainname,
|
||||||
const char *domainname;
|
const char *msgid1, const char *msgid2, unsigned long int n)
|
||||||
const char *msgid1;
|
|
||||||
const char *msgid2;
|
|
||||||
unsigned long int n;
|
|
||||||
{
|
{
|
||||||
return dngettext__ (domainname, msgid1, msgid2, n);
|
return libintl_dngettext (domainname, msgid1, msgid2, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
char *
|
char *
|
||||||
dcngettext (domainname, msgid1, msgid2, n, category)
|
dcngettext (const char *domainname,
|
||||||
const char *domainname;
|
const char *msgid1, const char *msgid2, unsigned long int n,
|
||||||
const char *msgid1;
|
int category)
|
||||||
const char *msgid2;
|
|
||||||
unsigned long int n;
|
|
||||||
int category;
|
|
||||||
{
|
{
|
||||||
return dcngettext__ (domainname, msgid1, msgid2, n, category);
|
return libintl_dcngettext (domainname, msgid1, msgid2, n, category);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
char *
|
char *
|
||||||
textdomain (domainname)
|
textdomain (const char *domainname)
|
||||||
const char *domainname;
|
|
||||||
{
|
{
|
||||||
return textdomain__ (domainname);
|
return libintl_textdomain (domainname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
char *
|
char *
|
||||||
bindtextdomain (domainname, dirname)
|
bindtextdomain (const char *domainname, const char *dirname)
|
||||||
const char *domainname;
|
|
||||||
const char *dirname;
|
|
||||||
{
|
{
|
||||||
return bindtextdomain__ (domainname, dirname);
|
return libintl_bindtextdomain (domainname, dirname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
char *
|
char *
|
||||||
bind_textdomain_codeset (domainname, codeset)
|
bind_textdomain_codeset (const char *domainname, const char *codeset)
|
||||||
const char *domainname;
|
|
||||||
const char *codeset;
|
|
||||||
{
|
{
|
||||||
return bind_textdomain_codeset__ (domainname, codeset);
|
return libintl_bind_textdomain_codeset (domainname, codeset);
|
||||||
}
|
}
|
||||||
|
204
intl/l10nflist.c
204
intl/l10nflist.c
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
|
/* Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
|
||||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
This program is free software; you can redistribute it and/or modify it
|
||||||
@ -28,11 +28,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#if !HAVE_STRCHR && !defined _LIBC
|
|
||||||
# ifndef strchr
|
|
||||||
# define strchr index
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined _LIBC || defined HAVE_ARGZ_H
|
#if defined _LIBC || defined HAVE_ARGZ_H
|
||||||
# include <argz.h>
|
# include <argz.h>
|
||||||
@ -63,20 +58,34 @@
|
|||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
# ifndef HAVE_STPCPY
|
# ifndef HAVE_STPCPY
|
||||||
static char *stpcpy PARAMS ((char *dest, const char *src));
|
static char *stpcpy (char *dest, const char *src);
|
||||||
# endif
|
# endif
|
||||||
#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. */
|
/* Define function which are usually not available. */
|
||||||
|
|
||||||
#if !defined _LIBC && !defined HAVE___ARGZ_COUNT
|
#if !defined _LIBC && !defined HAVE___ARGZ_COUNT
|
||||||
/* Returns the number of strings in ARGZ. */
|
/* Returns the number of strings in ARGZ. */
|
||||||
static size_t argz_count__ PARAMS ((const char *argz, size_t len));
|
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
argz_count__ (argz, len)
|
argz_count__ (const char *argz, size_t len)
|
||||||
const char *argz;
|
|
||||||
size_t len;
|
|
||||||
{
|
{
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
while (len > 0)
|
while (len > 0)
|
||||||
@ -90,18 +99,17 @@ argz_count__ (argz, len)
|
|||||||
}
|
}
|
||||||
# undef __argz_count
|
# undef __argz_count
|
||||||
# define __argz_count(argz, len) argz_count__ (argz, len)
|
# 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 */
|
#endif /* !_LIBC && !HAVE___ARGZ_COUNT */
|
||||||
|
|
||||||
#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY
|
#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY
|
||||||
/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
|
/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
|
||||||
except the last into the character SEP. */
|
except the last into the character SEP. */
|
||||||
static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep));
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
argz_stringify__ (argz, len, sep)
|
argz_stringify__ (char *argz, size_t len, int sep)
|
||||||
char *argz;
|
|
||||||
size_t len;
|
|
||||||
int sep;
|
|
||||||
{
|
{
|
||||||
while (len > 0)
|
while (len > 0)
|
||||||
{
|
{
|
||||||
@ -114,17 +122,16 @@ argz_stringify__ (argz, len, sep)
|
|||||||
}
|
}
|
||||||
# undef __argz_stringify
|
# undef __argz_stringify
|
||||||
# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
|
# 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 */
|
#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */
|
||||||
|
|
||||||
#if !defined _LIBC && !defined HAVE___ARGZ_NEXT
|
#if !defined _LIBC && !defined HAVE___ARGZ_NEXT
|
||||||
static char *argz_next__ PARAMS ((char *argz, size_t argz_len,
|
|
||||||
const char *entry));
|
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
argz_next__ (argz, argz_len, entry)
|
argz_next__ (char *argz, size_t argz_len, const char *entry)
|
||||||
char *argz;
|
|
||||||
size_t argz_len;
|
|
||||||
const char *entry;
|
|
||||||
{
|
{
|
||||||
if (entry)
|
if (entry)
|
||||||
{
|
{
|
||||||
@ -145,11 +152,8 @@ argz_next__ (argz, argz_len, entry)
|
|||||||
|
|
||||||
|
|
||||||
/* Return number of bits set in X. */
|
/* Return number of bits set in X. */
|
||||||
static int pop PARAMS ((int x));
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
pop (x)
|
pop (int x)
|
||||||
int x;
|
|
||||||
{
|
{
|
||||||
/* We assume that no more than 16 bits are used. */
|
/* We assume that no more than 16 bits are used. */
|
||||||
x = ((x & ~0x5555) >> 1) + (x & 0x5555);
|
x = ((x & ~0x5555) >> 1) + (x & 0x5555);
|
||||||
@ -162,31 +166,27 @@ pop (x)
|
|||||||
|
|
||||||
|
|
||||||
struct loaded_l10nfile *
|
struct loaded_l10nfile *
|
||||||
_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
|
_nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list,
|
||||||
territory, codeset, normalized_codeset, modifier, special,
|
const char *dirlist, size_t dirlist_len,
|
||||||
sponsor, revision, filename, do_allocate)
|
int mask, const char *language, const char *territory,
|
||||||
struct loaded_l10nfile **l10nfile_list;
|
const char *codeset, const char *normalized_codeset,
|
||||||
const char *dirlist;
|
const char *modifier, const char *special,
|
||||||
size_t dirlist_len;
|
const char *sponsor, const char *revision,
|
||||||
int mask;
|
const char *filename, int do_allocate)
|
||||||
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;
|
char *abs_filename;
|
||||||
struct loaded_l10nfile *last = NULL;
|
struct loaded_l10nfile **lastp;
|
||||||
struct loaded_l10nfile *retval;
|
struct loaded_l10nfile *retval;
|
||||||
char *cp;
|
char *cp;
|
||||||
|
size_t dirlist_count;
|
||||||
size_t entries;
|
size_t entries;
|
||||||
int cnt;
|
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. */
|
/* Allocate room for the full file name. */
|
||||||
abs_filename = (char *) malloc (dirlist_len
|
abs_filename = (char *) malloc (dirlist_len
|
||||||
+ strlen (language)
|
+ strlen (language)
|
||||||
@ -204,7 +204,7 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
|
|||||||
+ (((mask & CEN_SPONSOR) != 0
|
+ (((mask & CEN_SPONSOR) != 0
|
||||||
|| (mask & CEN_REVISION) != 0)
|
|| (mask & CEN_REVISION) != 0)
|
||||||
? (1 + ((mask & CEN_SPONSOR) != 0
|
? (1 + ((mask & CEN_SPONSOR) != 0
|
||||||
? strlen (sponsor) + 1 : 0)
|
? strlen (sponsor) : 0)
|
||||||
+ ((mask & CEN_REVISION) != 0
|
+ ((mask & CEN_REVISION) != 0
|
||||||
? strlen (revision) + 1 : 0)) : 0)
|
? strlen (revision) + 1 : 0)) : 0)
|
||||||
+ 1 + strlen (filename) + 1);
|
+ 1 + strlen (filename) + 1);
|
||||||
@ -212,14 +212,16 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
|
|||||||
if (abs_filename == NULL)
|
if (abs_filename == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
retval = NULL;
|
|
||||||
last = NULL;
|
|
||||||
|
|
||||||
/* Construct file name. */
|
/* Construct file name. */
|
||||||
memcpy (abs_filename, dirlist, dirlist_len);
|
cp = abs_filename;
|
||||||
__argz_stringify (abs_filename, dirlist_len, PATH_SEPARATOR);
|
if (dirlist_len > 0)
|
||||||
cp = abs_filename + (dirlist_len - 1);
|
{
|
||||||
*cp++ = '/';
|
memcpy (cp, dirlist, dirlist_len);
|
||||||
|
__argz_stringify (cp, dirlist_len, PATH_SEPARATOR);
|
||||||
|
cp += dirlist_len;
|
||||||
|
cp[-1] = '/';
|
||||||
|
}
|
||||||
|
|
||||||
cp = stpcpy (cp, language);
|
cp = stpcpy (cp, language);
|
||||||
|
|
||||||
if ((mask & TERRITORY) != 0)
|
if ((mask & TERRITORY) != 0)
|
||||||
@ -266,7 +268,7 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
|
|||||||
|
|
||||||
/* Look in list of already loaded domains whether it is already
|
/* Look in list of already loaded domains whether it is already
|
||||||
available. */
|
available. */
|
||||||
last = NULL;
|
lastp = l10nfile_list;
|
||||||
for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
|
for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
|
||||||
if (retval->filename != NULL)
|
if (retval->filename != NULL)
|
||||||
{
|
{
|
||||||
@ -281,7 +283,7 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
last = retval;
|
lastp = &retval->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (retval != NULL || do_allocate == 0)
|
if (retval != NULL || do_allocate == 0)
|
||||||
@ -290,48 +292,66 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = (struct loaded_l10nfile *)
|
dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1);
|
||||||
malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len)
|
|
||||||
* (1 << pop (mask))
|
/* Allocate a new loaded_l10nfile. */
|
||||||
* sizeof (struct 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)
|
if (retval == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
retval->filename = abs_filename;
|
retval->filename = abs_filename;
|
||||||
retval->decided = (__argz_count (dirlist, dirlist_len) != 1
|
|
||||||
|
/* 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_CODESET) != 0
|
||||||
&& (mask & XPG_NORM_CODESET) != 0));
|
&& (mask & XPG_NORM_CODESET) != 0));
|
||||||
retval->data = NULL;
|
retval->data = NULL;
|
||||||
|
|
||||||
if (last == NULL)
|
retval->next = *lastp;
|
||||||
{
|
*lastp = retval;
|
||||||
retval->next = *l10nfile_list;
|
|
||||||
*l10nfile_list = retval;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
retval->next = last->next;
|
|
||||||
last->next = retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
entries = 0;
|
entries = 0;
|
||||||
/* If the DIRLIST is a real list the RETVAL entry corresponds not to
|
/* Recurse to fill the inheritance list of RETVAL.
|
||||||
a real file. So we have to use the DIRLIST separation mechanism
|
If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL
|
||||||
of the inner loop. */
|
entry does not correspond to a real file; retval->filename contains
|
||||||
cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask;
|
colons. In this case we loop across all elements of DIRLIST and
|
||||||
for (; cnt >= 0; --cnt)
|
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
|
if ((cnt & ~mask) == 0
|
||||||
&& ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0)
|
&& ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0)
|
||||||
&& ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0))
|
&& ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0))
|
||||||
{
|
{
|
||||||
/* Iterate over all elements of the DIRLIST. */
|
if (dirlist_count > 1)
|
||||||
char *dir = NULL;
|
{
|
||||||
|
/* Iterate over all elements of the DIRLIST. */
|
||||||
|
char *dir = NULL;
|
||||||
|
|
||||||
while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
|
while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
|
||||||
!= NULL)
|
!= 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++]
|
retval->successor[entries++]
|
||||||
= _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt,
|
= _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len,
|
||||||
language, territory, codeset,
|
cnt, language, territory, codeset,
|
||||||
normalized_codeset, modifier, special,
|
normalized_codeset, modifier, special,
|
||||||
sponsor, revision, filename, 1);
|
sponsor, revision, filename, 1);
|
||||||
}
|
}
|
||||||
@ -345,9 +365,7 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
|
|||||||
names. The return value is dynamically allocated and has to be
|
names. The return value is dynamically allocated and has to be
|
||||||
freed by the caller. */
|
freed by the caller. */
|
||||||
const char *
|
const char *
|
||||||
_nl_normalize_codeset (codeset, name_len)
|
_nl_normalize_codeset (const char *codeset, size_t name_len)
|
||||||
const char *codeset;
|
|
||||||
size_t name_len;
|
|
||||||
{
|
{
|
||||||
int len = 0;
|
int len = 0;
|
||||||
int only_digit = 1;
|
int only_digit = 1;
|
||||||
@ -356,11 +374,11 @@ _nl_normalize_codeset (codeset, name_len)
|
|||||||
size_t cnt;
|
size_t cnt;
|
||||||
|
|
||||||
for (cnt = 0; cnt < name_len; ++cnt)
|
for (cnt = 0; cnt < name_len; ++cnt)
|
||||||
if (isalnum (codeset[cnt]))
|
if (isalnum ((unsigned char) codeset[cnt]))
|
||||||
{
|
{
|
||||||
++len;
|
++len;
|
||||||
|
|
||||||
if (isalpha (codeset[cnt]))
|
if (isalpha ((unsigned char) codeset[cnt]))
|
||||||
only_digit = 0;
|
only_digit = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -374,9 +392,9 @@ _nl_normalize_codeset (codeset, name_len)
|
|||||||
wp = retval;
|
wp = retval;
|
||||||
|
|
||||||
for (cnt = 0; cnt < name_len; ++cnt)
|
for (cnt = 0; cnt < name_len; ++cnt)
|
||||||
if (isalpha (codeset[cnt]))
|
if (isalpha ((unsigned char) codeset[cnt]))
|
||||||
*wp++ = tolower (codeset[cnt]);
|
*wp++ = tolower ((unsigned char) codeset[cnt]);
|
||||||
else if (isdigit (codeset[cnt]))
|
else if (isdigit ((unsigned char) codeset[cnt]))
|
||||||
*wp++ = codeset[cnt];
|
*wp++ = codeset[cnt];
|
||||||
|
|
||||||
*wp = '\0';
|
*wp = '\0';
|
||||||
@ -394,9 +412,7 @@ _nl_normalize_codeset (codeset, name_len)
|
|||||||
to be defined. */
|
to be defined. */
|
||||||
#if !_LIBC && !HAVE_STPCPY
|
#if !_LIBC && !HAVE_STPCPY
|
||||||
static char *
|
static char *
|
||||||
stpcpy (dest, src)
|
stpcpy (char *dest, const char *src)
|
||||||
char *dest;
|
|
||||||
const char *src;
|
|
||||||
{
|
{
|
||||||
while ((*dest++ = *src++) != '\0')
|
while ((*dest++ = *src++) != '\0')
|
||||||
/* Do nothing. */ ;
|
/* Do nothing. */ ;
|
||||||
|
@ -1,49 +0,0 @@
|
|||||||
/* Convenience header for conditional use of GNU <libintl.h>.
|
|
||||||
Copyright (C) 1995-1998, 2000, 2001 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
|
|
||||||
|
|
||||||
# define gettext(Msgid) (Msgid)
|
|
||||||
# define dgettext(Domainname, Msgid) (Msgid)
|
|
||||||
# define dcgettext(Domainname, Msgid, Category) (Msgid)
|
|
||||||
# define ngettext(Msgid1, Msgid2, N) \
|
|
||||||
((N) == 1 ? (char *) (Msgid1) : (char *) (Msgid2))
|
|
||||||
# define dngettext(Domainname, Msgid1, Msgid2, N) \
|
|
||||||
((N) == 1 ? (char *) (Msgid1) : (char *) (Msgid2))
|
|
||||||
# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
|
|
||||||
((N) == 1 ? (char *) (Msgid1) : (char *) (Msgid2))
|
|
||||||
# define textdomain(Domainname) ((char *) (Domainname))
|
|
||||||
# define bindtextdomain(Domainname, Dirname) ((char *) (Dirname))
|
|
||||||
# define bind_textdomain_codeset(Domainname, Codeset) ((char *) (Codeset))
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* For automatical extraction of messages sometimes no real
|
|
||||||
translation is needed. Instead the string itself is the result. */
|
|
||||||
#define gettext_noop(Str) (Str)
|
|
||||||
|
|
||||||
#endif /* _LIBGETTEXT_H */
|
|
@ -1,5 +1,5 @@
|
|||||||
/* Message catalogs for internationalization.
|
/* Message catalogs for internationalization.
|
||||||
Copyright (C) 1995-1997, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -24,10 +24,11 @@
|
|||||||
/* The LC_MESSAGES locale category is the category used by the functions
|
/* 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.
|
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 systems that don't define it, use an arbitrary value instead.
|
||||||
On Solaris, <locale.h> defines __LOCALE_H then includes <libintl.h> (i.e.
|
On Solaris, <locale.h> defines __LOCALE_H (or _LOCALE_H in Solaris 2.5)
|
||||||
this file!) and then only defines LC_MESSAGES. To avoid a redefinition
|
then includes <libintl.h> (i.e. this file!) and then only defines
|
||||||
warning, don't define LC_MESSAGES in this case. */
|
LC_MESSAGES. To avoid a redefinition warning, don't define LC_MESSAGES
|
||||||
#if !defined LC_MESSAGES && !defined __LOCALE_H
|
in this case. */
|
||||||
|
#if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun))
|
||||||
# define LC_MESSAGES 1729
|
# define LC_MESSAGES 1729
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -35,90 +36,344 @@
|
|||||||
implementation of gettext. */
|
implementation of gettext. */
|
||||||
#define __USE_GNU_GETTEXT 1
|
#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
|
/* Resolve a platform specific conflict on DJGPP. GNU gettext takes
|
||||||
precedence over _conio_gettext. */
|
precedence over _conio_gettext. */
|
||||||
#ifdef __DJGPP__
|
#ifdef __DJGPP__
|
||||||
# undef gettext
|
# undef gettext
|
||||||
# define gettext gettext
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef PARAMS
|
|
||||||
# if __STDC__ || defined __cplusplus
|
|
||||||
# define PARAMS(args) args
|
|
||||||
# else
|
|
||||||
# define PARAMS(args) ()
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#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
|
/* Look up MSGID in the current default message catalog for the current
|
||||||
LC_MESSAGES locale. If not found, returns MSGID itself (the default
|
LC_MESSAGES locale. If not found, returns MSGID itself (the default
|
||||||
text). */
|
text). */
|
||||||
extern char *gettext PARAMS ((const char *__msgid));
|
#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
|
/* Look up MSGID in the DOMAINNAME message catalog for the current
|
||||||
LC_MESSAGES locale. */
|
LC_MESSAGES locale. */
|
||||||
extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid));
|
#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
|
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
|
||||||
locale. */
|
locale. */
|
||||||
extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid,
|
#ifdef _INTL_REDIRECT_INLINE
|
||||||
int __category));
|
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
|
/* Similar to `gettext' but select the plural form corresponding to the
|
||||||
number N. */
|
number N. */
|
||||||
extern char *ngettext PARAMS ((const char *__msgid1, const char *__msgid2,
|
#ifdef _INTL_REDIRECT_INLINE
|
||||||
unsigned long int __n));
|
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
|
/* Similar to `dgettext' but select the plural form corresponding to the
|
||||||
number N. */
|
number N. */
|
||||||
extern char *dngettext PARAMS ((const char *__domainname, const char *__msgid1,
|
#ifdef _INTL_REDIRECT_INLINE
|
||||||
const char *__msgid2, unsigned long int __n));
|
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
|
/* Similar to `dcgettext' but select the plural form corresponding to the
|
||||||
number N. */
|
number N. */
|
||||||
extern char *dcngettext PARAMS ((const char *__domainname, const char *__msgid1,
|
#ifdef _INTL_REDIRECT_INLINE
|
||||||
const char *__msgid2, unsigned long int __n,
|
extern char *libintl_dcngettext (const char *__domainname,
|
||||||
int __category));
|
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.
|
/* Set the current default message catalog to DOMAINNAME.
|
||||||
If DOMAINNAME is null, return the current default.
|
If DOMAINNAME is null, return the current default.
|
||||||
If DOMAINNAME is "", reset to the default of "messages". */
|
If DOMAINNAME is "", reset to the default of "messages". */
|
||||||
extern char *textdomain PARAMS ((const char *__domainname));
|
#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
|
/* Specify that the DOMAINNAME message catalog will be found
|
||||||
in DIRNAME rather than in the system locale data base. */
|
in DIRNAME rather than in the system locale data base. */
|
||||||
extern char *bindtextdomain PARAMS ((const char *__domainname,
|
#ifdef _INTL_REDIRECT_INLINE
|
||||||
const char *__dirname));
|
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
|
/* Specify the character encoding in which the messages from the
|
||||||
DOMAINNAME message catalog will be returned. */
|
DOMAINNAME message catalog will be returned. */
|
||||||
extern char *bind_textdomain_codeset PARAMS ((const char *__domainname,
|
#ifdef _INTL_REDIRECT_INLINE
|
||||||
const char *__codeset));
|
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
|
||||||
|
|
||||||
|
|
||||||
/* Optimized version of the functions above. */
|
/* Support for format strings with positions in *printf(), following the
|
||||||
#if defined __OPTIMIZED
|
POSIX/XSI specification.
|
||||||
/* These are macros, but could also be inline functions. */
|
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. */
|
||||||
|
|
||||||
# define gettext(msgid) \
|
#if !1
|
||||||
dgettext (NULL, msgid)
|
|
||||||
|
|
||||||
# define dgettext(domainname, msgid) \
|
#include <stdio.h>
|
||||||
dcgettext (domainname, msgid, LC_MESSAGES)
|
#include <stddef.h>
|
||||||
|
|
||||||
# define ngettext(msgid1, msgid2, n) \
|
/* Get va_list. */
|
||||||
dngettext (NULL, msgid1, msgid2, n)
|
#if __STDC__ || defined __cplusplus || defined _MSC_VER
|
||||||
|
# include <stdarg.h>
|
||||||
|
#else
|
||||||
|
# include <varargs.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
# define dngettext(domainname, msgid1, msgid2, n) \
|
#undef fprintf
|
||||||
dcngettext (domainname, msgid1, msgid2, n, LC_MESSAGES)
|
#define fprintf libintl_fprintf
|
||||||
|
extern int fprintf (FILE *, const char *, ...);
|
||||||
|
#undef vfprintf
|
||||||
|
#define vfprintf libintl_vfprintf
|
||||||
|
extern int vfprintf (FILE *, const char *, va_list);
|
||||||
|
|
||||||
#endif /* Optimizing. */
|
#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 1
|
||||||
|
|
||||||
|
#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 1
|
||||||
|
|
||||||
|
#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 0
|
||||||
|
|
||||||
|
#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
|
#ifdef __cplusplus
|
||||||
|
383
intl/libgnuintl.h.in
Normal file
383
intl/libgnuintl.h.in
Normal file
@ -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 */
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1996-1999, 2000, 2001 Free Software Foundation, Inc.
|
/* Copyright (C) 1996-1999, 2000-2003 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||||
|
|
||||||
@ -20,13 +20,17 @@
|
|||||||
#ifndef _LOADINFO_H
|
#ifndef _LOADINFO_H
|
||||||
#define _LOADINFO_H 1
|
#define _LOADINFO_H 1
|
||||||
|
|
||||||
#ifndef PARAMS
|
/* Declarations of locale dependent catalog lookup functions.
|
||||||
# if __STDC__
|
Implemented in
|
||||||
# define PARAMS(args) args
|
|
||||||
# else
|
localealias.c Possibly replace a locale name by another.
|
||||||
# define PARAMS(args) ()
|
explodename.c Split a locale name into its various fields.
|
||||||
# endif
|
l10nflist.c Generate a list of filenames of possible message catalogs.
|
||||||
#endif
|
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
|
#ifndef internal_function
|
||||||
# define internal_function
|
# define internal_function
|
||||||
@ -77,33 +81,65 @@ struct loaded_l10nfile
|
|||||||
names. Normalization allows the user to use any of the common
|
names. Normalization allows the user to use any of the common
|
||||||
names. The return value is dynamically allocated and has to be
|
names. The return value is dynamically allocated and has to be
|
||||||
freed by the caller. */
|
freed by the caller. */
|
||||||
extern const char *_nl_normalize_codeset PARAMS ((const char *codeset,
|
extern const char *_nl_normalize_codeset (const char *codeset,
|
||||||
size_t name_len));
|
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 *
|
extern struct loaded_l10nfile *
|
||||||
_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list,
|
_nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list,
|
||||||
const char *dirlist, size_t dirlist_len, int mask,
|
const char *dirlist, size_t dirlist_len, int mask,
|
||||||
const char *language, const char *territory,
|
const char *language, const char *territory,
|
||||||
const char *codeset,
|
const char *codeset, const char *normalized_codeset,
|
||||||
const char *normalized_codeset,
|
const char *modifier, const char *special,
|
||||||
const char *modifier, const char *special,
|
const char *sponsor, const char *revision,
|
||||||
const char *sponsor, const char *revision,
|
const char *filename, int do_allocate);
|
||||||
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);
|
||||||
|
|
||||||
extern const char *_nl_expand_alias PARAMS ((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);
|
||||||
|
|
||||||
/* normalized_codeset is dynamically allocated and has to be freed by
|
/* Split a locale name NAME into a leading language part and all the
|
||||||
the caller. */
|
rest. Return a pointer to the first character after the language,
|
||||||
extern int _nl_explode_name PARAMS ((char *name, const char **language,
|
i.e. to the first byte of the rest. */
|
||||||
const char **modifier,
|
extern char *_nl_find_language (const char *name);
|
||||||
const char **territory,
|
|
||||||
const char **codeset,
|
|
||||||
const char **normalized_codeset,
|
|
||||||
const char **special,
|
|
||||||
const char **sponsor,
|
|
||||||
const char **revision));
|
|
||||||
|
|
||||||
extern char *_nl_find_language PARAMS ((const char *name));
|
|
||||||
|
|
||||||
#endif /* loadinfo.h */
|
#endif /* loadinfo.h */
|
||||||
|
1171
intl/loadmsgcat.c
1171
intl/loadmsgcat.c
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
|||||||
/* Determine a canonical name for the current locale's character encoding.
|
/* Determine a canonical name for the current locale's character encoding.
|
||||||
|
|
||||||
Copyright (C) 2000-2001 Free Software Foundation, Inc.
|
Copyright (C) 2000-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -17,12 +17,15 @@
|
|||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||||
USA. */
|
USA. */
|
||||||
|
|
||||||
/* Written by Bruno Haible <haible@clisp.cons.org>. */
|
/* Written by Bruno Haible <bruno@clisp.org>. */
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "localcharset.h"
|
||||||
|
|
||||||
#if HAVE_STDDEF_H
|
#if HAVE_STDDEF_H
|
||||||
# include <stddef.h>
|
# include <stddef.h>
|
||||||
#endif
|
#endif
|
||||||
@ -42,7 +45,12 @@
|
|||||||
# define WIN32
|
# define WIN32
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef WIN32
|
#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
|
# if HAVE_LANGINFO_CODESET
|
||||||
# include <langinfo.h>
|
# include <langinfo.h>
|
||||||
# else
|
# else
|
||||||
@ -50,10 +58,25 @@
|
|||||||
# include <locale.h>
|
# include <locale.h>
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
#else /* WIN32 */
|
#elif defined WIN32
|
||||||
# define WIN32_LEAN_AND_MEAN
|
# define WIN32_LEAN_AND_MEAN
|
||||||
# include <windows.h>
|
# include <windows.h>
|
||||||
#endif
|
#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
|
#ifndef DIRECTORY_SEPARATOR
|
||||||
# define DIRECTORY_SEPARATOR '/'
|
# define DIRECTORY_SEPARATOR '/'
|
||||||
@ -63,6 +86,11 @@
|
|||||||
# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
|
# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_DECL_GETC_UNLOCKED
|
||||||
|
# undef getc
|
||||||
|
# define getc getc_unlocked
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The following static variable is declared 'volatile' to avoid a
|
/* The following static variable is declared 'volatile' to avoid a
|
||||||
possible multithread problem in the function get_charset_aliases. If we
|
possible multithread problem in the function get_charset_aliases. If we
|
||||||
are running in a threaded environment, and if two threads initialize
|
are running in a threaded environment, and if two threads initialize
|
||||||
@ -86,9 +114,9 @@ get_charset_aliases ()
|
|||||||
cp = charset_aliases;
|
cp = charset_aliases;
|
||||||
if (cp == NULL)
|
if (cp == NULL)
|
||||||
{
|
{
|
||||||
#ifndef WIN32
|
#if !(defined VMS || defined WIN32)
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
const char *dir = LIBDIR;
|
const char *dir = relocate (LIBDIR);
|
||||||
const char *base = "charset.alias";
|
const char *base = "charset.alias";
|
||||||
char *file_name;
|
char *file_name;
|
||||||
|
|
||||||
@ -138,19 +166,19 @@ get_charset_aliases ()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ungetc (c, fp);
|
ungetc (c, fp);
|
||||||
if (fscanf(fp, "%50s %50s", buf1, buf2) < 2)
|
if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
|
||||||
break;
|
break;
|
||||||
l1 = strlen (buf1);
|
l1 = strlen (buf1);
|
||||||
l2 = strlen (buf2);
|
l2 = strlen (buf2);
|
||||||
if (res_size == 0)
|
if (res_size == 0)
|
||||||
{
|
{
|
||||||
res_size = l1 + 1 + l2 + 1;
|
res_size = l1 + 1 + l2 + 1;
|
||||||
res_ptr = malloc (res_size + 1);
|
res_ptr = (char *) malloc (res_size + 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
res_size += l1 + 1 + l2 + 1;
|
res_size += l1 + 1 + l2 + 1;
|
||||||
res_ptr = realloc (res_ptr, res_size + 1);
|
res_ptr = (char *) realloc (res_ptr, res_size + 1);
|
||||||
}
|
}
|
||||||
if (res_ptr == NULL)
|
if (res_ptr == NULL)
|
||||||
{
|
{
|
||||||
@ -174,14 +202,54 @@ get_charset_aliases ()
|
|||||||
if (file_name != NULL)
|
if (file_name != NULL)
|
||||||
free (file_name);
|
free (file_name);
|
||||||
|
|
||||||
#else /* WIN32 */
|
#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
|
/* To avoid the troubles of installing a separate file in the same
|
||||||
directory as the DLL and of retrieving the DLL's directory at
|
directory as the DLL and of retrieving the DLL's directory at
|
||||||
runtime, simply inline the aliases here. */
|
runtime, simply inline the aliases here. */
|
||||||
|
|
||||||
cp = "CP936" "\0" "GBK" "\0"
|
cp = "CP936" "\0" "GBK" "\0"
|
||||||
"CP1361" "\0" "JOHAB" "\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
|
#endif
|
||||||
|
|
||||||
charset_aliases = cp;
|
charset_aliases = cp;
|
||||||
@ -205,7 +273,7 @@ locale_charset ()
|
|||||||
const char *codeset;
|
const char *codeset;
|
||||||
const char *aliases;
|
const char *aliases;
|
||||||
|
|
||||||
#ifndef WIN32
|
#if !(defined WIN32 || defined OS2)
|
||||||
|
|
||||||
# if HAVE_LANGINFO_CODESET
|
# if HAVE_LANGINFO_CODESET
|
||||||
|
|
||||||
@ -242,14 +310,67 @@ locale_charset ()
|
|||||||
|
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#else /* WIN32 */
|
#elif defined WIN32
|
||||||
|
|
||||||
static char buf[2 + 10 + 1];
|
static char buf[2 + 10 + 1];
|
||||||
|
|
||||||
/* Win32 has a function returning the locale's codepage as a number. */
|
/* Woe32 has a function returning the locale's codepage as a number. */
|
||||||
sprintf (buf, "CP%u", GetACP ());
|
sprintf (buf, "CP%u", GetACP ());
|
||||||
codeset = buf;
|
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
|
#endif
|
||||||
|
|
||||||
if (codeset == NULL)
|
if (codeset == NULL)
|
||||||
@ -267,5 +388,11 @@ locale_charset ()
|
|||||||
break;
|
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;
|
return codeset;
|
||||||
}
|
}
|
||||||
|
42
intl/localcharset.h
Normal file
42
intl/localcharset.h
Normal file
@ -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 */
|
@ -1,5 +1,5 @@
|
|||||||
# Locale name alias data base.
|
# Locale name alias data base.
|
||||||
# Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2001,2003 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify it
|
# 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
|
# under the terms of the GNU Library General Public License as published
|
||||||
@ -29,8 +29,8 @@
|
|||||||
|
|
||||||
# Packages using this file:
|
# Packages using this file:
|
||||||
|
|
||||||
bokmal no_NO.ISO-8859-1
|
bokmal nb_NO.ISO-8859-1
|
||||||
bokmål no_NO.ISO-8859-1
|
bokmål nb_NO.ISO-8859-1
|
||||||
catalan ca_ES.ISO-8859-1
|
catalan ca_ES.ISO-8859-1
|
||||||
croatian hr_HR.ISO-8859-2
|
croatian hr_HR.ISO-8859-2
|
||||||
czech cs_CZ.ISO-8859-2
|
czech cs_CZ.ISO-8859-2
|
||||||
@ -61,9 +61,9 @@ korean ko_KR.eucKR
|
|||||||
korean.euc ko_KR.eucKR
|
korean.euc ko_KR.eucKR
|
||||||
ko_KR ko_KR.eucKR
|
ko_KR ko_KR.eucKR
|
||||||
lithuanian lt_LT.ISO-8859-13
|
lithuanian lt_LT.ISO-8859-13
|
||||||
nb_NO no_NO.ISO-8859-1
|
no_NO nb_NO.ISO-8859-1
|
||||||
nb_NO.ISO-8859-1 no_NO.ISO-8859-1
|
no_NO.ISO-8859-1 nb_NO.ISO-8859-1
|
||||||
norwegian no_NO.ISO-8859-1
|
norwegian nb_NO.ISO-8859-1
|
||||||
nynorsk nn_NO.ISO-8859-1
|
nynorsk nn_NO.ISO-8859-1
|
||||||
polish pl_PL.ISO-8859-2
|
polish pl_PL.ISO-8859-2
|
||||||
portuguese pt_PT.ISO-8859-1
|
portuguese pt_PT.ISO-8859-1
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Handle aliases for locale names.
|
/* Handle aliases for locale names.
|
||||||
Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -29,36 +29,45 @@
|
|||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#if defined _LIBC || defined HAVE___FSETLOCKING
|
||||||
|
# include <stdio_ext.h>
|
||||||
|
#endif
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
|
# undef alloca
|
||||||
# define alloca __builtin_alloca
|
# define alloca __builtin_alloca
|
||||||
# define HAVE_ALLOCA 1
|
# define HAVE_ALLOCA 1
|
||||||
#else
|
#else
|
||||||
# if defined HAVE_ALLOCA_H || defined _LIBC
|
# ifdef _MSC_VER
|
||||||
# include <alloca.h>
|
# include <malloc.h>
|
||||||
|
# define alloca _alloca
|
||||||
# else
|
# else
|
||||||
# ifdef _AIX
|
# if defined HAVE_ALLOCA_H || defined _LIBC
|
||||||
#pragma alloca
|
# include <alloca.h>
|
||||||
# else
|
# else
|
||||||
# ifndef alloca
|
# ifdef _AIX
|
||||||
|
#pragma alloca
|
||||||
|
# else
|
||||||
|
# ifndef alloca
|
||||||
char *alloca ();
|
char *alloca ();
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#if !HAVE_STRCHR && !defined _LIBC
|
|
||||||
# ifndef strchr
|
|
||||||
# define strchr index
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "gettextP.h"
|
#include "gettextP.h"
|
||||||
|
|
||||||
|
#if ENABLE_RELOCATABLE
|
||||||
|
# include "relocatable.h"
|
||||||
|
#else
|
||||||
|
# define relocate(pathname) (pathname)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* @@ end of prolog @@ */
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
@ -71,6 +80,7 @@ char *alloca ();
|
|||||||
# define mempcpy __mempcpy
|
# define mempcpy __mempcpy
|
||||||
# endif
|
# endif
|
||||||
# define HAVE_MEMPCPY 1
|
# define HAVE_MEMPCPY 1
|
||||||
|
# define HAVE___FSETLOCKING 1
|
||||||
|
|
||||||
/* We need locking here since we can be called from different places. */
|
/* We need locking here since we can be called from different places. */
|
||||||
# include <bits/libc-lock.h>
|
# include <bits/libc-lock.h>
|
||||||
@ -82,6 +92,15 @@ __libc_lock_define_initialized (static, lock);
|
|||||||
# define internal_function
|
# define internal_function
|
||||||
#endif
|
#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
|
/* For those losing systems which don't have `alloca' we have to add
|
||||||
some additional code emulating it. */
|
some additional code emulating it. */
|
||||||
#ifdef HAVE_ALLOCA
|
#ifdef HAVE_ALLOCA
|
||||||
@ -91,11 +110,11 @@ __libc_lock_define_initialized (static, lock);
|
|||||||
# define freea(p) free (p)
|
# define freea(p) free (p)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined _LIBC_REENTRANT || defined HAVE_FGETS_UNLOCKED
|
#if defined _LIBC_REENTRANT || HAVE_DECL_FGETS_UNLOCKED
|
||||||
# undef fgets
|
# undef fgets
|
||||||
# define fgets(buf, len, s) fgets_unlocked (buf, len, s)
|
# define fgets(buf, len, s) fgets_unlocked (buf, len, s)
|
||||||
#endif
|
#endif
|
||||||
#if defined _LIBC_REENTRANT || defined HAVE_FEOF_UNLOCKED
|
#if defined _LIBC_REENTRANT || HAVE_DECL_FEOF_UNLOCKED
|
||||||
# undef feof
|
# undef feof
|
||||||
# define feof(s) feof_unlocked (s)
|
# define feof(s) feof_unlocked (s)
|
||||||
#endif
|
#endif
|
||||||
@ -108,27 +127,30 @@ struct alias_map
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static char *string_space;
|
#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_act;
|
||||||
static size_t string_space_max;
|
static size_t string_space_max;
|
||||||
static struct alias_map *map;
|
libc_freeres_ptr (static struct alias_map *map);
|
||||||
static size_t nmap;
|
static size_t nmap;
|
||||||
static size_t maxmap;
|
static size_t maxmap;
|
||||||
|
|
||||||
|
|
||||||
/* Prototypes for local functions. */
|
/* Prototypes for local functions. */
|
||||||
static size_t read_alias_file PARAMS ((const char *fname, int fname_len))
|
static size_t read_alias_file (const char *fname, int fname_len)
|
||||||
internal_function;
|
internal_function;
|
||||||
static int extend_alias_table PARAMS ((void));
|
static int extend_alias_table (void);
|
||||||
static int alias_compare PARAMS ((const struct alias_map *map1,
|
static int alias_compare (const struct alias_map *map1,
|
||||||
const struct alias_map *map2));
|
const struct alias_map *map2);
|
||||||
|
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
_nl_expand_alias (name)
|
_nl_expand_alias (const char *name)
|
||||||
const char *name;
|
|
||||||
{
|
{
|
||||||
static const char *locale_alias_path = LOCALE_ALIAS_PATH;
|
static const char *locale_alias_path;
|
||||||
struct alias_map *retval;
|
struct alias_map *retval;
|
||||||
const char *result = NULL;
|
const char *result = NULL;
|
||||||
size_t added;
|
size_t added;
|
||||||
@ -137,6 +159,9 @@ _nl_expand_alias (name)
|
|||||||
__libc_lock_lock (lock);
|
__libc_lock_lock (lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (locale_alias_path == NULL)
|
||||||
|
locale_alias_path = LOCALE_ALIAS_PATH;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
struct alias_map item;
|
struct alias_map item;
|
||||||
@ -146,8 +171,8 @@ _nl_expand_alias (name)
|
|||||||
if (nmap > 0)
|
if (nmap > 0)
|
||||||
retval = (struct alias_map *) bsearch (&item, map, nmap,
|
retval = (struct alias_map *) bsearch (&item, map, nmap,
|
||||||
sizeof (struct alias_map),
|
sizeof (struct alias_map),
|
||||||
(int (*) PARAMS ((const void *,
|
(int (*) (const void *,
|
||||||
const void *))
|
const void *)
|
||||||
) alias_compare);
|
) alias_compare);
|
||||||
else
|
else
|
||||||
retval = NULL;
|
retval = NULL;
|
||||||
@ -189,9 +214,7 @@ _nl_expand_alias (name)
|
|||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
internal_function
|
internal_function
|
||||||
read_alias_file (fname, fname_len)
|
read_alias_file (const char *fname, int fname_len)
|
||||||
const char *fname;
|
|
||||||
int fname_len;
|
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
char *full_fname;
|
char *full_fname;
|
||||||
@ -207,58 +230,52 @@ read_alias_file (fname, fname_len)
|
|||||||
memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
|
memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
fp = fopen (full_fname, "r");
|
fp = fopen (relocate (full_fname), "r");
|
||||||
freea (full_fname);
|
freea (full_fname);
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
#ifdef HAVE___FSETLOCKING
|
||||||
|
/* No threads present. */
|
||||||
|
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
||||||
|
#endif
|
||||||
|
|
||||||
added = 0;
|
added = 0;
|
||||||
while (!feof (fp))
|
while (!FEOF (fp))
|
||||||
{
|
{
|
||||||
/* It is a reasonable approach to use a fix buffer here because
|
/* It is a reasonable approach to use a fix buffer here because
|
||||||
a) we are only interested in the first two fields
|
a) we are only interested in the first two fields
|
||||||
b) these fields must be usable as file names and so must not
|
b) these fields must be usable as file names and so must not
|
||||||
be that long
|
be that long
|
||||||
*/
|
We avoid a multi-kilobyte buffer here since this would use up
|
||||||
char buf[BUFSIZ];
|
stack space which we might not have if the program ran out of
|
||||||
|
memory. */
|
||||||
|
char buf[400];
|
||||||
char *alias;
|
char *alias;
|
||||||
char *value;
|
char *value;
|
||||||
char *cp;
|
char *cp;
|
||||||
|
|
||||||
if (fgets (buf, sizeof buf, fp) == NULL)
|
if (FGETS (buf, sizeof buf, fp) == NULL)
|
||||||
/* EOF reached. */
|
/* EOF reached. */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Possibly not the whole line fits into the buffer. Ignore
|
|
||||||
the rest of the line. */
|
|
||||||
if (strchr (buf, '\n') == NULL)
|
|
||||||
{
|
|
||||||
char altbuf[BUFSIZ];
|
|
||||||
do
|
|
||||||
if (fgets (altbuf, sizeof altbuf, fp) == NULL)
|
|
||||||
/* Make sure the inner loop will be left. The outer loop
|
|
||||||
will exit at the `feof' test. */
|
|
||||||
break;
|
|
||||||
while (strchr (altbuf, '\n') == NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
cp = buf;
|
cp = buf;
|
||||||
/* Ignore leading white space. */
|
/* Ignore leading white space. */
|
||||||
while (isspace (cp[0]))
|
while (isspace ((unsigned char) cp[0]))
|
||||||
++cp;
|
++cp;
|
||||||
|
|
||||||
/* A leading '#' signals a comment line. */
|
/* A leading '#' signals a comment line. */
|
||||||
if (cp[0] != '\0' && cp[0] != '#')
|
if (cp[0] != '\0' && cp[0] != '#')
|
||||||
{
|
{
|
||||||
alias = cp++;
|
alias = cp++;
|
||||||
while (cp[0] != '\0' && !isspace (cp[0]))
|
while (cp[0] != '\0' && !isspace ((unsigned char) cp[0]))
|
||||||
++cp;
|
++cp;
|
||||||
/* Terminate alias name. */
|
/* Terminate alias name. */
|
||||||
if (cp[0] != '\0')
|
if (cp[0] != '\0')
|
||||||
*cp++ = '\0';
|
*cp++ = '\0';
|
||||||
|
|
||||||
/* Now look for the beginning of the value. */
|
/* Now look for the beginning of the value. */
|
||||||
while (isspace (cp[0]))
|
while (isspace ((unsigned char) cp[0]))
|
||||||
++cp;
|
++cp;
|
||||||
|
|
||||||
if (cp[0] != '\0')
|
if (cp[0] != '\0')
|
||||||
@ -267,7 +284,7 @@ read_alias_file (fname, fname_len)
|
|||||||
size_t value_len;
|
size_t value_len;
|
||||||
|
|
||||||
value = cp++;
|
value = cp++;
|
||||||
while (cp[0] != '\0' && !isspace (cp[0]))
|
while (cp[0] != '\0' && !isspace ((unsigned char) cp[0]))
|
||||||
++cp;
|
++cp;
|
||||||
/* Terminate value. */
|
/* Terminate value. */
|
||||||
if (cp[0] == '\n')
|
if (cp[0] == '\n')
|
||||||
@ -325,6 +342,14 @@ read_alias_file (fname, fname_len)
|
|||||||
++added;
|
++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
|
/* Should we test for ferror()? I think we have to silently ignore
|
||||||
@ -333,7 +358,7 @@ read_alias_file (fname, fname_len)
|
|||||||
|
|
||||||
if (added > 0)
|
if (added > 0)
|
||||||
qsort (map, nmap, sizeof (struct alias_map),
|
qsort (map, nmap, sizeof (struct alias_map),
|
||||||
(int (*) PARAMS ((const void *, const void *))) alias_compare);
|
(int (*) (const void *, const void *)) alias_compare);
|
||||||
|
|
||||||
return added;
|
return added;
|
||||||
}
|
}
|
||||||
@ -358,23 +383,8 @@ extend_alias_table ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef _LIBC
|
|
||||||
static void __attribute__ ((unused))
|
|
||||||
free_mem (void)
|
|
||||||
{
|
|
||||||
if (string_space != NULL)
|
|
||||||
free (string_space);
|
|
||||||
if (map != NULL)
|
|
||||||
free (map);
|
|
||||||
}
|
|
||||||
text_set_element (__libc_subfreeres, free_mem);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
alias_compare (map1, map2)
|
alias_compare (const struct alias_map *map1, const struct alias_map *map2)
|
||||||
const struct alias_map *map1;
|
|
||||||
const struct alias_map *map2;
|
|
||||||
{
|
{
|
||||||
#if defined _LIBC || defined HAVE_STRCASECMP
|
#if defined _LIBC || defined HAVE_STRCASECMP
|
||||||
return strcasecmp (map1->alias, map2->alias);
|
return strcasecmp (map1->alias, map2->alias);
|
||||||
|
1142
intl/localename.c
Normal file
1142
intl/localename.c
Normal file
File diff suppressed because it is too large
Load Diff
98
intl/log.c
Normal file
98
intl/log.c
Normal file
@ -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);
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/* Implementation of ngettext(3) function.
|
/* Implementation of ngettext(3) function.
|
||||||
Copyright (C) 1995, 1997, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -46,18 +46,15 @@
|
|||||||
# define NGETTEXT __ngettext
|
# define NGETTEXT __ngettext
|
||||||
# define DCNGETTEXT __dcngettext
|
# define DCNGETTEXT __dcngettext
|
||||||
#else
|
#else
|
||||||
# define NGETTEXT ngettext__
|
# define NGETTEXT libintl_ngettext
|
||||||
# define DCNGETTEXT dcngettext__
|
# define DCNGETTEXT libintl_dcngettext
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Look up MSGID in the current default message catalog for the current
|
/* Look up MSGID in the current default message catalog for the current
|
||||||
LC_MESSAGES locale. If not found, returns MSGID itself (the default
|
LC_MESSAGES locale. If not found, returns MSGID itself (the default
|
||||||
text). */
|
text). */
|
||||||
char *
|
char *
|
||||||
NGETTEXT (msgid1, msgid2, n)
|
NGETTEXT (const char *msgid1, const char *msgid2, unsigned long int n)
|
||||||
const char *msgid1;
|
|
||||||
const char *msgid2;
|
|
||||||
unsigned long int n;
|
|
||||||
{
|
{
|
||||||
return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES);
|
return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES);
|
||||||
}
|
}
|
||||||
|
98
intl/os2compat.c
Normal file
98
intl/os2compat.c
Normal file
@ -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);
|
||||||
|
}
|
46
intl/os2compat.h
Normal file
46
intl/os2compat.h
Normal file
@ -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)
|
24
intl/osdep.c
Normal file
24
intl/osdep.c
Normal file
@ -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
|
154
intl/plural-exp.c
Normal file
154
intl/plural-exp.c
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
118
intl/plural-exp.h
Normal file
118
intl/plural-exp.h
Normal file
@ -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 */
|
1334
intl/plural.c
1334
intl/plural.c
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
|||||||
%{
|
%{
|
||||||
/* Expression parsing for plural form selection.
|
/* Expression parsing for plural form selection.
|
||||||
Copyright (C) 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc.
|
||||||
Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
|
Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
This program is free software; you can redistribute it and/or modify it
|
||||||
@ -30,25 +30,21 @@
|
|||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "gettextP.h"
|
#include "plural-exp.h"
|
||||||
|
|
||||||
/* Names for the libintl functions are a problem. They must not clash
|
/* The main function generated by the parser is called __gettextparse,
|
||||||
with existing names and they should follow ANSI C. But this source
|
but we want it to be called PLURAL_PARSE. */
|
||||||
code is also used in GNU C Library where the names have a __
|
#ifndef _LIBC
|
||||||
prefix. So we have to make a difference here. */
|
# define __gettextparse PLURAL_PARSE
|
||||||
#ifdef _LIBC
|
|
||||||
# define FREE_EXPRESSION __gettext_free_exp
|
|
||||||
#else
|
|
||||||
# define FREE_EXPRESSION gettext_free_exp__
|
|
||||||
# define __gettextparse gettextparse__
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define YYLEX_PARAM &((struct parse_args *) arg)->cp
|
#define YYLEX_PARAM &((struct parse_args *) arg)->cp
|
||||||
#define YYPARSE_PARAM arg
|
#define YYPARSE_PARAM arg
|
||||||
%}
|
%}
|
||||||
%pure_parser
|
%pure_parser
|
||||||
%expect 10
|
%expect 7
|
||||||
|
|
||||||
%union {
|
%union {
|
||||||
unsigned long int num;
|
unsigned long int num;
|
||||||
@ -58,28 +54,13 @@
|
|||||||
|
|
||||||
%{
|
%{
|
||||||
/* Prototypes for local functions. */
|
/* Prototypes for local functions. */
|
||||||
static struct expression *new_exp PARAMS ((int nargs, enum operator op,
|
static int yylex (YYSTYPE *lval, const char **pexp);
|
||||||
struct expression * const *args));
|
static void yyerror (const char *str);
|
||||||
static inline struct expression *new_exp_0 PARAMS ((enum operator op));
|
|
||||||
static inline struct expression *new_exp_1 PARAMS ((enum operator op,
|
|
||||||
struct expression *right));
|
|
||||||
static struct expression *new_exp_2 PARAMS ((enum operator op,
|
|
||||||
struct expression *left,
|
|
||||||
struct expression *right));
|
|
||||||
static inline struct expression *new_exp_3 PARAMS ((enum operator op,
|
|
||||||
struct expression *bexp,
|
|
||||||
struct expression *tbranch,
|
|
||||||
struct expression *fbranch));
|
|
||||||
static int yylex PARAMS ((YYSTYPE *lval, const char **pexp));
|
|
||||||
static void yyerror PARAMS ((const char *str));
|
|
||||||
|
|
||||||
/* Allocation of expressions. */
|
/* Allocation of expressions. */
|
||||||
|
|
||||||
static struct expression *
|
static struct expression *
|
||||||
new_exp (nargs, op, args)
|
new_exp (int nargs, enum operator op, struct expression * const *args)
|
||||||
int nargs;
|
|
||||||
enum operator op;
|
|
||||||
struct expression * const *args;
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct expression *newp;
|
struct expression *newp;
|
||||||
@ -108,16 +89,13 @@ new_exp (nargs, op, args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline struct expression *
|
static inline struct expression *
|
||||||
new_exp_0 (op)
|
new_exp_0 (enum operator op)
|
||||||
enum operator op;
|
|
||||||
{
|
{
|
||||||
return new_exp (0, op, NULL);
|
return new_exp (0, op, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct expression *
|
static inline struct expression *
|
||||||
new_exp_1 (op, right)
|
new_exp_1 (enum operator op, struct expression *right)
|
||||||
enum operator op;
|
|
||||||
struct expression *right;
|
|
||||||
{
|
{
|
||||||
struct expression *args[1];
|
struct expression *args[1];
|
||||||
|
|
||||||
@ -126,10 +104,7 @@ new_exp_1 (op, right)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct expression *
|
static struct expression *
|
||||||
new_exp_2 (op, left, right)
|
new_exp_2 (enum operator op, struct expression *left, struct expression *right)
|
||||||
enum operator op;
|
|
||||||
struct expression *left;
|
|
||||||
struct expression *right;
|
|
||||||
{
|
{
|
||||||
struct expression *args[2];
|
struct expression *args[2];
|
||||||
|
|
||||||
@ -139,11 +114,8 @@ new_exp_2 (op, left, right)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline struct expression *
|
static inline struct expression *
|
||||||
new_exp_3 (op, bexp, tbranch, fbranch)
|
new_exp_3 (enum operator op, struct expression *bexp,
|
||||||
enum operator op;
|
struct expression *tbranch, struct expression *fbranch)
|
||||||
struct expression *bexp;
|
|
||||||
struct expression *tbranch;
|
|
||||||
struct expression *fbranch;
|
|
||||||
{
|
{
|
||||||
struct expression *args[3];
|
struct expression *args[3];
|
||||||
|
|
||||||
@ -234,8 +206,7 @@ exp: exp '?' exp ':' exp
|
|||||||
|
|
||||||
void
|
void
|
||||||
internal_function
|
internal_function
|
||||||
FREE_EXPRESSION (exp)
|
FREE_EXPRESSION (struct expression *exp)
|
||||||
struct expression *exp;
|
|
||||||
{
|
{
|
||||||
if (exp == NULL)
|
if (exp == NULL)
|
||||||
return;
|
return;
|
||||||
@ -261,9 +232,7 @@ FREE_EXPRESSION (exp)
|
|||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
yylex (lval, pexp)
|
yylex (YYSTYPE *lval, const char **pexp)
|
||||||
YYSTYPE *lval;
|
|
||||||
const char **pexp;
|
|
||||||
{
|
{
|
||||||
const char *exp = *pexp;
|
const char *exp = *pexp;
|
||||||
int result;
|
int result;
|
||||||
@ -406,8 +375,7 @@ yylex (lval, pexp)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
yyerror (str)
|
yyerror (const char *str)
|
||||||
const char *str;
|
|
||||||
{
|
{
|
||||||
/* Do nothing. We don't print error messages here. */
|
/* Do nothing. We don't print error messages here. */
|
||||||
}
|
}
|
||||||
|
119
intl/printf-args.c
Normal file
119
intl/printf-args.c
Normal file
@ -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;
|
||||||
|
}
|
137
intl/printf-args.h
Normal file
137
intl/printf-args.h
Normal file
@ -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 */
|
537
intl/printf-parse.c
Normal file
537
intl/printf-parse.c
Normal file
@ -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
|
75
intl/printf-parse.h
Normal file
75
intl/printf-parse.h
Normal file
@ -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 */
|
371
intl/printf.c
Normal file
371
intl/printf.c
Normal file
@ -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
|
449
intl/relocatable.c
Normal file
449
intl/relocatable.c
Normal 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
|
77
intl/relocatable.h
Normal file
77
intl/relocatable.h
Normal file
@ -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 */
|
@ -1,5 +1,5 @@
|
|||||||
/* Implementation of the textdomain(3) function.
|
/* Implementation of the textdomain(3) function.
|
||||||
Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU Library General Public License as published
|
||||||
@ -44,17 +44,17 @@
|
|||||||
names than the internal variables in GNU libc, otherwise programs
|
names than the internal variables in GNU libc, otherwise programs
|
||||||
using libintl.a cannot be linked statically. */
|
using libintl.a cannot be linked statically. */
|
||||||
#if !defined _LIBC
|
#if !defined _LIBC
|
||||||
# define _nl_default_default_domain _nl_default_default_domain__
|
# define _nl_default_default_domain libintl_nl_default_default_domain
|
||||||
# define _nl_current_default_domain _nl_current_default_domain__
|
# define _nl_current_default_domain libintl_nl_current_default_domain
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* @@ end of prolog @@ */
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
/* Name of the default text domain. */
|
/* Name of the default text domain. */
|
||||||
extern const char _nl_default_default_domain[];
|
extern const char _nl_default_default_domain[] attribute_hidden;
|
||||||
|
|
||||||
/* Default text domain in which entries for gettext(3) are to be found. */
|
/* Default text domain in which entries for gettext(3) are to be found. */
|
||||||
extern const char *_nl_current_default_domain;
|
extern const char *_nl_current_default_domain attribute_hidden;
|
||||||
|
|
||||||
|
|
||||||
/* Names for the libintl functions are a problem. They must not clash
|
/* Names for the libintl functions are a problem. They must not clash
|
||||||
@ -67,18 +67,17 @@ extern const char *_nl_current_default_domain;
|
|||||||
# define strdup(str) __strdup (str)
|
# define strdup(str) __strdup (str)
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
# define TEXTDOMAIN textdomain__
|
# define TEXTDOMAIN libintl_textdomain
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Lock variable to protect the global data in the gettext implementation. */
|
/* Lock variable to protect the global data in the gettext implementation. */
|
||||||
__libc_rwlock_define (extern, _nl_state_lock)
|
__libc_rwlock_define (extern, _nl_state_lock attribute_hidden)
|
||||||
|
|
||||||
/* Set the current default message catalog to DOMAINNAME.
|
/* Set the current default message catalog to DOMAINNAME.
|
||||||
If DOMAINNAME is null, return the current default.
|
If DOMAINNAME is null, return the current default.
|
||||||
If DOMAINNAME is "", reset to the default of "messages". */
|
If DOMAINNAME is "", reset to the default of "messages". */
|
||||||
char *
|
char *
|
||||||
TEXTDOMAIN (domainname)
|
TEXTDOMAIN (const char *domainname)
|
||||||
const char *domainname;
|
|
||||||
{
|
{
|
||||||
char *new_domain;
|
char *new_domain;
|
||||||
char *old_domain;
|
char *old_domain;
|
||||||
|
887
intl/vasnprintf.c
Normal file
887
intl/vasnprintf.c
Normal file
@ -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
|
61
intl/vasnprintf.h
Normal file
61
intl/vasnprintf.h
Normal file
@ -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 */
|
46
intl/vasnwprintf.h
Normal file
46
intl/vasnwprintf.h
Normal file
@ -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 */
|
75
intl/wprintf-parse.h
Normal file
75
intl/wprintf-parse.h
Normal file
@ -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 */
|
109
intl/xsize.h
Normal file
109
intl/xsize.h
Normal file
@ -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 */
|
2
m4/.cvsignore
Normal file
2
m4/.cvsignore
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Makefile.in
|
||||||
|
Makefile
|
32
m4/ChangeLog
Normal file
32
m4/ChangeLog
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
2004-05-26 gettextize <bug-gnu-gettext@gnu.org>
|
||||||
|
|
||||||
|
* codeset.m4: New file, from gettext-0.14.1.
|
||||||
|
* gettext.m4: New file, from gettext-0.14.1.
|
||||||
|
* glibc21.m4: New file, from gettext-0.14.1.
|
||||||
|
* iconv.m4: New file, from gettext-0.14.1.
|
||||||
|
* intdiv0.m4: New file, from gettext-0.14.1.
|
||||||
|
* intmax.m4: New file, from gettext-0.14.1.
|
||||||
|
* inttypes.m4: New file, from gettext-0.14.1.
|
||||||
|
* inttypes_h.m4: New file, from gettext-0.14.1.
|
||||||
|
* inttypes-pri.m4: New file, from gettext-0.14.1.
|
||||||
|
* isc-posix.m4: New file, from gettext-0.14.1.
|
||||||
|
* lcmessage.m4: New file, from gettext-0.14.1.
|
||||||
|
* lib-ld.m4: New file, from gettext-0.14.1.
|
||||||
|
* lib-link.m4: New file, from gettext-0.14.1.
|
||||||
|
* lib-prefix.m4: New file, from gettext-0.14.1.
|
||||||
|
* longdouble.m4: New file, from gettext-0.14.1.
|
||||||
|
* longlong.m4: New file, from gettext-0.14.1.
|
||||||
|
* nls.m4: New file, from gettext-0.14.1.
|
||||||
|
* po.m4: New file, from gettext-0.14.1.
|
||||||
|
* printf-posix.m4: New file, from gettext-0.14.1.
|
||||||
|
* progtest.m4: New file, from gettext-0.14.1.
|
||||||
|
* signed.m4: New file, from gettext-0.14.1.
|
||||||
|
* size_max.m4: New file, from gettext-0.14.1.
|
||||||
|
* stdint_h.m4: New file, from gettext-0.14.1.
|
||||||
|
* uintmax_t.m4: New file, from gettext-0.14.1.
|
||||||
|
* ulonglong.m4: New file, from gettext-0.14.1.
|
||||||
|
* wchar_t.m4: New file, from gettext-0.14.1.
|
||||||
|
* wint_t.m4: New file, from gettext-0.14.1.
|
||||||
|
* xsize.m4: New file, from gettext-0.14.1.
|
||||||
|
* Makefile.am: New file.
|
||||||
|
|
1
m4/Makefile.am
Normal file
1
m4/Makefile.am
Normal file
@ -0,0 +1 @@
|
|||||||
|
EXTRA_DIST = codeset.m4 gettext.m4 glibc21.m4 iconv.m4 intdiv0.m4 intmax.m4 inttypes.m4 inttypes_h.m4 inttypes-pri.m4 isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 longdouble.m4 longlong.m4 nls.m4 po.m4 printf-posix.m4 progtest.m4 signed.m4 size_max.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 wchar_t.m4 wint_t.m4 xsize.m4
|
72
m4/intdiv0.m4
Normal file
72
m4/intdiv0.m4
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
# intdiv0.m4 serial 1 (gettext-0.11.3)
|
||||||
|
dnl Copyright (C) 2002 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Bruno Haible.
|
||||||
|
|
||||||
|
AC_DEFUN([gt_INTDIV0],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_PROG_CC])dnl
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
||||||
|
|
||||||
|
AC_CACHE_CHECK([whether integer division by zero raises SIGFPE],
|
||||||
|
gt_cv_int_divbyzero_sigfpe,
|
||||||
|
[
|
||||||
|
AC_TRY_RUN([
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
static void
|
||||||
|
#ifdef __cplusplus
|
||||||
|
sigfpe_handler (int sig)
|
||||||
|
#else
|
||||||
|
sigfpe_handler (sig) int sig;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
/* Exit with code 0 if SIGFPE, with code 1 if any other signal. */
|
||||||
|
exit (sig != SIGFPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
int x = 1;
|
||||||
|
int y = 0;
|
||||||
|
int z;
|
||||||
|
int nan;
|
||||||
|
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
signal (SIGFPE, sigfpe_handler);
|
||||||
|
/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */
|
||||||
|
#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP)
|
||||||
|
signal (SIGTRAP, sigfpe_handler);
|
||||||
|
#endif
|
||||||
|
/* Linux/SPARC yields signal SIGILL. */
|
||||||
|
#if defined (__sparc__) && defined (__linux__)
|
||||||
|
signal (SIGILL, sigfpe_handler);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
z = x / y;
|
||||||
|
nan = y / y;
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no,
|
||||||
|
[
|
||||||
|
# Guess based on the CPU.
|
||||||
|
case "$host_cpu" in
|
||||||
|
alpha* | i[34567]86 | m68k | s390*)
|
||||||
|
gt_cv_int_divbyzero_sigfpe="guessing yes";;
|
||||||
|
*)
|
||||||
|
gt_cv_int_divbyzero_sigfpe="guessing no";;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
])
|
||||||
|
case "$gt_cv_int_divbyzero_sigfpe" in
|
||||||
|
*yes) value=1;;
|
||||||
|
*) value=0;;
|
||||||
|
esac
|
||||||
|
AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value,
|
||||||
|
[Define if integer division by zero raises signal SIGFPE.])
|
||||||
|
])
|
32
m4/inttypes-pri.m4
Normal file
32
m4/inttypes-pri.m4
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# inttypes-pri.m4 serial 1 (gettext-0.11.4)
|
||||||
|
dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Bruno Haible.
|
||||||
|
|
||||||
|
# Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI*
|
||||||
|
# macros to non-string values. This is the case on AIX 4.3.3.
|
||||||
|
|
||||||
|
AC_DEFUN([gt_INTTYPES_PRI],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gt_HEADER_INTTYPES_H])
|
||||||
|
if test $gt_cv_header_inttypes_h = yes; then
|
||||||
|
AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken],
|
||||||
|
gt_cv_inttypes_pri_broken,
|
||||||
|
[
|
||||||
|
AC_TRY_COMPILE([#include <inttypes.h>
|
||||||
|
#ifdef PRId32
|
||||||
|
char *p = PRId32;
|
||||||
|
#endif
|
||||||
|
], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes)
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
if test "$gt_cv_inttypes_pri_broken" = yes; then
|
||||||
|
AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1,
|
||||||
|
[Define if <inttypes.h> exists and defines unusable PRI* macros.])
|
||||||
|
fi
|
||||||
|
])
|
27
m4/inttypes.m4
Normal file
27
m4/inttypes.m4
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# inttypes.m4 serial 1 (gettext-0.11.4)
|
||||||
|
dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Paul Eggert.
|
||||||
|
|
||||||
|
# Define HAVE_INTTYPES_H if <inttypes.h> exists and doesn't clash with
|
||||||
|
# <sys/types.h>.
|
||||||
|
|
||||||
|
AC_DEFUN([gt_HEADER_INTTYPES_H],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h,
|
||||||
|
[
|
||||||
|
AC_TRY_COMPILE(
|
||||||
|
[#include <sys/types.h>
|
||||||
|
#include <inttypes.h>],
|
||||||
|
[], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no)
|
||||||
|
])
|
||||||
|
if test $gt_cv_header_inttypes_h = yes; then
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1,
|
||||||
|
[Define if <inttypes.h> exists and doesn't clash with <sys/types.h>.])
|
||||||
|
fi
|
||||||
|
])
|
28
m4/inttypes_h.m4
Normal file
28
m4/inttypes_h.m4
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# inttypes_h.m4 serial 5 (gettext-0.12)
|
||||||
|
dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Paul Eggert.
|
||||||
|
|
||||||
|
# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
|
||||||
|
# doesn't clash with <sys/types.h>, and declares uintmax_t.
|
||||||
|
|
||||||
|
AC_DEFUN([jm_AC_HEADER_INTTYPES_H],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h,
|
||||||
|
[AC_TRY_COMPILE(
|
||||||
|
[#include <sys/types.h>
|
||||||
|
#include <inttypes.h>],
|
||||||
|
[uintmax_t i = (uintmax_t) -1;],
|
||||||
|
jm_ac_cv_header_inttypes_h=yes,
|
||||||
|
jm_ac_cv_header_inttypes_h=no)])
|
||||||
|
if test $jm_ac_cv_header_inttypes_h = yes; then
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1,
|
||||||
|
[Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
|
||||||
|
and declares uintmax_t. ])
|
||||||
|
fi
|
||||||
|
])
|
112
m4/lib-ld.m4
Normal file
112
m4/lib-ld.m4
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
# lib-ld.m4 serial 3 (gettext-0.13)
|
||||||
|
dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl Subroutines of libtool.m4,
|
||||||
|
dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
|
||||||
|
dnl with libtool.m4.
|
||||||
|
|
||||||
|
dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
|
||||||
|
AC_DEFUN([AC_LIB_PROG_LD_GNU],
|
||||||
|
[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
|
||||||
|
[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
|
||||||
|
case `$LD -v 2>&1 </dev/null` in
|
||||||
|
*GNU* | *'with BFD'*)
|
||||||
|
acl_cv_prog_gnu_ld=yes ;;
|
||||||
|
*)
|
||||||
|
acl_cv_prog_gnu_ld=no ;;
|
||||||
|
esac])
|
||||||
|
with_gnu_ld=$acl_cv_prog_gnu_ld
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl From libtool-1.4. Sets the variable LD.
|
||||||
|
AC_DEFUN([AC_LIB_PROG_LD],
|
||||||
|
[AC_ARG_WITH(gnu-ld,
|
||||||
|
[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
|
||||||
|
test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
|
||||||
|
AC_REQUIRE([AC_PROG_CC])dnl
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
||||||
|
# Prepare PATH_SEPARATOR.
|
||||||
|
# The user is always right.
|
||||||
|
if test "${PATH_SEPARATOR+set}" != set; then
|
||||||
|
echo "#! /bin/sh" >conf$$.sh
|
||||||
|
echo "exit 0" >>conf$$.sh
|
||||||
|
chmod +x conf$$.sh
|
||||||
|
if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
|
||||||
|
PATH_SEPARATOR=';'
|
||||||
|
else
|
||||||
|
PATH_SEPARATOR=:
|
||||||
|
fi
|
||||||
|
rm -f conf$$.sh
|
||||||
|
fi
|
||||||
|
ac_prog=ld
|
||||||
|
if test "$GCC" = yes; then
|
||||||
|
# Check if gcc -print-prog-name=ld gives a path.
|
||||||
|
AC_MSG_CHECKING([for ld used by GCC])
|
||||||
|
case $host in
|
||||||
|
*-*-mingw*)
|
||||||
|
# gcc leaves a trailing carriage return which upsets mingw
|
||||||
|
ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
|
||||||
|
*)
|
||||||
|
ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
|
||||||
|
esac
|
||||||
|
case $ac_prog in
|
||||||
|
# Accept absolute paths.
|
||||||
|
[[\\/]* | [A-Za-z]:[\\/]*)]
|
||||||
|
[re_direlt='/[^/][^/]*/\.\./']
|
||||||
|
# Canonicalize the path of ld
|
||||||
|
ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
|
||||||
|
while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
|
||||||
|
ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
|
||||||
|
done
|
||||||
|
test -z "$LD" && LD="$ac_prog"
|
||||||
|
;;
|
||||||
|
"")
|
||||||
|
# If it fails, then pretend we aren't using GCC.
|
||||||
|
ac_prog=ld
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# If it is relative, then search for the first ld in PATH.
|
||||||
|
with_gnu_ld=unknown
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
elif test "$with_gnu_ld" = yes; then
|
||||||
|
AC_MSG_CHECKING([for GNU ld])
|
||||||
|
else
|
||||||
|
AC_MSG_CHECKING([for non-GNU ld])
|
||||||
|
fi
|
||||||
|
AC_CACHE_VAL(acl_cv_path_LD,
|
||||||
|
[if test -z "$LD"; then
|
||||||
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
|
||||||
|
for ac_dir in $PATH; do
|
||||||
|
test -z "$ac_dir" && ac_dir=.
|
||||||
|
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
|
||||||
|
acl_cv_path_LD="$ac_dir/$ac_prog"
|
||||||
|
# Check to see if the program is GNU ld. I'd rather use --version,
|
||||||
|
# but apparently some GNU ld's only accept -v.
|
||||||
|
# Break only if it was the GNU/non-GNU ld that we prefer.
|
||||||
|
case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
|
||||||
|
*GNU* | *'with BFD'*)
|
||||||
|
test "$with_gnu_ld" != no && break ;;
|
||||||
|
*)
|
||||||
|
test "$with_gnu_ld" != yes && break ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$ac_save_ifs"
|
||||||
|
else
|
||||||
|
acl_cv_path_LD="$LD" # Let the user override the test with a path.
|
||||||
|
fi])
|
||||||
|
LD="$acl_cv_path_LD"
|
||||||
|
if test -n "$LD"; then
|
||||||
|
AC_MSG_RESULT($LD)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi
|
||||||
|
test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
|
||||||
|
AC_LIB_PROG_LD_GNU
|
||||||
|
])
|
551
m4/lib-link.m4
Normal file
551
m4/lib-link.m4
Normal file
@ -0,0 +1,551 @@
|
|||||||
|
# lib-link.m4 serial 4 (gettext-0.12)
|
||||||
|
dnl Copyright (C) 2001-2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Bruno Haible.
|
||||||
|
|
||||||
|
dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
|
||||||
|
dnl the libraries corresponding to explicit and implicit dependencies.
|
||||||
|
dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
|
||||||
|
dnl augments the CPPFLAGS variable.
|
||||||
|
AC_DEFUN([AC_LIB_LINKFLAGS],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
|
||||||
|
AC_REQUIRE([AC_LIB_RPATH])
|
||||||
|
define([Name],[translit([$1],[./-], [___])])
|
||||||
|
define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
|
||||||
|
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
|
||||||
|
AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
|
||||||
|
AC_LIB_LINKFLAGS_BODY([$1], [$2])
|
||||||
|
ac_cv_lib[]Name[]_libs="$LIB[]NAME"
|
||||||
|
ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
|
||||||
|
ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
|
||||||
|
])
|
||||||
|
LIB[]NAME="$ac_cv_lib[]Name[]_libs"
|
||||||
|
LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
|
||||||
|
INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
|
||||||
|
AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
|
||||||
|
AC_SUBST([LIB]NAME)
|
||||||
|
AC_SUBST([LTLIB]NAME)
|
||||||
|
dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
|
||||||
|
dnl results of this search when this library appears as a dependency.
|
||||||
|
HAVE_LIB[]NAME=yes
|
||||||
|
undefine([Name])
|
||||||
|
undefine([NAME])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
|
||||||
|
dnl searches for libname and the libraries corresponding to explicit and
|
||||||
|
dnl implicit dependencies, together with the specified include files and
|
||||||
|
dnl the ability to compile and link the specified testcode. If found, it
|
||||||
|
dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
|
||||||
|
dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
|
||||||
|
dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
|
||||||
|
dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
|
||||||
|
AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
|
||||||
|
AC_REQUIRE([AC_LIB_RPATH])
|
||||||
|
define([Name],[translit([$1],[./-], [___])])
|
||||||
|
define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
|
||||||
|
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
|
||||||
|
|
||||||
|
dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
|
||||||
|
dnl accordingly.
|
||||||
|
AC_LIB_LINKFLAGS_BODY([$1], [$2])
|
||||||
|
|
||||||
|
dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
|
||||||
|
dnl because if the user has installed lib[]Name and not disabled its use
|
||||||
|
dnl via --without-lib[]Name-prefix, he wants to use it.
|
||||||
|
ac_save_CPPFLAGS="$CPPFLAGS"
|
||||||
|
AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
|
||||||
|
|
||||||
|
AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
|
||||||
|
ac_save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS $LIB[]NAME"
|
||||||
|
AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
|
||||||
|
LIBS="$ac_save_LIBS"
|
||||||
|
])
|
||||||
|
if test "$ac_cv_lib[]Name" = yes; then
|
||||||
|
HAVE_LIB[]NAME=yes
|
||||||
|
AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
|
||||||
|
AC_MSG_CHECKING([how to link with lib[]$1])
|
||||||
|
AC_MSG_RESULT([$LIB[]NAME])
|
||||||
|
else
|
||||||
|
HAVE_LIB[]NAME=no
|
||||||
|
dnl If $LIB[]NAME didn't lead to a usable library, we don't need
|
||||||
|
dnl $INC[]NAME either.
|
||||||
|
CPPFLAGS="$ac_save_CPPFLAGS"
|
||||||
|
LIB[]NAME=
|
||||||
|
LTLIB[]NAME=
|
||||||
|
fi
|
||||||
|
AC_SUBST([HAVE_LIB]NAME)
|
||||||
|
AC_SUBST([LIB]NAME)
|
||||||
|
AC_SUBST([LTLIB]NAME)
|
||||||
|
undefine([Name])
|
||||||
|
undefine([NAME])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Determine the platform dependent parameters needed to use rpath:
|
||||||
|
dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
|
||||||
|
dnl hardcode_direct, hardcode_minus_L.
|
||||||
|
AC_DEFUN([AC_LIB_RPATH],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
|
||||||
|
AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
|
||||||
|
AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
|
||||||
|
AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
|
||||||
|
CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
|
||||||
|
${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
|
||||||
|
. ./conftest.sh
|
||||||
|
rm -f ./conftest.sh
|
||||||
|
acl_cv_rpath=done
|
||||||
|
])
|
||||||
|
wl="$acl_cv_wl"
|
||||||
|
libext="$acl_cv_libext"
|
||||||
|
shlibext="$acl_cv_shlibext"
|
||||||
|
hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
|
||||||
|
hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
|
||||||
|
hardcode_direct="$acl_cv_hardcode_direct"
|
||||||
|
hardcode_minus_L="$acl_cv_hardcode_minus_L"
|
||||||
|
dnl Determine whether the user wants rpath handling at all.
|
||||||
|
AC_ARG_ENABLE(rpath,
|
||||||
|
[ --disable-rpath do not hardcode runtime library paths],
|
||||||
|
:, enable_rpath=yes)
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
|
||||||
|
dnl the libraries corresponding to explicit and implicit dependencies.
|
||||||
|
dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
|
||||||
|
AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
|
||||||
|
[
|
||||||
|
define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
|
||||||
|
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
|
||||||
|
dnl By default, look in $includedir and $libdir.
|
||||||
|
use_additional=yes
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([
|
||||||
|
eval additional_includedir=\"$includedir\"
|
||||||
|
eval additional_libdir=\"$libdir\"
|
||||||
|
])
|
||||||
|
AC_LIB_ARG_WITH([lib$1-prefix],
|
||||||
|
[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
|
||||||
|
--without-lib$1-prefix don't search for lib$1 in includedir and libdir],
|
||||||
|
[
|
||||||
|
if test "X$withval" = "Xno"; then
|
||||||
|
use_additional=no
|
||||||
|
else
|
||||||
|
if test "X$withval" = "X"; then
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([
|
||||||
|
eval additional_includedir=\"$includedir\"
|
||||||
|
eval additional_libdir=\"$libdir\"
|
||||||
|
])
|
||||||
|
else
|
||||||
|
additional_includedir="$withval/include"
|
||||||
|
additional_libdir="$withval/lib"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
dnl Search the library and its dependencies in $additional_libdir and
|
||||||
|
dnl $LDFLAGS. Using breadth-first-seach.
|
||||||
|
LIB[]NAME=
|
||||||
|
LTLIB[]NAME=
|
||||||
|
INC[]NAME=
|
||||||
|
rpathdirs=
|
||||||
|
ltrpathdirs=
|
||||||
|
names_already_handled=
|
||||||
|
names_next_round='$1 $2'
|
||||||
|
while test -n "$names_next_round"; do
|
||||||
|
names_this_round="$names_next_round"
|
||||||
|
names_next_round=
|
||||||
|
for name in $names_this_round; do
|
||||||
|
already_handled=
|
||||||
|
for n in $names_already_handled; do
|
||||||
|
if test "$n" = "$name"; then
|
||||||
|
already_handled=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$already_handled"; then
|
||||||
|
names_already_handled="$names_already_handled $name"
|
||||||
|
dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
|
||||||
|
dnl or AC_LIB_HAVE_LINKFLAGS call.
|
||||||
|
uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
|
||||||
|
eval value=\"\$HAVE_LIB$uppername\"
|
||||||
|
if test -n "$value"; then
|
||||||
|
if test "$value" = yes; then
|
||||||
|
eval value=\"\$LIB$uppername\"
|
||||||
|
test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
|
||||||
|
eval value=\"\$LTLIB$uppername\"
|
||||||
|
test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
|
||||||
|
else
|
||||||
|
dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
|
||||||
|
dnl that this library doesn't exist. So just drop it.
|
||||||
|
:
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
dnl Search the library lib$name in $additional_libdir and $LDFLAGS
|
||||||
|
dnl and the already constructed $LIBNAME/$LTLIBNAME.
|
||||||
|
found_dir=
|
||||||
|
found_la=
|
||||||
|
found_so=
|
||||||
|
found_a=
|
||||||
|
if test $use_additional = yes; then
|
||||||
|
if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
|
||||||
|
found_dir="$additional_libdir"
|
||||||
|
found_so="$additional_libdir/lib$name.$shlibext"
|
||||||
|
if test -f "$additional_libdir/lib$name.la"; then
|
||||||
|
found_la="$additional_libdir/lib$name.la"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if test -f "$additional_libdir/lib$name.$libext"; then
|
||||||
|
found_dir="$additional_libdir"
|
||||||
|
found_a="$additional_libdir/lib$name.$libext"
|
||||||
|
if test -f "$additional_libdir/lib$name.la"; then
|
||||||
|
found_la="$additional_libdir/lib$name.la"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test "X$found_dir" = "X"; then
|
||||||
|
for x in $LDFLAGS $LTLIB[]NAME; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
case "$x" in
|
||||||
|
-L*)
|
||||||
|
dir=`echo "X$x" | sed -e 's/^X-L//'`
|
||||||
|
if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
|
||||||
|
found_dir="$dir"
|
||||||
|
found_so="$dir/lib$name.$shlibext"
|
||||||
|
if test -f "$dir/lib$name.la"; then
|
||||||
|
found_la="$dir/lib$name.la"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if test -f "$dir/lib$name.$libext"; then
|
||||||
|
found_dir="$dir"
|
||||||
|
found_a="$dir/lib$name.$libext"
|
||||||
|
if test -f "$dir/lib$name.la"; then
|
||||||
|
found_la="$dir/lib$name.la"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if test "X$found_dir" != "X"; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
if test "X$found_dir" != "X"; then
|
||||||
|
dnl Found the library.
|
||||||
|
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
|
||||||
|
if test "X$found_so" != "X"; then
|
||||||
|
dnl Linking with a shared library. We attempt to hardcode its
|
||||||
|
dnl directory into the executable's runpath, unless it's the
|
||||||
|
dnl standard /usr/lib.
|
||||||
|
if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
|
||||||
|
dnl No hardcoding is needed.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||||
|
else
|
||||||
|
dnl Use an explicit option to hardcode DIR into the resulting
|
||||||
|
dnl binary.
|
||||||
|
dnl Potentially add DIR to ltrpathdirs.
|
||||||
|
dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
|
||||||
|
haveit=
|
||||||
|
for x in $ltrpathdirs; do
|
||||||
|
if test "X$x" = "X$found_dir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
ltrpathdirs="$ltrpathdirs $found_dir"
|
||||||
|
fi
|
||||||
|
dnl The hardcoding into $LIBNAME is system dependent.
|
||||||
|
if test "$hardcode_direct" = yes; then
|
||||||
|
dnl Using DIR/libNAME.so during linking hardcodes DIR into the
|
||||||
|
dnl resulting binary.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||||
|
else
|
||||||
|
if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
|
||||||
|
dnl Use an explicit option to hardcode DIR into the resulting
|
||||||
|
dnl binary.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||||
|
dnl Potentially add DIR to rpathdirs.
|
||||||
|
dnl The rpathdirs will be appended to $LIBNAME at the end.
|
||||||
|
haveit=
|
||||||
|
for x in $rpathdirs; do
|
||||||
|
if test "X$x" = "X$found_dir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
rpathdirs="$rpathdirs $found_dir"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
dnl Rely on "-L$found_dir".
|
||||||
|
dnl But don't add it if it's already contained in the LDFLAGS
|
||||||
|
dnl or the already constructed $LIBNAME
|
||||||
|
haveit=
|
||||||
|
for x in $LDFLAGS $LIB[]NAME; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
if test "X$x" = "X-L$found_dir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
|
||||||
|
fi
|
||||||
|
if test "$hardcode_minus_L" != no; then
|
||||||
|
dnl FIXME: Not sure whether we should use
|
||||||
|
dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
|
||||||
|
dnl here.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||||
|
else
|
||||||
|
dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
|
||||||
|
dnl here, because this doesn't fit in flags passed to the
|
||||||
|
dnl compiler. So give up. No hardcoding. This affects only
|
||||||
|
dnl very old systems.
|
||||||
|
dnl FIXME: Not sure whether we should use
|
||||||
|
dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
|
||||||
|
dnl here.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if test "X$found_a" != "X"; then
|
||||||
|
dnl Linking with a static library.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
|
||||||
|
else
|
||||||
|
dnl We shouldn't come here, but anyway it's good to have a
|
||||||
|
dnl fallback.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
dnl Assume the include files are nearby.
|
||||||
|
additional_includedir=
|
||||||
|
case "$found_dir" in
|
||||||
|
*/lib | */lib/)
|
||||||
|
basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
|
||||||
|
additional_includedir="$basedir/include"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if test "X$additional_includedir" != "X"; then
|
||||||
|
dnl Potentially add $additional_includedir to $INCNAME.
|
||||||
|
dnl But don't add it
|
||||||
|
dnl 1. if it's the standard /usr/include,
|
||||||
|
dnl 2. if it's /usr/local/include and we are using GCC on Linux,
|
||||||
|
dnl 3. if it's already present in $CPPFLAGS or the already
|
||||||
|
dnl constructed $INCNAME,
|
||||||
|
dnl 4. if it doesn't exist as a directory.
|
||||||
|
if test "X$additional_includedir" != "X/usr/include"; then
|
||||||
|
haveit=
|
||||||
|
if test "X$additional_includedir" = "X/usr/local/include"; then
|
||||||
|
if test -n "$GCC"; then
|
||||||
|
case $host_os in
|
||||||
|
linux*) haveit=yes;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
for x in $CPPFLAGS $INC[]NAME; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
if test "X$x" = "X-I$additional_includedir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
if test -d "$additional_includedir"; then
|
||||||
|
dnl Really add $additional_includedir to $INCNAME.
|
||||||
|
INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
dnl Look for dependencies.
|
||||||
|
if test -n "$found_la"; then
|
||||||
|
dnl Read the .la file. It defines the variables
|
||||||
|
dnl dlname, library_names, old_library, dependency_libs, current,
|
||||||
|
dnl age, revision, installed, dlopen, dlpreopen, libdir.
|
||||||
|
save_libdir="$libdir"
|
||||||
|
case "$found_la" in
|
||||||
|
*/* | *\\*) . "$found_la" ;;
|
||||||
|
*) . "./$found_la" ;;
|
||||||
|
esac
|
||||||
|
libdir="$save_libdir"
|
||||||
|
dnl We use only dependency_libs.
|
||||||
|
for dep in $dependency_libs; do
|
||||||
|
case "$dep" in
|
||||||
|
-L*)
|
||||||
|
additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
|
||||||
|
dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
|
||||||
|
dnl But don't add it
|
||||||
|
dnl 1. if it's the standard /usr/lib,
|
||||||
|
dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
|
||||||
|
dnl 3. if it's already present in $LDFLAGS or the already
|
||||||
|
dnl constructed $LIBNAME,
|
||||||
|
dnl 4. if it doesn't exist as a directory.
|
||||||
|
if test "X$additional_libdir" != "X/usr/lib"; then
|
||||||
|
haveit=
|
||||||
|
if test "X$additional_libdir" = "X/usr/local/lib"; then
|
||||||
|
if test -n "$GCC"; then
|
||||||
|
case $host_os in
|
||||||
|
linux*) haveit=yes;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
haveit=
|
||||||
|
for x in $LDFLAGS $LIB[]NAME; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
if test "X$x" = "X-L$additional_libdir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
if test -d "$additional_libdir"; then
|
||||||
|
dnl Really add $additional_libdir to $LIBNAME.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
haveit=
|
||||||
|
for x in $LDFLAGS $LTLIB[]NAME; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
if test "X$x" = "X-L$additional_libdir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
if test -d "$additional_libdir"; then
|
||||||
|
dnl Really add $additional_libdir to $LTLIBNAME.
|
||||||
|
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
-R*)
|
||||||
|
dir=`echo "X$dep" | sed -e 's/^X-R//'`
|
||||||
|
if test "$enable_rpath" != no; then
|
||||||
|
dnl Potentially add DIR to rpathdirs.
|
||||||
|
dnl The rpathdirs will be appended to $LIBNAME at the end.
|
||||||
|
haveit=
|
||||||
|
for x in $rpathdirs; do
|
||||||
|
if test "X$x" = "X$dir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
rpathdirs="$rpathdirs $dir"
|
||||||
|
fi
|
||||||
|
dnl Potentially add DIR to ltrpathdirs.
|
||||||
|
dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
|
||||||
|
haveit=
|
||||||
|
for x in $ltrpathdirs; do
|
||||||
|
if test "X$x" = "X$dir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
ltrpathdirs="$ltrpathdirs $dir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
-l*)
|
||||||
|
dnl Handle this in the next round.
|
||||||
|
names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
|
||||||
|
;;
|
||||||
|
*.la)
|
||||||
|
dnl Handle this in the next round. Throw away the .la's
|
||||||
|
dnl directory; it is already contained in a preceding -L
|
||||||
|
dnl option.
|
||||||
|
names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
dnl Most likely an immediate library name.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
|
||||||
|
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
dnl Didn't find the library; assume it is in the system directories
|
||||||
|
dnl known to the linker and runtime loader. (All the system
|
||||||
|
dnl directories known to the linker should also be known to the
|
||||||
|
dnl runtime loader, otherwise the system is severely misconfigured.)
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
|
||||||
|
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
if test "X$rpathdirs" != "X"; then
|
||||||
|
if test -n "$hardcode_libdir_separator"; then
|
||||||
|
dnl Weird platform: only the last -rpath option counts, the user must
|
||||||
|
dnl pass all path elements in one option. We can arrange that for a
|
||||||
|
dnl single library, but not when more than one $LIBNAMEs are used.
|
||||||
|
alldirs=
|
||||||
|
for found_dir in $rpathdirs; do
|
||||||
|
alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
|
||||||
|
done
|
||||||
|
dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
|
||||||
|
acl_save_libdir="$libdir"
|
||||||
|
libdir="$alldirs"
|
||||||
|
eval flag=\"$hardcode_libdir_flag_spec\"
|
||||||
|
libdir="$acl_save_libdir"
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
|
||||||
|
else
|
||||||
|
dnl The -rpath options are cumulative.
|
||||||
|
for found_dir in $rpathdirs; do
|
||||||
|
acl_save_libdir="$libdir"
|
||||||
|
libdir="$found_dir"
|
||||||
|
eval flag=\"$hardcode_libdir_flag_spec\"
|
||||||
|
libdir="$acl_save_libdir"
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test "X$ltrpathdirs" != "X"; then
|
||||||
|
dnl When using libtool, the option that works for both libraries and
|
||||||
|
dnl executables is -R. The -R options are cumulative.
|
||||||
|
for found_dir in $ltrpathdirs; do
|
||||||
|
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
|
||||||
|
dnl unless already present in VAR.
|
||||||
|
dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
|
||||||
|
dnl contains two or three consecutive elements that belong together.
|
||||||
|
AC_DEFUN([AC_LIB_APPENDTOVAR],
|
||||||
|
[
|
||||||
|
for element in [$2]; do
|
||||||
|
haveit=
|
||||||
|
for x in $[$1]; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
if test "X$x" = "X$element"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
[$1]="${[$1]}${[$1]:+ }$element"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
])
|
155
m4/lib-prefix.m4
Normal file
155
m4/lib-prefix.m4
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
# lib-prefix.m4 serial 3 (gettext-0.13)
|
||||||
|
dnl Copyright (C) 2001-2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Bruno Haible.
|
||||||
|
|
||||||
|
dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
|
||||||
|
dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
|
||||||
|
dnl require excessive bracketing.
|
||||||
|
ifdef([AC_HELP_STRING],
|
||||||
|
[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
|
||||||
|
[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
|
||||||
|
|
||||||
|
dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
|
||||||
|
dnl to access previously installed libraries. The basic assumption is that
|
||||||
|
dnl a user will want packages to use other packages he previously installed
|
||||||
|
dnl with the same --prefix option.
|
||||||
|
dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
|
||||||
|
dnl libraries, but is otherwise very convenient.
|
||||||
|
AC_DEFUN([AC_LIB_PREFIX],
|
||||||
|
[
|
||||||
|
AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
|
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
|
||||||
|
dnl By default, look in $includedir and $libdir.
|
||||||
|
use_additional=yes
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([
|
||||||
|
eval additional_includedir=\"$includedir\"
|
||||||
|
eval additional_libdir=\"$libdir\"
|
||||||
|
])
|
||||||
|
AC_LIB_ARG_WITH([lib-prefix],
|
||||||
|
[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
|
||||||
|
--without-lib-prefix don't search for libraries in includedir and libdir],
|
||||||
|
[
|
||||||
|
if test "X$withval" = "Xno"; then
|
||||||
|
use_additional=no
|
||||||
|
else
|
||||||
|
if test "X$withval" = "X"; then
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([
|
||||||
|
eval additional_includedir=\"$includedir\"
|
||||||
|
eval additional_libdir=\"$libdir\"
|
||||||
|
])
|
||||||
|
else
|
||||||
|
additional_includedir="$withval/include"
|
||||||
|
additional_libdir="$withval/lib"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
if test $use_additional = yes; then
|
||||||
|
dnl Potentially add $additional_includedir to $CPPFLAGS.
|
||||||
|
dnl But don't add it
|
||||||
|
dnl 1. if it's the standard /usr/include,
|
||||||
|
dnl 2. if it's already present in $CPPFLAGS,
|
||||||
|
dnl 3. if it's /usr/local/include and we are using GCC on Linux,
|
||||||
|
dnl 4. if it doesn't exist as a directory.
|
||||||
|
if test "X$additional_includedir" != "X/usr/include"; then
|
||||||
|
haveit=
|
||||||
|
for x in $CPPFLAGS; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
if test "X$x" = "X-I$additional_includedir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
if test "X$additional_includedir" = "X/usr/local/include"; then
|
||||||
|
if test -n "$GCC"; then
|
||||||
|
case $host_os in
|
||||||
|
linux*) haveit=yes;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
if test -d "$additional_includedir"; then
|
||||||
|
dnl Really add $additional_includedir to $CPPFLAGS.
|
||||||
|
CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
dnl Potentially add $additional_libdir to $LDFLAGS.
|
||||||
|
dnl But don't add it
|
||||||
|
dnl 1. if it's the standard /usr/lib,
|
||||||
|
dnl 2. if it's already present in $LDFLAGS,
|
||||||
|
dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
|
||||||
|
dnl 4. if it doesn't exist as a directory.
|
||||||
|
if test "X$additional_libdir" != "X/usr/lib"; then
|
||||||
|
haveit=
|
||||||
|
for x in $LDFLAGS; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
if test "X$x" = "X-L$additional_libdir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
if test "X$additional_libdir" = "X/usr/local/lib"; then
|
||||||
|
if test -n "$GCC"; then
|
||||||
|
case $host_os in
|
||||||
|
linux*) haveit=yes;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
if test -d "$additional_libdir"; then
|
||||||
|
dnl Really add $additional_libdir to $LDFLAGS.
|
||||||
|
LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
|
||||||
|
dnl acl_final_exec_prefix, containing the values to which $prefix and
|
||||||
|
dnl $exec_prefix will expand at the end of the configure script.
|
||||||
|
AC_DEFUN([AC_LIB_PREPARE_PREFIX],
|
||||||
|
[
|
||||||
|
dnl Unfortunately, prefix and exec_prefix get only finally determined
|
||||||
|
dnl at the end of configure.
|
||||||
|
if test "X$prefix" = "XNONE"; then
|
||||||
|
acl_final_prefix="$ac_default_prefix"
|
||||||
|
else
|
||||||
|
acl_final_prefix="$prefix"
|
||||||
|
fi
|
||||||
|
if test "X$exec_prefix" = "XNONE"; then
|
||||||
|
acl_final_exec_prefix='${prefix}'
|
||||||
|
else
|
||||||
|
acl_final_exec_prefix="$exec_prefix"
|
||||||
|
fi
|
||||||
|
acl_save_prefix="$prefix"
|
||||||
|
prefix="$acl_final_prefix"
|
||||||
|
eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
|
||||||
|
prefix="$acl_save_prefix"
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
|
||||||
|
dnl variables prefix and exec_prefix bound to the values they will have
|
||||||
|
dnl at the end of the configure script.
|
||||||
|
AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
|
||||||
|
[
|
||||||
|
acl_save_prefix="$prefix"
|
||||||
|
prefix="$acl_final_prefix"
|
||||||
|
acl_save_exec_prefix="$exec_prefix"
|
||||||
|
exec_prefix="$acl_final_exec_prefix"
|
||||||
|
$1
|
||||||
|
exec_prefix="$acl_save_exec_prefix"
|
||||||
|
prefix="$acl_save_prefix"
|
||||||
|
])
|
426
m4/po.m4
Normal file
426
m4/po.m4
Normal file
@ -0,0 +1,426 @@
|
|||||||
|
# po.m4 serial 3 (gettext-0.14)
|
||||||
|
dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
dnl
|
||||||
|
dnl This file can can be used in projects which are not available under
|
||||||
|
dnl the GNU General Public License or the GNU Library General Public
|
||||||
|
dnl License but which still want to provide support for the GNU gettext
|
||||||
|
dnl functionality.
|
||||||
|
dnl Please note that the actual code of the GNU gettext library is covered
|
||||||
|
dnl by the GNU Library General Public License, and the rest of the GNU
|
||||||
|
dnl gettext package package is covered by the GNU General Public License.
|
||||||
|
dnl They are *not* in the public domain.
|
||||||
|
|
||||||
|
dnl Authors:
|
||||||
|
dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
|
||||||
|
dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
|
||||||
|
|
||||||
|
dnl Checks for all prerequisites of the po subdirectory.
|
||||||
|
AC_DEFUN([AM_PO_SUBDIRS],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_INSTALL])dnl
|
||||||
|
AC_REQUIRE([AM_MKINSTALLDIRS])dnl
|
||||||
|
AC_REQUIRE([AM_NLS])dnl
|
||||||
|
|
||||||
|
dnl Perform the following tests also if --disable-nls has been given,
|
||||||
|
dnl because they are needed for "make dist" to work.
|
||||||
|
|
||||||
|
dnl Search for GNU msgfmt in the PATH.
|
||||||
|
dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
|
||||||
|
dnl The second test excludes FreeBSD msgfmt.
|
||||||
|
AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
|
||||||
|
[$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
|
||||||
|
(if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
|
||||||
|
:)
|
||||||
|
AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
|
||||||
|
|
||||||
|
dnl Search for GNU xgettext 0.12 or newer in the PATH.
|
||||||
|
dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
|
||||||
|
dnl The second test excludes FreeBSD xgettext.
|
||||||
|
AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
|
||||||
|
[$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
|
||||||
|
(if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
|
||||||
|
:)
|
||||||
|
dnl Remove leftover from FreeBSD xgettext call.
|
||||||
|
rm -f messages.po
|
||||||
|
|
||||||
|
dnl Search for GNU msgmerge 0.11 or newer in the PATH.
|
||||||
|
AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
|
||||||
|
[$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :)
|
||||||
|
|
||||||
|
dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
|
||||||
|
dnl Test whether we really found GNU msgfmt.
|
||||||
|
if test "$GMSGFMT" != ":"; then
|
||||||
|
dnl If it is no GNU msgfmt we define it as : so that the
|
||||||
|
dnl Makefiles still can work.
|
||||||
|
if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
|
||||||
|
(if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
|
||||||
|
: ;
|
||||||
|
else
|
||||||
|
GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
|
||||||
|
AC_MSG_RESULT(
|
||||||
|
[found $GMSGFMT program is not GNU msgfmt; ignore it])
|
||||||
|
GMSGFMT=":"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
|
||||||
|
dnl Test whether we really found GNU xgettext.
|
||||||
|
if test "$XGETTEXT" != ":"; then
|
||||||
|
dnl If it is no GNU xgettext we define it as : so that the
|
||||||
|
dnl Makefiles still can work.
|
||||||
|
if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
|
||||||
|
(if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
|
||||||
|
: ;
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(
|
||||||
|
[found xgettext program is not GNU xgettext; ignore it])
|
||||||
|
XGETTEXT=":"
|
||||||
|
fi
|
||||||
|
dnl Remove leftover from FreeBSD xgettext call.
|
||||||
|
rm -f messages.po
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_OUTPUT_COMMANDS([
|
||||||
|
for ac_file in $CONFIG_FILES; do
|
||||||
|
# Support "outfile[:infile[:infile...]]"
|
||||||
|
case "$ac_file" in
|
||||||
|
*:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
|
||||||
|
esac
|
||||||
|
# PO directories have a Makefile.in generated from Makefile.in.in.
|
||||||
|
case "$ac_file" in */Makefile.in)
|
||||||
|
# Adjust a relative srcdir.
|
||||||
|
ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
|
||||||
|
ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
|
||||||
|
ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
|
||||||
|
# In autoconf-2.13 it is called $ac_given_srcdir.
|
||||||
|
# In autoconf-2.50 it is called $srcdir.
|
||||||
|
test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
|
||||||
|
case "$ac_given_srcdir" in
|
||||||
|
.) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
|
||||||
|
/*) top_srcdir="$ac_given_srcdir" ;;
|
||||||
|
*) top_srcdir="$ac_dots$ac_given_srcdir" ;;
|
||||||
|
esac
|
||||||
|
if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
|
||||||
|
rm -f "$ac_dir/POTFILES"
|
||||||
|
test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
|
||||||
|
cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
|
||||||
|
POMAKEFILEDEPS="POTFILES.in"
|
||||||
|
# ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
|
||||||
|
# on $ac_dir but don't depend on user-specified configuration
|
||||||
|
# parameters.
|
||||||
|
if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
|
||||||
|
# The LINGUAS file contains the set of available languages.
|
||||||
|
if test -n "$OBSOLETE_ALL_LINGUAS"; then
|
||||||
|
test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
|
||||||
|
fi
|
||||||
|
ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
|
||||||
|
# Hide the ALL_LINGUAS assigment from automake.
|
||||||
|
eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
|
||||||
|
POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
|
||||||
|
else
|
||||||
|
# The set of available languages was given in configure.in.
|
||||||
|
eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
|
||||||
|
fi
|
||||||
|
# Compute POFILES
|
||||||
|
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
|
||||||
|
# Compute UPDATEPOFILES
|
||||||
|
# as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
|
||||||
|
# Compute DUMMYPOFILES
|
||||||
|
# as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
|
||||||
|
# Compute GMOFILES
|
||||||
|
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
|
||||||
|
case "$ac_given_srcdir" in
|
||||||
|
.) srcdirpre= ;;
|
||||||
|
*) srcdirpre='$(srcdir)/' ;;
|
||||||
|
esac
|
||||||
|
POFILES=
|
||||||
|
UPDATEPOFILES=
|
||||||
|
DUMMYPOFILES=
|
||||||
|
GMOFILES=
|
||||||
|
for lang in $ALL_LINGUAS; do
|
||||||
|
POFILES="$POFILES $srcdirpre$lang.po"
|
||||||
|
UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
|
||||||
|
DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
|
||||||
|
GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
|
||||||
|
done
|
||||||
|
# CATALOGS depends on both $ac_dir and the user's LINGUAS
|
||||||
|
# environment variable.
|
||||||
|
INST_LINGUAS=
|
||||||
|
if test -n "$ALL_LINGUAS"; then
|
||||||
|
for presentlang in $ALL_LINGUAS; do
|
||||||
|
useit=no
|
||||||
|
if test "%UNSET%" != "$LINGUAS"; then
|
||||||
|
desiredlanguages="$LINGUAS"
|
||||||
|
else
|
||||||
|
desiredlanguages="$ALL_LINGUAS"
|
||||||
|
fi
|
||||||
|
for desiredlang in $desiredlanguages; do
|
||||||
|
# Use the presentlang catalog if desiredlang is
|
||||||
|
# a. equal to presentlang, or
|
||||||
|
# b. a variant of presentlang (because in this case,
|
||||||
|
# presentlang can be used as a fallback for messages
|
||||||
|
# which are not translated in the desiredlang catalog).
|
||||||
|
case "$desiredlang" in
|
||||||
|
"$presentlang"*) useit=yes;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
if test $useit = yes; then
|
||||||
|
INST_LINGUAS="$INST_LINGUAS $presentlang"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
CATALOGS=
|
||||||
|
if test -n "$INST_LINGUAS"; then
|
||||||
|
for lang in $INST_LINGUAS; do
|
||||||
|
CATALOGS="$CATALOGS $lang.gmo"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
|
||||||
|
sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
|
||||||
|
for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
|
||||||
|
if test -f "$f"; then
|
||||||
|
case "$f" in
|
||||||
|
*.orig | *.bak | *~) ;;
|
||||||
|
*) cat "$f" >> "$ac_dir/Makefile" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done],
|
||||||
|
[# Capture the value of obsolete ALL_LINGUAS because we need it to compute
|
||||||
|
# POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
|
||||||
|
# from automake.
|
||||||
|
eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
|
||||||
|
# Capture the value of LINGUAS because we need it to compute CATALOGS.
|
||||||
|
LINGUAS="${LINGUAS-%UNSET%}"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Postprocesses a Makefile in a directory containing PO files.
|
||||||
|
AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
|
||||||
|
[
|
||||||
|
# When this code is run, in config.status, two variables have already been
|
||||||
|
# set:
|
||||||
|
# - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in,
|
||||||
|
# - LINGUAS is the value of the environment variable LINGUAS at configure
|
||||||
|
# time.
|
||||||
|
|
||||||
|
changequote(,)dnl
|
||||||
|
# Adjust a relative srcdir.
|
||||||
|
ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
|
||||||
|
ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
|
||||||
|
ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
|
||||||
|
# In autoconf-2.13 it is called $ac_given_srcdir.
|
||||||
|
# In autoconf-2.50 it is called $srcdir.
|
||||||
|
test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
|
||||||
|
case "$ac_given_srcdir" in
|
||||||
|
.) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
|
||||||
|
/*) top_srcdir="$ac_given_srcdir" ;;
|
||||||
|
*) top_srcdir="$ac_dots$ac_given_srcdir" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Find a way to echo strings without interpreting backslash.
|
||||||
|
if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
|
||||||
|
gt_echo='echo'
|
||||||
|
else
|
||||||
|
if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
|
||||||
|
gt_echo='printf %s\n'
|
||||||
|
else
|
||||||
|
echo_func () {
|
||||||
|
cat <<EOT
|
||||||
|
$*
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
gt_echo='echo_func'
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# A sed script that extracts the value of VARIABLE from a Makefile.
|
||||||
|
sed_x_variable='
|
||||||
|
# Test if the hold space is empty.
|
||||||
|
x
|
||||||
|
s/P/P/
|
||||||
|
x
|
||||||
|
ta
|
||||||
|
# Yes it was empty. Look if we have the expected variable definition.
|
||||||
|
/^[ ]*VARIABLE[ ]*=/{
|
||||||
|
# Seen the first line of the variable definition.
|
||||||
|
s/^[ ]*VARIABLE[ ]*=//
|
||||||
|
ba
|
||||||
|
}
|
||||||
|
bd
|
||||||
|
:a
|
||||||
|
# Here we are processing a line from the variable definition.
|
||||||
|
# Remove comment, more precisely replace it with a space.
|
||||||
|
s/#.*$/ /
|
||||||
|
# See if the line ends in a backslash.
|
||||||
|
tb
|
||||||
|
:b
|
||||||
|
s/\\$//
|
||||||
|
# Print the line, without the trailing backslash.
|
||||||
|
p
|
||||||
|
tc
|
||||||
|
# There was no trailing backslash. The end of the variable definition is
|
||||||
|
# reached. Clear the hold space.
|
||||||
|
s/^.*$//
|
||||||
|
x
|
||||||
|
bd
|
||||||
|
:c
|
||||||
|
# A trailing backslash means that the variable definition continues in the
|
||||||
|
# next line. Put a nonempty string into the hold space to indicate this.
|
||||||
|
s/^.*$/P/
|
||||||
|
x
|
||||||
|
:d
|
||||||
|
'
|
||||||
|
changequote([,])dnl
|
||||||
|
|
||||||
|
# Set POTFILES to the value of the Makefile variable POTFILES.
|
||||||
|
sed_x_POTFILES="`$gt_echo \"$sed_x_variable\" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`"
|
||||||
|
POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
|
||||||
|
# Compute POTFILES_DEPS as
|
||||||
|
# $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
|
||||||
|
POTFILES_DEPS=
|
||||||
|
for file in $POTFILES; do
|
||||||
|
POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
|
||||||
|
done
|
||||||
|
POMAKEFILEDEPS=""
|
||||||
|
|
||||||
|
if test -n "$OBSOLETE_ALL_LINGUAS"; then
|
||||||
|
test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
|
||||||
|
fi
|
||||||
|
if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
|
||||||
|
# The LINGUAS file contains the set of available languages.
|
||||||
|
ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
|
||||||
|
POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
|
||||||
|
else
|
||||||
|
# Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
|
||||||
|
sed_x_LINGUAS="`$gt_echo \"$sed_x_variable\" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`"
|
||||||
|
ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
|
||||||
|
fi
|
||||||
|
# Hide the ALL_LINGUAS assigment from automake.
|
||||||
|
eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
|
||||||
|
# Compute POFILES
|
||||||
|
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
|
||||||
|
# Compute UPDATEPOFILES
|
||||||
|
# as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
|
||||||
|
# Compute DUMMYPOFILES
|
||||||
|
# as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
|
||||||
|
# Compute GMOFILES
|
||||||
|
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
|
||||||
|
# Compute PROPERTIESFILES
|
||||||
|
# as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties)
|
||||||
|
# Compute CLASSFILES
|
||||||
|
# as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class)
|
||||||
|
# Compute QMFILES
|
||||||
|
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
|
||||||
|
# Compute MSGFILES
|
||||||
|
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
|
||||||
|
# Compute RESOURCESDLLFILES
|
||||||
|
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
|
||||||
|
case "$ac_given_srcdir" in
|
||||||
|
.) srcdirpre= ;;
|
||||||
|
*) srcdirpre='$(srcdir)/' ;;
|
||||||
|
esac
|
||||||
|
POFILES=
|
||||||
|
UPDATEPOFILES=
|
||||||
|
DUMMYPOFILES=
|
||||||
|
GMOFILES=
|
||||||
|
PROPERTIESFILES=
|
||||||
|
CLASSFILES=
|
||||||
|
QMFILES=
|
||||||
|
MSGFILES=
|
||||||
|
RESOURCESDLLFILES=
|
||||||
|
for lang in $ALL_LINGUAS; do
|
||||||
|
POFILES="$POFILES $srcdirpre$lang.po"
|
||||||
|
UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
|
||||||
|
DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
|
||||||
|
GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
|
||||||
|
PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties"
|
||||||
|
CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class"
|
||||||
|
QMFILES="$QMFILES $srcdirpre$lang.qm"
|
||||||
|
frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
|
||||||
|
MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
|
||||||
|
frobbedlang=`echo $lang | sed -e 's/_/-/g'`
|
||||||
|
RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
|
||||||
|
done
|
||||||
|
# CATALOGS depends on both $ac_dir and the user's LINGUAS
|
||||||
|
# environment variable.
|
||||||
|
INST_LINGUAS=
|
||||||
|
if test -n "$ALL_LINGUAS"; then
|
||||||
|
for presentlang in $ALL_LINGUAS; do
|
||||||
|
useit=no
|
||||||
|
if test "%UNSET%" != "$LINGUAS"; then
|
||||||
|
desiredlanguages="$LINGUAS"
|
||||||
|
else
|
||||||
|
desiredlanguages="$ALL_LINGUAS"
|
||||||
|
fi
|
||||||
|
for desiredlang in $desiredlanguages; do
|
||||||
|
# Use the presentlang catalog if desiredlang is
|
||||||
|
# a. equal to presentlang, or
|
||||||
|
# b. a variant of presentlang (because in this case,
|
||||||
|
# presentlang can be used as a fallback for messages
|
||||||
|
# which are not translated in the desiredlang catalog).
|
||||||
|
case "$desiredlang" in
|
||||||
|
"$presentlang"*) useit=yes;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
if test $useit = yes; then
|
||||||
|
INST_LINGUAS="$INST_LINGUAS $presentlang"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
CATALOGS=
|
||||||
|
JAVACATALOGS=
|
||||||
|
QTCATALOGS=
|
||||||
|
TCLCATALOGS=
|
||||||
|
CSHARPCATALOGS=
|
||||||
|
if test -n "$INST_LINGUAS"; then
|
||||||
|
for lang in $INST_LINGUAS; do
|
||||||
|
CATALOGS="$CATALOGS $lang.gmo"
|
||||||
|
JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
|
||||||
|
QTCATALOGS="$QTCATALOGS $lang.qm"
|
||||||
|
frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
|
||||||
|
TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
|
||||||
|
frobbedlang=`echo $lang | sed -e 's/_/-/g'`
|
||||||
|
CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
|
||||||
|
if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
|
||||||
|
# Add dependencies that cannot be formulated as a simple suffix rule.
|
||||||
|
for lang in $ALL_LINGUAS; do
|
||||||
|
frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
|
||||||
|
cat >> "$ac_file.tmp" <<EOF
|
||||||
|
$frobbedlang.msg: $lang.po
|
||||||
|
@echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
|
||||||
|
\$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
|
||||||
|
EOF
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then
|
||||||
|
# Add dependencies that cannot be formulated as a simple suffix rule.
|
||||||
|
for lang in $ALL_LINGUAS; do
|
||||||
|
frobbedlang=`echo $lang | sed -e 's/_/-/g'`
|
||||||
|
cat >> "$ac_file.tmp" <<EOF
|
||||||
|
$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
|
||||||
|
@echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
|
||||||
|
\$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
|
||||||
|
EOF
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
if test -n "$POMAKEFILEDEPS"; then
|
||||||
|
cat >> "$ac_file.tmp" <<EOF
|
||||||
|
Makefile: $POMAKEFILEDEPS
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
mv "$ac_file.tmp" "$ac_file"
|
||||||
|
])
|
28
m4/stdint_h.m4
Normal file
28
m4/stdint_h.m4
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# stdint_h.m4 serial 3 (gettext-0.12)
|
||||||
|
dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Paul Eggert.
|
||||||
|
|
||||||
|
# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
|
||||||
|
# doesn't clash with <sys/types.h>, and declares uintmax_t.
|
||||||
|
|
||||||
|
AC_DEFUN([jm_AC_HEADER_STDINT_H],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h,
|
||||||
|
[AC_TRY_COMPILE(
|
||||||
|
[#include <sys/types.h>
|
||||||
|
#include <stdint.h>],
|
||||||
|
[uintmax_t i = (uintmax_t) -1;],
|
||||||
|
jm_ac_cv_header_stdint_h=yes,
|
||||||
|
jm_ac_cv_header_stdint_h=no)])
|
||||||
|
if test $jm_ac_cv_header_stdint_h = yes; then
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1,
|
||||||
|
[Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
|
||||||
|
and declares uintmax_t. ])
|
||||||
|
fi
|
||||||
|
])
|
32
m4/uintmax_t.m4
Normal file
32
m4/uintmax_t.m4
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# uintmax_t.m4 serial 7 (gettext-0.12)
|
||||||
|
dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Paul Eggert.
|
||||||
|
|
||||||
|
AC_PREREQ(2.13)
|
||||||
|
|
||||||
|
# Define uintmax_t to 'unsigned long' or 'unsigned long long'
|
||||||
|
# if it is not already defined in <stdint.h> or <inttypes.h>.
|
||||||
|
|
||||||
|
AC_DEFUN([jm_AC_TYPE_UINTMAX_T],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([jm_AC_HEADER_INTTYPES_H])
|
||||||
|
AC_REQUIRE([jm_AC_HEADER_STDINT_H])
|
||||||
|
if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then
|
||||||
|
AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG])
|
||||||
|
test $ac_cv_type_unsigned_long_long = yes \
|
||||||
|
&& ac_type='unsigned long long' \
|
||||||
|
|| ac_type='unsigned long'
|
||||||
|
AC_DEFINE_UNQUOTED(uintmax_t, $ac_type,
|
||||||
|
[Define to unsigned long or unsigned long long
|
||||||
|
if <stdint.h> and <inttypes.h> don't define.])
|
||||||
|
else
|
||||||
|
AC_DEFINE(HAVE_UINTMAX_T, 1,
|
||||||
|
[Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.])
|
||||||
|
fi
|
||||||
|
])
|
25
m4/ulonglong.m4
Normal file
25
m4/ulonglong.m4
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# ulonglong.m4 serial 3
|
||||||
|
dnl Copyright (C) 1999-2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Paul Eggert.
|
||||||
|
|
||||||
|
# Define HAVE_UNSIGNED_LONG_LONG if 'unsigned long long' works.
|
||||||
|
|
||||||
|
AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long,
|
||||||
|
[AC_TRY_LINK([unsigned long long ull = 1ULL; int i = 63;],
|
||||||
|
[unsigned long long ullmax = (unsigned long long) -1;
|
||||||
|
return ull << i | ull >> i | ullmax / ull | ullmax % ull;],
|
||||||
|
ac_cv_type_unsigned_long_long=yes,
|
||||||
|
ac_cv_type_unsigned_long_long=no)])
|
||||||
|
if test $ac_cv_type_unsigned_long_long = yes; then
|
||||||
|
AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1,
|
||||||
|
[Define if you have the 'unsigned long long' type.])
|
||||||
|
fi
|
||||||
|
])
|
@ -2,6 +2,7 @@ Makefile
|
|||||||
Makefile.in
|
Makefile.in
|
||||||
POTFILES
|
POTFILES
|
||||||
POTFILES.in
|
POTFILES.in
|
||||||
|
stamp-po
|
||||||
*.gmo
|
*.gmo
|
||||||
*.mo
|
*.mo
|
||||||
cat-id-tbl.c
|
cat-id-tbl.c
|
||||||
|
11
po/ChangeLog
11
po/ChangeLog
@ -1,3 +1,14 @@
|
|||||||
|
2004-05-26 gettextize <bug-gnu-gettext@gnu.org>
|
||||||
|
|
||||||
|
* Makefile.in.in: Upgrade to gettext-0.14.1.
|
||||||
|
* boldquot.sed: New file, from gettext-0.14.1.
|
||||||
|
* en@boldquot.header: New file, from gettext-0.14.1.
|
||||||
|
* en@quot.header: New file, from gettext-0.14.1.
|
||||||
|
* insert-header.sin: New file, from gettext-0.14.1.
|
||||||
|
* quot.sed: New file, from gettext-0.14.1.
|
||||||
|
* remove-potcdate.sin: New file, from gettext-0.14.1.
|
||||||
|
* Rules-quot: New file, from gettext-0.14.1.
|
||||||
|
|
||||||
2004-03-22 Claus Hindsgaul <claus_h@image.dk>
|
2004-03-22 Claus Hindsgaul <claus_h@image.dk>
|
||||||
|
|
||||||
* da.po: update
|
* da.po: update
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
# Makefile for program source directory in GNU NLS utilities package.
|
# Makefile for PO directory in any package using GNU gettext.
|
||||||
# Copyright (C) 1995-1997, 2000, 2001 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
|
# Copyright (C) 1995-1997, 2000-2004 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
|
||||||
#
|
#
|
||||||
# This file file be copied and used freely without restrictions. It can
|
# This file can be copied and used freely without restrictions. It can
|
||||||
# be used in projects which are not available under the GNU Public License
|
# be used in projects which are not available under the GNU General Public
|
||||||
# but which still want to provide support for the GNU gettext functionality.
|
# License but which still want to provide support for the GNU gettext
|
||||||
# Please note that the actual code is *not* freely available.
|
# 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@
|
PACKAGE = @PACKAGE@
|
||||||
VERSION = @VERSION@
|
VERSION = @VERSION@
|
||||||
|
|
||||||
# These two variables depend on the location of this directory.
|
|
||||||
subdir = po
|
|
||||||
top_builddir = ..
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
SHELL = /bin/sh
|
||||||
@SET_MAKE@
|
@SET_MAKE@
|
||||||
|
|
||||||
@ -29,27 +29,26 @@ gettextsrcdir = $(datadir)/gettext/po
|
|||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
MKINSTALLDIRS = @MKINSTALLDIRS@
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac`
|
mkinstalldirs = $(SHELL) $(MKINSTALLDIRS)
|
||||||
|
|
||||||
CC = @CC@
|
|
||||||
GMSGFMT = @GMSGFMT@
|
GMSGFMT = @GMSGFMT@
|
||||||
MSGFMT = @MSGFMT@
|
MSGFMT = @MSGFMT@
|
||||||
XGETTEXT = @XGETTEXT@
|
XGETTEXT = @XGETTEXT@
|
||||||
MSGMERGE = msgmerge
|
MSGMERGE = msgmerge
|
||||||
|
MSGMERGE_UPDATE = @MSGMERGE@ --update
|
||||||
DEFS = @DEFS@
|
MSGINIT = msginit
|
||||||
CFLAGS = @CFLAGS@
|
MSGCONV = msgconv
|
||||||
CPPFLAGS = @CPPFLAGS@
|
MSGFILTER = msgfilter
|
||||||
|
|
||||||
INCLUDES = -I.. -I$(top_srcdir)/intl
|
|
||||||
|
|
||||||
COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
|
|
||||||
|
|
||||||
POFILES = @POFILES@
|
POFILES = @POFILES@
|
||||||
GMOFILES = @GMOFILES@
|
GMOFILES = @GMOFILES@
|
||||||
DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \
|
UPDATEPOFILES = @UPDATEPOFILES@
|
||||||
$(POFILES) $(GMOFILES) xforms_l10n.pot qt_l10n.pot layouts_l10n.pot \
|
DUMMYPOFILES = @DUMMYPOFILES@
|
||||||
languages_l10n.pot ui_l10n.pot
|
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)
|
||||||
|
|
||||||
POTFILE_IN_DEPS = $(shell find $(top_srcdir)/src -name Makefile.am)
|
POTFILE_IN_DEPS = $(shell find $(top_srcdir)/src -name Makefile.am)
|
||||||
|
|
||||||
@ -57,51 +56,103 @@ POTFILES = \
|
|||||||
|
|
||||||
CATALOGS = @CATALOGS@
|
CATALOGS = @CATALOGS@
|
||||||
|
|
||||||
|
# Makevars gets inserted here. (Don't remove this line!)
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
.SUFFIXES: .c .o .po .pox .gmo .mo
|
.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update
|
||||||
|
|
||||||
.c.o:
|
|
||||||
$(COMPILE) $<
|
|
||||||
|
|
||||||
.po.pox:
|
|
||||||
$(MAKE) $(srcdir)/$(PACKAGE).pot
|
|
||||||
$(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox
|
|
||||||
|
|
||||||
.po.mo:
|
.po.mo:
|
||||||
$(MSGFMT) -o $@ $<
|
@echo "$(MSGFMT) -c -o $@ $<"; \
|
||||||
|
$(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
|
||||||
|
|
||||||
.po.gmo:
|
.po.gmo:
|
||||||
file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \
|
@lang=`echo $* | sed -e 's,.*/,,'`; \
|
||||||
&& case "$(GMSGFMT)" in \
|
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
|
||||||
*/msgfmt) rm -f $$file && $(GMSGFMT) --statistics -o $$file $<;; \
|
echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \
|
||||||
*) touch $$file ;; \
|
cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
|
||||||
esac
|
|
||||||
|
.sin.sed:
|
||||||
|
sed -e '/^#/d' $< > t-$@
|
||||||
|
mv t-$@ $@
|
||||||
|
|
||||||
|
|
||||||
all: all-@USE_NLS@
|
all: all-@USE_NLS@
|
||||||
|
|
||||||
all-yes: $(CATALOGS)
|
all-yes: stamp-po
|
||||||
all-no:
|
all-no:
|
||||||
|
|
||||||
# Note: Target 'all' must not depend on target '$(srcdir)/$(PACKAGE).pot',
|
# 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
|
# otherwise packages like GCC can not be built if only parts of the source
|
||||||
# have been downloaded.
|
# have been downloaded.
|
||||||
|
|
||||||
$(srcdir)/$(PACKAGE).pot: $(POTFILES) $(srcdir)/POTFILES.in l10n_pots
|
# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
|
||||||
$(XGETTEXT) --join-existing --default-domain=$(PACKAGE) --directory=$(top_srcdir) \
|
# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
|
||||||
--escape --add-comments --keyword=_ --keyword=N_ \
|
$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in l10n_pots remove-potcdate.sed
|
||||||
--keyword=qt_ --files-from=$(srcdir)/POTFILES.in \
|
$(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
|
||||||
&& test ! -f $(PACKAGE).po \
|
--add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \
|
||||||
|| ( rm -f $(srcdir)/$(PACKAGE).pot \
|
--files-from=$(srcdir)/POTFILES.in \
|
||||||
&& mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot || true)
|
--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: install-exec install-data
|
||||||
install-exec:
|
install-exec:
|
||||||
install-data: install-data-@USE_NLS@
|
install-data: install-data-@USE_NLS@
|
||||||
if test "$(PACKAGE)" = "gettext"; then \
|
if test "$(PACKAGE)" = "gettext-tools"; then \
|
||||||
$(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
|
$(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
|
||||||
$(INSTALL_DATA) $(srcdir)/Makefile.in.in \
|
for file in $(DISTFILES.common) Makevars.template; do \
|
||||||
$(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \
|
$(INSTALL_DATA) $(srcdir)/$$file \
|
||||||
|
$(DESTDIR)$(gettextsrcdir)/$$file; \
|
||||||
|
done; \
|
||||||
|
for file in Makevars; do \
|
||||||
|
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
|
||||||
|
done; \
|
||||||
else \
|
else \
|
||||||
: ; \
|
: ; \
|
||||||
fi
|
fi
|
||||||
@ -111,41 +162,118 @@ install-data-yes: all
|
|||||||
@catalogs='$(CATALOGS)'; \
|
@catalogs='$(CATALOGS)'; \
|
||||||
for cat in $$catalogs; do \
|
for cat in $$catalogs; do \
|
||||||
cat=`basename $$cat`; \
|
cat=`basename $$cat`; \
|
||||||
lang=`echo $$cat | sed 's/\.gmo$$//'`; \
|
lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
|
||||||
dir=$(localedir)/$$lang/LC_MESSAGES; \
|
dir=$(localedir)/$$lang/LC_MESSAGES; \
|
||||||
$(mkinstalldirs) $(DESTDIR)$$dir; \
|
$(mkinstalldirs) $(DESTDIR)$$dir; \
|
||||||
if test -r $$cat; then \
|
if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
|
||||||
$(INSTALL_DATA) $$cat $(DESTDIR)$$dir/$(PACKAGE).mo; \
|
$(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
|
||||||
echo "installing $$cat as $(DESTDIR)$$dir/$(PACKAGE).mo"; \
|
echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
|
||||||
else \
|
for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
|
||||||
$(INSTALL_DATA) $(srcdir)/$$cat $(DESTDIR)$$dir/$(PACKAGE).mo; \
|
if test -n "$$lc"; then \
|
||||||
echo "installing $(srcdir)/$$cat as" \
|
if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
|
||||||
"$(DESTDIR)$$dir/$(PACKAGE).mo"; \
|
link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
|
||||||
fi; \
|
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
|
done
|
||||||
|
|
||||||
# Define this as empty until I found a useful application.
|
# Define this as empty until I found a useful application.
|
||||||
installcheck:
|
installcheck:
|
||||||
|
|
||||||
uninstall:
|
uninstall: uninstall-exec uninstall-data
|
||||||
catalogs='$(CATALOGS)'; \
|
uninstall-exec:
|
||||||
for cat in $$catalogs; do \
|
uninstall-data: uninstall-data-@USE_NLS@
|
||||||
cat=`basename $$cat`; \
|
if test "$(PACKAGE)" = "gettext-tools"; then \
|
||||||
lang=`echo $$cat | sed 's/\.gmo$$//'`; \
|
for file in $(DISTFILES.common) Makevars.template; do \
|
||||||
rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(PACKAGE).mo; \
|
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
|
||||||
done
|
done; \
|
||||||
if test "$(PACKAGE)" = "gettext"; then \
|
|
||||||
rm -f $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \
|
|
||||||
else \
|
else \
|
||||||
: ; \
|
: ; \
|
||||||
fi
|
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
|
check: all
|
||||||
|
|
||||||
dvi info tags TAGS ID:
|
info dvi ps pdf html tags TAGS ctags CTAGS ID:
|
||||||
|
|
||||||
mostlyclean:
|
mostlyclean:
|
||||||
rm -f core core.* *.pox $(PACKAGE).po *.new.po
|
rm -f remove-potcdate.sed
|
||||||
|
rm -f stamp-poT
|
||||||
|
rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
|
||||||
rm -fr *.o
|
rm -fr *.o
|
||||||
|
|
||||||
clean: mostlyclean
|
clean: mostlyclean
|
||||||
@ -156,7 +284,7 @@ distclean: clean
|
|||||||
maintainer-clean: distclean
|
maintainer-clean: distclean
|
||||||
@echo "This command is intended for maintainers to use;"
|
@echo "This command is intended for maintainers to use;"
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
rm -f $(GMOFILES)
|
rm -f stamp-po $(GMOFILES)
|
||||||
|
|
||||||
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
|
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
|
||||||
dist distdir:
|
dist distdir:
|
||||||
@ -165,33 +293,70 @@ dist distdir:
|
|||||||
# This is a separate target because 'update-po' must be executed before.
|
# This is a separate target because 'update-po' must be executed before.
|
||||||
dist2: $(DISTFILES)
|
dist2: $(DISTFILES)
|
||||||
dists="$(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 \
|
for file in $$dists; do \
|
||||||
if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
|
if test -f $$file; then \
|
||||||
cp -p $$dir/$$file $(distdir); \
|
cp -p $$file $(distdir); \
|
||||||
|
else \
|
||||||
|
cp -p $(srcdir)/$$file $(distdir); \
|
||||||
|
fi; \
|
||||||
done
|
done
|
||||||
|
|
||||||
update-po: Makefile
|
update-po: Makefile
|
||||||
$(MAKE) $(PACKAGE).pot
|
$(MAKE) $(DOMAIN).pot-update
|
||||||
if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; fi; \
|
test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
|
||||||
cd $(srcdir); \
|
|
||||||
catalogs='$(GMOFILES)'; \
|
|
||||||
for cat in $$catalogs; do \
|
|
||||||
cat=`basename $$cat`; \
|
|
||||||
lang=`echo $$cat | sed 's/\.gmo$$//'`; \
|
|
||||||
echo "$$lang:"; \
|
|
||||||
if $(MSGMERGE) $$lang.po $(PACKAGE).pot -o $$lang.new.po; then \
|
|
||||||
mv -f $$lang.new.po $$lang.po; \
|
|
||||||
else \
|
|
||||||
echo "msgmerge for $$cat failed!"; \
|
|
||||||
rm -f $$lang.new.po; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
$(MAKE) update-gmo
|
$(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)
|
update-gmo: Makefile $(GMOFILES)
|
||||||
@:
|
@:
|
||||||
|
|
||||||
Makefile: Makefile.in.in $(top_builddir)/config.status POTFILES.in
|
Makefile: Makefile.in.in $(top_builddir)/config.status @POMAKEFILEDEPS@
|
||||||
cd $(top_builddir) \
|
cd $(top_builddir) \
|
||||||
&& CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
|
&& CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
|
||||||
$(SHELL) ./config.status
|
$(SHELL) ./config.status
|
||||||
@ -205,7 +370,6 @@ ${srcdir}/POTFILES.in: $(POTFILE_IN_DEPS)
|
|||||||
sort | uniq ) > $@-t \
|
sort | uniq ) > $@-t \
|
||||||
&& mv $@-t $@
|
&& mv $@-t $@
|
||||||
|
|
||||||
|
|
||||||
l10n_pots: $(srcdir)/xforms_l10n.pot $(srcdir)/qt_l10n.pot $(srcdir)/layouts_l10n.pot $(srcdir)/languages_l10n.pot $(srcdir)/ui_l10n.pot
|
l10n_pots: $(srcdir)/xforms_l10n.pot $(srcdir)/qt_l10n.pot $(srcdir)/layouts_l10n.pot $(srcdir)/languages_l10n.pot $(srcdir)/ui_l10n.pot
|
||||||
cat $(srcdir)/xforms_l10n.pot $(srcdir)/qt_l10n.pot $(srcdir)/layouts_l10n.pot $(srcdir)/languages_l10n.pot $(srcdir)/ui_l10n.pot | \
|
cat $(srcdir)/xforms_l10n.pot $(srcdir)/qt_l10n.pot $(srcdir)/layouts_l10n.pot $(srcdir)/languages_l10n.pot $(srcdir)/ui_l10n.pot | \
|
||||||
msguniq -o $(PACKAGE).po
|
msguniq -o $(PACKAGE).po
|
||||||
@ -214,105 +378,107 @@ $(srcdir)/xforms_l10n.pot: $(top_srcdir)/src/frontends/xforms/forms/*.fd
|
|||||||
cd ${srcdir} ; \
|
cd ${srcdir} ; \
|
||||||
LC_ALL=C ; export LC_ALL ; \
|
LC_ALL=C ; export LC_ALL ; \
|
||||||
awk ' \
|
awk ' \
|
||||||
BEGIN { \
|
BEGIN { \
|
||||||
print "#, fuzzy"; \
|
print "#, fuzzy"; \
|
||||||
print "msgid \"\""; \
|
print "msgid \"\""; \
|
||||||
print "msgstr \"\""; \
|
print "msgstr \"\""; \
|
||||||
print "\"Content-Type: text/plain; charset=ISO-8859-1\\n\""; \
|
print "\"Content-Type: text/plain; charset=ISO-8859-1\\n\""; \
|
||||||
print "\"Content-Transfer-Encoding: 8bit\\n\""; \
|
print "\"Content-Transfer-Encoding: 8bit\\n\""; \
|
||||||
print "\n"; \
|
print "\n"; \
|
||||||
skip=0; \
|
skip=0; \
|
||||||
} \
|
} \
|
||||||
/style: 15/ { \
|
/style: 15/ { \
|
||||||
skip=1; \
|
skip=1; \
|
||||||
} \
|
} \
|
||||||
/label: / { \
|
/label: / { \
|
||||||
if (NF > 1 && skip == 0) { \
|
if (NF > 1 && skip == 0) { \
|
||||||
line=$$0;\
|
line=$$0;\
|
||||||
sub(/label: /,"",line);\
|
sub(/label: /,"",line);\
|
||||||
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n", FILENAME, FNR, line);\
|
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n", FILENAME, FNR, line);\
|
||||||
}\
|
}\
|
||||||
skip=0; \
|
skip=0; \
|
||||||
}' \
|
}' \
|
||||||
../src/frontends/xforms/forms/*.fd > xforms_l10n.pot
|
../src/frontends/xforms/forms/*.fd > xforms_l10n.pot
|
||||||
|
|
||||||
$(srcdir)/qt_l10n.pot: $(top_srcdir)/src/frontends/qt2/ui/*.ui
|
$(srcdir)/qt_l10n.pot: $(top_srcdir)/src/frontends/qt2/ui/*.ui
|
||||||
cd ${srcdir} ; \
|
cd ${srcdir} ; \
|
||||||
LC_ALL=C ; export LC_ALL ; \
|
LC_ALL=C ; export LC_ALL ; \
|
||||||
awk ' \
|
awk ' \
|
||||||
/<string>/ { \
|
/<string>/ { \
|
||||||
line=$$0; \
|
line=$$0; \
|
||||||
sub(/.*<string>/, "", line); \
|
sub(/.*<string>/, "", line); \
|
||||||
sub(/<\/string>.*/, "", line); \
|
sub(/<\/string>.*/, "", line); \
|
||||||
gsub(/&/, "\\&", line); \
|
gsub(/&/, "\\&", line); \
|
||||||
gsub(/</, "<", line); \
|
gsub(/</, "<", line); \
|
||||||
gsub(/>/, ">", line); \
|
gsub(/>/, ">", line); \
|
||||||
gsub(/\"/, "\\\"", line); \
|
gsub(/\"/, "\\\"", line); \
|
||||||
if (length(line) > 0) \
|
if (length(line) > 0) \
|
||||||
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n",\
|
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n",\
|
||||||
FILENAME, FNR, line); \
|
FILENAME, FNR, line); \
|
||||||
}' \
|
}' \
|
||||||
../src/frontends/qt2/ui/*.ui > qt_l10n.pot
|
../src/frontends/qt2/ui/*.ui > qt_l10n.pot
|
||||||
|
|
||||||
$(srcdir)/layouts_l10n.pot: $(top_srcdir)/lib/layouts/*.layout $(top_srcdir)/lib/layouts/*.inc
|
$(srcdir)/layouts_l10n.pot: $(top_srcdir)/lib/layouts/*.layout $(top_srcdir)/lib/layouts/*.inc
|
||||||
cd ${srcdir} ; \
|
cd ${srcdir} ; \
|
||||||
LC_ALL=C ; export LC_ALL ; \
|
LC_ALL=C ; export LC_ALL ; \
|
||||||
awk ' \
|
awk ' \
|
||||||
/^Style / { \
|
/^Style / { \
|
||||||
line=$$0; \
|
line=$$0; \
|
||||||
sub(/Style /, "", line); \
|
sub(/Style /, "", line); \
|
||||||
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n", \
|
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n", \
|
||||||
FILENAME, FNR, line); \
|
FILENAME, FNR, line); \
|
||||||
} \
|
} \
|
||||||
/GuiName/ { \
|
/GuiName/ { \
|
||||||
line=$$0; \
|
line=$$0; \
|
||||||
sub(/[[:space:]]*GuiName[[:space:]]*/, "", line); \
|
sub(/[[:space:]]*GuiName[[:space:]]*/, "", line); \
|
||||||
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n", \
|
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n", \
|
||||||
FILENAME, FNR, line); \
|
FILENAME, FNR, line); \
|
||||||
} \
|
}' \
|
||||||
' ../lib/layouts/*.layout ../lib/layouts/*.inc > layouts_l10n.pot
|
../lib/layouts/*.layout ../lib/layouts/*.inc > layouts_l10n.pot
|
||||||
|
|
||||||
$(srcdir)/languages_l10n.pot: $(top_srcdir)/lib/languages
|
$(srcdir)/languages_l10n.pot: $(top_srcdir)/lib/languages
|
||||||
cd ${srcdir} ; \
|
cd ${srcdir} ; \
|
||||||
awk ' \
|
awk ' \
|
||||||
/^#/ { \
|
/^#/ { \
|
||||||
next; \
|
next; \
|
||||||
} \
|
} \
|
||||||
{ \
|
{ \
|
||||||
match($$0,"\"[^\"]*\""); \
|
match($$0,"\"[^\"]*\""); \
|
||||||
lang=substr($$0,RSTART,RLENGTH); \
|
lang=substr($$0,RSTART,RLENGTH); \
|
||||||
gsub(/\"/, "", lang); \
|
gsub(/\"/, "", lang); \
|
||||||
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n", \
|
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n", \
|
||||||
FILENAME, FNR, lang); \
|
FILENAME, FNR, lang); \
|
||||||
} \
|
}' \
|
||||||
' ../lib/languages > languages_l10n.pot
|
../lib/languages > languages_l10n.pot
|
||||||
|
|
||||||
$(srcdir)/ui_l10n.pot: $(top_srcdir)/lib/ui/*.ui
|
$(srcdir)/ui_l10n.pot: $(top_srcdir)/lib/ui/*.ui
|
||||||
cd ${srcdir} ; \
|
cd ${srcdir} ; \
|
||||||
LC_ALL=C ; export LC_ALL ; \
|
LC_ALL=C ; export LC_ALL ; \
|
||||||
awk ' \
|
awk ' \
|
||||||
/^[^#]*Submenu/ { \
|
/^[^#]*Submenu/ { \
|
||||||
line=$$0; \
|
line=$$0; \
|
||||||
sub(/[^"]*"/, "", line); \
|
sub(/[^"]*"/, "", line); \
|
||||||
sub(/".*/, "", line); \
|
sub(/".*/, "", line); \
|
||||||
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n", \
|
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n", \
|
||||||
FILENAME, FNR, line); \
|
FILENAME, FNR, line); \
|
||||||
} \
|
} \
|
||||||
/^[^#]*Toolbar/ { \
|
/^[^#]*Toolbar/ { \
|
||||||
line=$$0; \
|
line=$$0; \
|
||||||
sub(/[^"]*"/, "", line); \
|
sub(/[^"]*"/, "", line); \
|
||||||
sub(/".*/, "", line); \
|
sub(/".*/, "", line); \
|
||||||
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n", \
|
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n", \
|
||||||
FILENAME, FNR, line); \
|
FILENAME, FNR, line); \
|
||||||
} \
|
} \
|
||||||
/^[^#]*Item/ { \
|
/^[^#]*Item/ { \
|
||||||
line=$$0; \
|
line=$$0; \
|
||||||
sub(/[^"]*"/, "", line); \
|
sub(/[^"]*"/, "", line); \
|
||||||
sub(/".*/, "", line); \
|
sub(/".*/, "", line); \
|
||||||
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n", \
|
printf("#: %s:%d\nmsgid \"%s\"\nmsgstr \"\"\n\n", \
|
||||||
FILENAME, FNR, line); \
|
FILENAME, FNR, line); \
|
||||||
} \
|
}' \
|
||||||
' ../lib/ui/*.ui > ui_l10n.pot
|
../lib/ui/*.ui > ui_l10n.pot
|
||||||
|
|
||||||
|
force:
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make not to export all variables.
|
# 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.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
41
po/Makevars
Normal file
41
po/Makevars
Normal file
@ -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 = --join-existing --keyword=_ --keyword=N_ --keyword=qt_
|
||||||
|
|
||||||
|
# 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 = LyX Developers
|
||||||
|
|
||||||
|
# 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 = lyx-devel@lists.lyx.org
|
||||||
|
|
||||||
|
# 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 =
|
47
po/Rules-quot
Normal file
47
po/Rules-quot
Normal file
@ -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
|
10
po/boldquot.sed
Normal file
10
po/boldquot.sed
Normal file
@ -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
|
25
po/en@boldquot.header
Normal file
25
po/en@boldquot.header
Normal file
@ -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.
|
||||||
|
#
|
22
po/en@quot.header
Normal file
22
po/en@quot.header
Normal file
@ -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.
|
||||||
|
#
|
23
po/insert-header.sin
Normal file
23
po/insert-header.sin
Normal file
@ -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
|
||||||
|
}
|
12
po/nn.po
12
po/nn.po
@ -11,7 +11,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: nn\n"
|
"Project-Id-Version: nn\n"
|
||||||
"POT-Creation-Date: 2003-11-24 18:00+0100\n"
|
"POT-Creation-Date: 2003-11-24 18:00+0100\n"
|
||||||
"PO-Revision-Date: 2003-12-14 21:23+0100\n"
|
"PO-Revision-Date: 2004-05-26 18:49+0200\n"
|
||||||
"Last-Translator: Ingar Parelisussen <ingar.pareliussen@chembio.ntnu.no>\n"
|
"Last-Translator: Ingar Parelisussen <ingar.pareliussen@chembio.ntnu.no>\n"
|
||||||
"Language-Team: Nynorsk <nn@li.org>\n"
|
"Language-Team: Nynorsk <nn@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@ -8044,12 +8044,12 @@ msgstr "Formaterer dokumentet ..."
|
|||||||
#: src/BufferView_pimpl.C:643
|
#: src/BufferView_pimpl.C:643
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Saved bookmark %1$s"
|
msgid "Saved bookmark %1$s"
|
||||||
msgstr "Lagra bokmerke %1$d"
|
msgstr "Lagra bokmerke %1$s"
|
||||||
|
|
||||||
#: src/BufferView_pimpl.C:676
|
#: src/BufferView_pimpl.C:676
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Moved to bookmark %1$s"
|
msgid "Moved to bookmark %1$s"
|
||||||
msgstr "Flytta bokmerke %1$d"
|
msgstr "Flytta bokmerke %1$s"
|
||||||
|
|
||||||
#: src/BufferView_pimpl.C:793
|
#: src/BufferView_pimpl.C:793
|
||||||
msgid "Select LyX document to insert"
|
msgid "Select LyX document to insert"
|
||||||
@ -8336,7 +8336,7 @@ msgstr "ignorer"
|
|||||||
#: src/LaTeX.C:87
|
#: src/LaTeX.C:87
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Waiting for LaTeX run number %1$s"
|
msgid "Waiting for LaTeX run number %1$s"
|
||||||
msgstr "Ventar: LaTeX køyring nummer %1$d"
|
msgstr "Ventar: LaTeX køyring nummer %1$s"
|
||||||
|
|
||||||
#: src/LaTeX.C:277 src/LaTeX.C:345
|
#: src/LaTeX.C:277 src/LaTeX.C:345
|
||||||
msgid "Running MakeIndex."
|
msgid "Running MakeIndex."
|
||||||
@ -8595,7 +8595,7 @@ msgstr " Lagring fungerte ikkje. Diverre har dokumentet g
|
|||||||
#: src/bufferparams.C:230
|
#: src/bufferparams.C:230
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "The document uses a missing TeX class \"%1$s\".\n"
|
msgid "The document uses a missing TeX class \"%1$s\".\n"
|
||||||
msgstr "Dokumentet nyttar ei ukjent tekstklasse \"%1$\".\n"
|
msgstr "Dokumentet nyttar ei ukjent tekstklasse \"%1$s\".\n"
|
||||||
|
|
||||||
#: src/bufferparams.C:232
|
#: src/bufferparams.C:232
|
||||||
msgid "Document class not available"
|
msgid "Document class not available"
|
||||||
@ -12189,7 +12189,7 @@ msgstr "Kunne ikkje opna dokumentet %1$s"
|
|||||||
#: src/lyxfunc.C:1618
|
#: src/lyxfunc.C:1618
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Select %1$s file to import"
|
msgid "Select %1$s file to import"
|
||||||
msgstr "Vel stilen som skal importerast:"
|
msgstr "Vel %1$s filen som skal importerast:"
|
||||||
|
|
||||||
#: src/lyxfunc.C:1735
|
#: src/lyxfunc.C:1735
|
||||||
msgid "Welcome to LyX!"
|
msgid "Welcome to LyX!"
|
||||||
|
6
po/quot.sed
Normal file
6
po/quot.sed
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
s/"\([^"]*\)"/“\1”/g
|
||||||
|
s/`\([^`']*\)'/‘\1’/g
|
||||||
|
s/ '\([^`']*\)' / ‘\1’ /g
|
||||||
|
s/ '\([^`']*\)'$/ ‘\1’/g
|
||||||
|
s/^'\([^`']*\)' /‘\1’ /g
|
||||||
|
s/“”/""/g
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user