summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ABOUT-NLS319
-rw-r--r--Makefile.am4
-rw-r--r--acconfig.h3
-rw-r--r--configure.in25
-rwxr-xr-xcvscompile.sh2
-rw-r--r--include/xine.h.tmpl.in152
-rw-r--r--intl/ChangeLog1765
-rw-r--r--intl/ChangeLog.inst4
-rw-r--r--intl/Makefile.in319
-rw-r--r--intl/VERSION1
-rw-r--r--intl/bindtextdom.c368
-rwxr-xr-xintl/config.charset438
-rw-r--r--intl/dcgettext.c57
-rw-r--r--intl/dcigettext.c1258
-rw-r--r--intl/dcngettext.c59
-rw-r--r--intl/dgettext.c58
-rw-r--r--intl/dngettext.c60
-rw-r--r--intl/explodename.c191
-rw-r--r--intl/finddomain.c197
-rw-r--r--intl/gettext.c63
-rw-r--r--intl/gettext.h101
-rw-r--r--intl/gettextP.h251
-rw-r--r--intl/hash-string.h58
-rw-r--r--intl/intl-compat.c165
-rw-r--r--intl/l10nflist.c404
-rw-r--r--intl/libgettext.h48
-rw-r--r--intl/libgnuintl.h127
-rw-r--r--intl/libintl.glibc116
-rw-r--r--intl/loadinfo.h108
-rw-r--r--intl/loadmsgcat.c566
-rw-r--r--intl/localcharset.c271
-rw-r--r--intl/locale.alias77
-rw-r--r--intl/localealias.c403
-rw-r--r--intl/ngettext.c67
-rw-r--r--intl/plural.c1325
-rw-r--r--intl/plural.y412
-rw-r--r--intl/ref-add.sin31
-rw-r--r--intl/ref-del.sin26
-rw-r--r--intl/textdomain.c141
-rw-r--r--m4/Makefile.am4
-rw-r--r--m4/codeset.m417
-rw-r--r--m4/gettext.m4368
-rw-r--r--m4/glibc21.m426
-rw-r--r--m4/iconv.m469
-rw-r--r--m4/isc-posix.m417
-rw-r--r--m4/lcmessage.m422
-rw-r--r--m4/progtest.m449
-rw-r--r--m4/xine.m43
-rw-r--r--misc/xine-config.in9
-rw-r--r--po/Makefile.in.in199
-rw-r--r--po/POTFILES.in26
-rw-r--r--po/fr.po1535
-rw-r--r--po/xine-lib.pot1524
-rw-r--r--src/demuxers/demux_asf.c91
-rw-r--r--src/demuxers/demux_avi.c71
-rw-r--r--src/demuxers/demux_cda.c36
-rw-r--r--src/demuxers/demux_elem.c38
-rw-r--r--src/demuxers/demux_mpeg.c51
-rw-r--r--src/demuxers/demux_mpeg_block.c61
-rw-r--r--src/demuxers/demux_mpgaudio.c43
-rw-r--r--src/demuxers/demux_ogg.c49
-rw-r--r--src/demuxers/demux_pes.c45
-rw-r--r--src/demuxers/demux_qt.c74
-rw-r--r--src/demuxers/demux_ts.c247
-rw-r--r--src/input/input_cda.c89
-rw-r--r--src/input/input_dvd.c102
-rw-r--r--src/input/input_file.c72
-rw-r--r--src/input/input_http.c103
-rw-r--r--src/input/input_net.c57
-rw-r--r--src/input/input_rtp.c72
-rw-r--r--src/input/input_stdin_fifo.c40
-rw-r--r--src/input/input_vcd.c103
-rw-r--r--src/xine-engine/Makefile.am10
-rw-r--r--src/xine-engine/load_plugins.c73
-rw-r--r--src/xine-engine/metronom.c87
-rw-r--r--src/xine-engine/metronom.h10
-rw-r--r--src/xine-engine/resample.c4
-rw-r--r--src/xine-engine/video_out.c50
-rw-r--r--src/xine-engine/xine.c116
-rw-r--r--src/xine-engine/xine_internal.h14
-rw-r--r--src/xine-engine/xineintl.h56
81 files changed, 15132 insertions, 640 deletions
diff --git a/ABOUT-NLS b/ABOUT-NLS
new file mode 100644
index 000000000..a4fb870be
--- /dev/null
+++ b/ABOUT-NLS
@@ -0,0 +1,319 @@
+Notes on the Free Translation Project
+*************************************
+
+ Free software is going international! The Free Translation Project
+is a way to get maintainers of free software, translators, and users all
+together, so that will gradually become able to speak many languages.
+A few packages already provide translations for their messages.
+
+ If you found this `ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU `gettext' internally,
+itself available at your nearest GNU archive site. But you do _not_
+need to install GNU `gettext' prior to configuring, installing or using
+this package with messages translated.
+
+ Installers will find here some useful hints. These notes also
+explain how users should proceed for getting the programs to use the
+available translations. They tell how people wanting to contribute and
+work at translations should contact the appropriate team.
+
+ When reporting bugs in the `intl/' directory or bugs which may be
+related to internationalization, you should tell about the version of
+`gettext' which is used. The information can be found in the
+`intl/VERSION' file, in internationalized packages.
+
+Quick configuration advice
+==========================
+
+ If you want to exploit the full power of internationalization, you
+should configure it using
+
+ ./configure --with-included-gettext
+
+to force usage of internationalizing routines provided within this
+package, despite the existence of internationalizing capabilities in the
+operating system where this package is being installed. So far, only
+the `gettext' implementation in the GNU C library version 2 provides as
+many features (such as locale alias, message inheritance, automatic
+charset conversion or plural form handling) as the implementation here.
+It is also not possible to offer this additional functionality on top
+of a `catgets' implementation. Future versions of GNU `gettext' will
+very likely convey even more functionality. So it might be a good idea
+to change to GNU `gettext' as soon as possible.
+
+ So you need _not_ provide this option if you are using GNU libc 2 or
+you have installed a recent copy of the GNU gettext package with the
+included `libintl'.
+
+INSTALL Matters
+===============
+
+ Some packages are "localizable" when properly installed; the
+programs they contain can be made to speak your own native language.
+Most such packages use GNU `gettext'. Other packages have their own
+ways to internationalization, predating GNU `gettext'.
+
+ By default, this package will be installed to allow translation of
+messages. It will automatically detect whether the system already
+provides the GNU `gettext' functions. If not, the GNU `gettext' own
+library will be used. This library is wholly contained within this
+package, usually in the `intl/' subdirectory, so prior installation of
+the GNU `gettext' package is _not_ required. Installers may use
+special options at configuration time for changing the default
+behaviour. The commands:
+
+ ./configure --with-included-gettext
+ ./configure --disable-nls
+
+will respectively bypass any pre-existing `gettext' to use the
+internationalizing routines provided within this package, or else,
+_totally_ disable translation of messages.
+
+ When you already have GNU `gettext' installed on your system and run
+configure without an option for your new package, `configure' will
+probably detect the previously built and installed `libintl.a' file and
+will decide to use this. This might be not what is desirable. You
+should use the more recent version of the GNU `gettext' library. I.e.
+if the file `intl/VERSION' shows that the library which comes with this
+package is more recent, you should use
+
+ ./configure --with-included-gettext
+
+to prevent auto-detection.
+
+ The configuration process will not test for the `catgets' function
+and therefore it will not be used. The reason is that even an
+emulation of `gettext' on top of `catgets' could not provide all the
+extensions of the GNU `gettext' library.
+
+ Internationalized packages have usually many `po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language. Unless
+translations have been forbidden at `configure' time by using the
+`--disable-nls' switch, all available translations are installed
+together with the package. However, the environment variable `LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+`LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+Using This Package
+==================
+
+ As a user, if your language has been installed for this package, you
+only have to set the `LANG' environment variable to the appropriate
+`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code,
+and `CC' is an ISO 3166 two-letter country code. For example, let's
+suppose that you speak German and live in Germany. At the shell
+prompt, merely execute `setenv LANG de_DE' (in `csh'),
+`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
+This can be done from your `.login' or `.profile' file, once and for
+all.
+
+ You might think that the country code specification is redundant.
+But in fact, some languages have dialects in different countries. For
+example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The
+country code serves to distinguish the dialects.
+
+ Not all programs have translations for all languages. By default, an
+English message is shown in place of a nonexistent translation. If you
+understand other languages, you can set up a priority list of languages.
+This is done through a different environment variable, called
+`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG'
+for the purpose of message handling, but you still need to have `LANG'
+set to the primary language; this is required by other parts of the
+system libraries. For example, some Swedish users who would rather
+read translations in German than English for when Swedish is not
+available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
+
+ In the `LANGUAGE' environment variable, but not in the `LANG'
+environment variable, `LL_CC' combinations can be abbreviated as `LL'
+to denote the language's main dialect. For example, `de' is equivalent
+to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
+(Portuguese as spoken in Portugal) in this context.
+
+Translating Teams
+=================
+
+ For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list. The up-to-date list of
+teams can be found at the Free Translation Project's homepage,
+`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams"
+area.
+
+ If you'd like to volunteer to _work_ at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is _not_ the same as the list itself, it has
+`-request' appended. For example, speakers of Swedish can send a
+message to `sv-request@li.org', having this message body:
+
+ subscribe
+
+ Keep in mind that team members are expected to participate
+_actively_ in translations, or at solving translational difficulties,
+rather than merely lurking around. If your team does not exist yet and
+you want to start one, or if you are unsure about what to do or how to
+get started, please write to `translation@iro.umontreal.ca' to reach the
+coordinator for all translator teams.
+
+ The English team is special. It works at improving and uniformizing
+the terminology in use. Proven linguistic skill are praised more than
+programming skill, here.
+
+Available Packages
+==================
+
+ Languages are not equally supported in all packages. The following
+matrix shows the current state of internationalization, as of July
+2001. The matrix shows, in regard of each package, for which languages
+PO files have been submitted to translation coordination, with a
+translation percentage of at least 50%.
+
+ Ready PO files bg cs da de el en eo es et fi fr gl he hr id it
+ +-------------------------------------------------+
+ a2ps | [] [] |
+ bash | [] [] [] [] |
+ bfd | |
+ binutils | |
+ bison | [] [] [] [] |
+ clisp | [] [] [] [] |
+ cpio | [] [] [] [] [] |
+ diffutils | [] [] [] [] [] [] [] |
+ enscript | [] [] |
+ error | [] [] |
+ fetchmail | |
+ fileutils | [] [] [] [] [] [] [] |
+ findutils | [] [] [] [] [] [] [] [] |
+ flex | [] [] [] |
+ freetype | |
+ gas | |
+ gawk | [] |
+ gcal | |
+ gcc | |
+ gettext | [] [] [] [] [] [] [] [] [] |
+ gnupg | [] [] [] [] [] [] |
+ gprof | |
+ grep | [] [] [] [] [] [] [] |
+ hello | [] [] [] [] [] [] [] [] [] [] |
+ id-utils | [] [] [] |
+ indent | [] [] [] [] [] |
+ jpilot | [] |
+ kbd | |
+ ld | |
+ libc | [] [] [] [] [] [] [] [] |
+ lilypond | |
+ lynx | [] [] [] |
+ m4 | [] [] [] [] [] [] [] |
+ make | [] [] [] [] [] |
+ nano | [] [] |
+ opcodes | |
+ parted | [] [] |
+ ptx | [] [] [] [] [] [] [] |
+ python | |
+ recode | [] [] [] [] [] [] [] [] [] |
+ sed | [] [] [] [] [] [] [] [] [] [] |
+ sh-utils | [] [] [] [] [] [] [] [] [] |
+ sharutils | [] [] [] [] [] [] [] |
+ soundtracker | [] |
+ sp | |
+ tar | [] [] [] [] [] [] [] [] |
+ texinfo | [] [] [] [] [] |
+ textutils | [] [] [] [] [] [] [] |
+ util-linux | [] [] |
+ wdiff | [] [] |
+ wget | [] [] [] [] [] [] [] [] [] |
+ +-------------------------------------------------+
+ bg cs da de el en eo es et fi fr gl he hr id it
+ 0 13 23 30 11 1 8 21 13 1 29 22 3 0 8 10
+
+ ja ko lv nl no pl pt pt_BR ru sk sl sv tr uk zh
+ +-------------------------------------------------+
+ a2ps | [] [] [] | 5
+ bash | | 4
+ bfd | | 0
+ binutils | | 0
+ bison | [] [] [] | 7
+ clisp | [] | 5
+ cpio | [] [] [] [] [] | 10
+ diffutils | [] [] [] | 10
+ enscript | [] [] [] | 5
+ error | [] | 3
+ fetchmail | | 0
+ fileutils | [] [] [] [] [] [] [] [] [] [] | 17
+ findutils | [] [] [] [] [] [] [] [] | 16
+ flex | [] [] [] | 6
+ freetype | | 0
+ gas | | 0
+ gawk | [] | 2
+ gcal | | 0
+ gcc | | 0
+ gettext | [] [] [] [] [] [] [] [] [] | 18
+ gnupg | [] [] [] [] | 10
+ gprof | | 0
+ grep | [] [] [] | 10
+ hello | [] [] [] [] [] [] [] [] [] [] [] | 21
+ id-utils | [] [] [] | 6
+ indent | [] [] [] [] [] [] [] | 12
+ jpilot | | 1
+ kbd | [] | 1
+ ld | | 0
+ libc | [] [] [] [] [] [] [] [] [] | 17
+ lilypond | [] [] | 2
+ lynx | [] [] [] [] [] | 8
+ m4 | [] [] [] [] [] | 12
+ make | [] [] [] [] [] [] [] | 12
+ nano | [] | 3
+ opcodes | | 0
+ parted | [] [] [] | 5
+ ptx | [] [] [] [] [] [] [] | 14
+ python | | 0
+ recode | [] [] [] [] | 13
+ sed | [] [] [] [] [] [] [] [] | 18
+ sh-utils | [] [] [] [] [] [] [] [] [] [] [] | 20
+ sharutils | [] [] [] [] | 11
+ soundtracker | | 1
+ sp | | 0
+ tar | [] [] [] [] [] [] [] [] [] | 17
+ texinfo | [] [] | 7
+ textutils | [] [] [] [] [] [] [] [] | 15
+ util-linux | [] [] | 4
+ wdiff | [] [] [] | 5
+ wget | [] [] [] [] [] [] [] | 16
+ +-------------------------------------------------+
+ 31 teams ja ko lv nl no pl pt pt_BR ru sk sl sv tr uk zh
+ 51 domains 17 9 1 23 6 17 1 13 26 9 11 20 19 2 2 369
+
+ Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect. This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+ For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and
+distributed as such by its maintainer. There might be an observable
+lag between the mere existence a PO file and its wide availability in a
+distribution.
+
+ If July 2001 seems to be old, you may fetch a more recent copy of
+this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date
+matrix with full percentage details can be found at
+`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
+
+Using `gettext' in new packages
+===============================
+
+ If you are writing a freely available program and want to
+internationalize it you are welcome to use GNU `gettext' in your
+package. Of course the GNU General Public License applies to your
+sources from then on if you include `gettext' directly in your
+distribution but since you are writing free software anyway this is no
+restriction.
+
+ Once the sources are changed appropriately and the setup can handle
+to use of `gettext' the only thing missing are the translations. The
+Free Translation Project is also available for packages which are not
+developed inside the GNU project. Therefore the information given above
+applies also for every other Free Software Project. Contact
+`translation@iro.umontreal.ca' to make the `.pot' files available to
+the translation teams.
+
diff --git a/Makefile.am b/Makefile.am
index 8768b1b9c..de7c27719 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -4,7 +4,7 @@
AUTOMAKE_OPTIONS = 1.3
-SUBDIRS = doc m4 misc include src
+SUBDIRS = doc m4 intl po misc include src
EXTRA_DIST = cvscompile.sh automake.diff \
debian/README.Debian debian/changelog debian/control \
@@ -49,4 +49,4 @@ maintainer-clean-generic:
-rm -f Makefile.in configure acinclude.m4 aclocal.m4
-rm -f config.h.in stamp-h.in ltconfig ltmain.sh
-rm -f config.guess config.sub install-sh missing mkinstalldirs
- -rm -f libtool-nofpic depcomp config.log
+ -rm -f libtool-nofpic depcomp config.log config.status
diff --git a/acconfig.h b/acconfig.h
index 654490be5..59ebc7554 100644
--- a/acconfig.h
+++ b/acconfig.h
@@ -51,6 +51,9 @@
/* Define this to osd fonts dir location*/
#undef XINE_FONTDIR
+/* Path where catalog files will be. */
+#undef XINE_LOCALEDIR
+
/* Define this if you have X11R6 installed */
#undef HAVE_X11
diff --git a/configure.in b/configure.in
index f3b41ebc0..7bf79287b 100644
--- a/configure.in
+++ b/configure.in
@@ -115,6 +115,20 @@ AC_SUBST(STATIC)
dnl
+dnl NLS Support
+dnl
+dnl ALL_LINGUAS="cs da de el en@quot en@boldquot es et fr gl id it ja ko nl nn no pl pt pt_BR ru sl sv tr zh"
+ALL_LINGUAS="fr"
+AM_GNU_GETTEXT(use-libtool)
+AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl)
+AM_CONDITIONAL(INCLUDED_INTL, test x$USE_INCLUDED_LIBINTL = "xyes")
+if test x"$USE_INCLUDED_LIBINTL" = x"yes"; then
+ INTLDIR="-I\$(top_builddir)/intl -I\$(top_srcdir)/intl"
+fi
+AC_SUBST(INTLDIR)
+
+
+dnl
dnl Check for assembler (ffmpeg need it), don't call this before LIBTOOL
dnl
AM_PROG_AS
@@ -716,11 +730,16 @@ eval XINE_FONTPATH="$XINE_FONTDIR"
AC_DEFINE_UNQUOTED(XINE_FONTDIR,"$XINE_FONTPATH")
AC_SUBST(XINE_FONTPATH)
+XINE_LOCALEDIR="${datadir}/locale"
+eval XINE_LOCALEPATH="$XINE_LOCALEDIR"
+AC_DEFINE_UNQUOTED(XINE_LOCALEDIR, "$XINE_LOCALEPATH")
+AC_SUBST(XINE_LOCALEPATH)
AC_SUBST(XINE_PLUGINDIR)
AC_SUBST(XINE_DEMUXDIR)
AC_SUBST(XINE_SKINDIR)
AC_SUBST(XINE_FONTDIR)
+AC_SUBST(XINE_LOCALEDIR)
dnl Where scripts will/should be installed.
@@ -753,7 +772,7 @@ AC_SUBST(w32_path)
dnl
dnl Some include paths ( !!! DO NOT REMOVE !!! )
dnl
-INCLUDES='-I$(top_srcdir) -I$(top_builddir) -I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_srcdir)/src/xine-engine -I$(top_builddir)/src/xine-engine -I$(top_srcdir)/src/xine-utils -I$(top_builddir)/src/xine-utils'
+INCLUDES='-I$(top_srcdir) -I$(top_builddir) -I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_srcdir)/src/xine-engine -I$(top_builddir)/src/xine-engine -I$(top_srcdir)/src/xine-utils -I$(top_builddir)/src/xine-utils $(INTLDIR)'
AC_SUBST(INCLUDES)
@@ -828,7 +847,9 @@ misc/guenter.spec
misc/SlackBuild
misc/guenter_rpms.sh
misc/build_rpms.sh
-misc/fonts/Makefile],
+misc/fonts/Makefile
+intl/Makefile
+po/Makefile.in],
[chmod +x ./misc/SlackBuild ./misc/build_rpms.sh ./misc/guenter_rpms.sh; rm -f include/xine.h; echo '/* !! DO NO EDIT THIS FILE, it is automatically generated */' > include/xine.h && cat include/xine.h.tmpl >> include/xine.h])
dnl
diff --git a/cvscompile.sh b/cvscompile.sh
index 0be9ff331..1664b0fb7 100755
--- a/cvscompile.sh
+++ b/cvscompile.sh
@@ -13,7 +13,7 @@ rm -f config.cache
srcdir=`dirname $0`
test -z "$srcdir" && srcdir=.
-m4_files="_xine.m4 alsa.m4 arts.m4 esd.m4 aa.m4 irixal.m4 ogg.m4 vorbis.m4"
+m4_files="_xine.m4 arts.m4 esd.m4 iconv.m4 lcmessage.m4 vorbis.m4 aa.m4 as.m4 gettext.m4 irixal.m4 ogg.m4 alsa.m4 codeset.m4 glibc21.m4 isc-posix.m4 progtest.m4"
if test -d $srcdir/m4; then
rm -f acinclude.m4
for m4f in $m4_files; do
diff --git a/include/xine.h.tmpl.in b/include/xine.h.tmpl.in
index c4b52aa64..f02c51c0d 100644
--- a/include/xine.h.tmpl.in
+++ b/include/xine.h.tmpl.in
@@ -28,7 +28,7 @@
\endverbatim
*/
/*
- * $Id: xine.h.tmpl.in,v 1.70 2001/12/20 16:50:54 miguelfreitas Exp $
+ * $Id: xine.h.tmpl.in,v 1.71 2001/12/27 14:30:29 f1rmb Exp $
*
*/
@@ -1606,10 +1606,13 @@ int xine_get_current_frame (xine_t *self, int *width, int *height,
*/
#define XINE_ASPECT_RATIO_DONT_TOUCH 42
-/* osd stuff */
-typedef struct osd_object_s osd_object_t;
+ /**
+ * \defgroup osd_group OSD section
+ * @{
+ */
+typedef struct osd_object_s osd_object_t;
typedef struct osd_renderer_s osd_renderer_t;
typedef struct osd_font_s osd_font_t;
@@ -1708,30 +1711,149 @@ struct osd_renderer_s {
osd_renderer_t *xine_get_osd_renderer (xine_t *self);
-/*
- * xine log functions
- */
-
-#define XINE_LOG_MSG 0
-#define XINE_LOG_CODEC 1
-#define XINE_LOG_NUM 2 /* # of log buffers defined */
+ /** @} end of osd_group */
-const char **xine_get_log_names(void);
-void xine_log (xine_t *self, int buf, const char *format, ...);
+ /**
+ * \defgroup log_group Logging section
+ * @{
+ */
+ /**
+ * \defgroup log_def log defines.
+ * @{
+ */
+/**
+ * \def XINE_LOG_MSG
+ * \sa xine_log()
+*/
+#define XINE_LOG_MSG 0
+/**
+ * \def XINE_LOG_INPUT
+ * \sa xine_log()
+*/
+#define XINE_LOG_INPUT 1
+/**
+ * \def XINE_LOG_DEMUX
+ * \sa xine_log()
+*/
+#define XINE_LOG_DEMUX 2
+/**
+ * \def XINE_LOG_CODEC
+ * \sa xine_log()
+*/
+#define XINE_LOG_CODEC 3
+/**
+ * \def XINE_LOG_VIDEO
+ * \sa xine_log()
+*/
+#define XINE_LOG_VIDEO 4
+/**
+ * \def XINE_LOG_METRONOM
+ * \sa xine_log()
+*/
+#define XINE_LOG_METRONOM 5
+/**
+ * \def XINE_LOG_PLUGIN
+ * \sa xine_log()
+*/
+#define XINE_LOG_PLUGIN 6
+/**
+ * \def XINE_LOG_NUM
+ * number of log buffers defined *
+ * \sa xine_log()
+*/
+#define XINE_LOG_NUM 7
+ /** @} end of log_def */
+/**
+ * \fn unsigned int xine_get_log_section_count(void)
+ * \brief return number of available buffers.
+ * \sa xine_get_log_names(), xine_log(), xine_get_log()
+ */
+unsigned int xine_get_log_section_count(void);
+/**
+ * \fn const char **xine_get_log_names(void)
+ * \brief return a NULL terminated array of log sections names.
+ * \sa xine_get_log_section_count(), xine_log(), xine_get_log()
+ */
+const char **xine_get_log_names(void);
+/**
+ * \fn void xine_log (xine_t *self, int buf, const char *format, ...)
+ * \param self xine object.
+ * \param buf buffer section (#see @ref log_def)
+ * \brief write message to buffer 'buf'.
+ *
+ */
+void xine_log (xine_t *self, int buf, const char *format, ...);
+/**
+ * \fn char **xine_get_log (xine_t *self, int buf)
+ * \param self xine object.
+ * \param buf buffer section (#see @ref log_def)
+ * \return an array of char, NULL terminated.
+ * \brief return a message array from buffer 'buf' (#see @ref log_def)
+ *
+ */
char **xine_get_log (xine_t *self, int buf);
-/*
- * xine error reporting
- */
+ /** @} end of log_group */
+
+ /**
+ * \defgroup error_group Error reporting.
+ * @{
+ */
+ /**
+ * \defgroup error_def error defines.
+ * @{
+ */
+/**
+ * \def XINE_ERROR_NONE
+ * No error reported.
+ * \sa xine_get_error()
+*/
#define XINE_ERROR_NONE 0
+/**
+ * \def XINE_ERROR_NO_INPUT_PLUGIN
+ * No input plugin found to handle a stream type.
+ * \sa xine_get_error()
+*/
#define XINE_ERROR_NO_INPUT_PLUGIN 1
+/**
+ * \def XINE_ERROR_NO_DEMUXER_PLUGIN
+ * No demuxer plugin found to handle a stream type.
+ * \sa xine_get_error()
+*/
#define XINE_ERROR_NO_DEMUXER_PLUGIN 2
+ /** @} end of error_def */
+
+/**
+ * \fn int xine_get_error (xine_t *self)
+ * \param self xine object.
+ * \return return last error (#see @ref error_def)
+ * \brief return the last error.
+ *
+ */
int xine_get_error (xine_t *self);
+ /** @} end of error_group */
+
+
+ /**
+ * \defgroup locale_group localisation.
+ * @{
+ */
+/**
+ * \fn char *xine_set_locale(void)
+ * \return current locale.
+ * \brief prepare and setup localization for xine-lib usage.
+ * This function should be called BEFORE xine_init() ( #see xine_init() )
+ *
+ */
+char *xine_set_locale(void);
+
+ /** @} end of locale_group */
+
/** @} end of xine_api */
#ifdef __cplusplus
diff --git a/intl/ChangeLog b/intl/ChangeLog
new file mode 100644
index 000000000..61f063bdf
--- /dev/null
+++ b/intl/ChangeLog
@@ -0,0 +1,1765 @@
+2001-07-24 Bruno Haible <haible@clisp.cons.org>
+
+ * gettext-0.10.39 released.
+
+2001-06-24 Bruno Haible <haible@clisp.cons.org>
+
+ * config.charset: Change canonical name of BIG5HKSCS to BIG5-HKSCS.
+ Change canonical name of SJIS to SHIFT_JIS.
+
+2001-06-12 Bruno Haible <haible@clisp.cons.org>
+
+ * dcigettext.c (DCIGETTEXT): Release the lock before returning.
+
+2001-04-30 Bruno Haible <haible@clisp.cons.org>
+
+ Silence "gcc -Wall -Wwrite-strings" warnings.
+ * localcharset.c (charset_aliases): Change type to 'const char *'.
+ (get_charset_aliases): Change type of 'cp' to 'const char *'.
+
+2001-05-23 Bruno Haible <haible@clisp.cons.org>
+
+ * gettext-0.10.38 released.
+
+2001-05-22 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (install-data): Install plural.c as well.
+ (uninstall): Uninstall plural.c as well.
+
+2001-05-18 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (dist): Don't assume $(srcdir) = ".". Distribute
+ file in either current directory or $(srcdir), whichever exists.
+
+2001-05-11 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (install-exec): Don't install charset.alias on glibc 2.1
+ systems.
+
+2001-04-30 Bruno Haible <haible@clisp.cons.org>
+
+ * dcigettext.c (getuid, getgid, geteuid, getegid): Provide default
+ definitions. Needed for mingw32.
+
+2001-04-19 Bruno Haible <haible@clisp.cons.org>
+
+ * gettext-0.10.37 released.
+
+2001-04-19 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (LTV_CURRENT, LTV_REVISION, LTV_AGE): Bump to 1:1:0.
+
+2001-04-19 Bruno Haible <haible@clisp.cons.org>
+
+ * loadmsgcat.c (_nl_init_domain_conv): Don't append //TRANSLIT when
+ the libiconv version is smaller than 1.5.
+
+2001-04-09 Bruno Haible <haible@clisp.cons.org>
+
+ * loadmsgcat.c: Don't use GNU C extensions if __APPLE_CC__ is defined.
+ Apple's MacOS X compiler has not all the features that the regular
+ GCC with the same version number has.
+
+2001-04-07 Bruno Haible <haible@clisp.cons.org>
+
+ * gettextP.h (struct loaded_domain): Add codeset_cntr field.
+ (struct binding): Add codeset_cntr field.
+ (_nl_load_domain): Add domainbinding argument.
+ (_nl_init_domain_conv, _nl_free_domain_conv): New declarations.
+ (_nl_find_msg): New declaration, moved here from loadinfo.h.
+ * loadinfo.h (struct loaded_l10nfile): Remove domainbinding field.
+ (_nl_make_l10nflist): Remove domainbinding argument.
+ (_nl_find_msg): Move declaration to gettextP.h.
+ * bindtextdom.c (set_binding_values): Initialize ->codeset_cntr to 0.
+ Increment it when ->codeset is changed.
+ * dcigettext.c (DCIGETTEXT): Pass binding to _nl_find_msg.
+ (_nl_find_msg): Add domainbinding argument. Reinitialize the converter
+ if domainbinding->codeset_cntr has been incremented.
+ * finddomain.c (_nl_find_domain): Don't pass domainbinding to
+ _nl_make_l10nflist(). Pass it to _nl_load_domain() instead.
+ * l10nflist.c (_nl_make_l10nflist): Remove domainbinding argument.
+ * loadmsgcat.c (_nl_init_domain_conv): New function, extracted from
+ _nl_load_domain. Append //TRANSLIT also when using libiconv.
+ (_nl_free_domain_conv): New function, extracted from _nl_unload_domain.
+ (_nl_load_domain): Add domainbinding argument. Call
+ _nl_init_domain_conv.
+ (_nl_unload_domain): Call _nl_free_domain_conv.
+
+2001-04-09 Bruno Haible <haible@clisp.cons.org>
+
+ * dcigettext.c (HAVE_LOCALE_NULL): Don't define if __GNU_LIBRARY__ < 2
+ (Linux libc5).
+
+2001-04-04 Bruno Haible <haible@clisp.cons.org>
+
+ * dcigettext.c (HAVE_LOCALE_NULL): Define also if __GNU_LIBRARY__.
+
+2001-04-04 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (libdir, includedir, datadir): Use the autoconf
+ determined value, in order to respect the configure arguments.
+ (gettextsrcdir): Use $(datadir), not @datadir@.
+
+2001-03-29 Bruno Haible <haible@clisp.cons.org>
+
+ * gettext-0.10.36 released.
+
+2001-03-25 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (install-data): Set execution bits on installed
+ config.charset.
+
+2001-03-23 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (YACC): Use @INTLBISON@ instead of bison.
+
+2001-03-21 Bruno Haible <haible@clisp.cons.org>
+
+ * dcigettext.c (_nl_state_lock): Mark as #ifdef _LIBC. AIX 3 xlc
+ chokes on empty macro arguments.
+ * plural.y: Add #pragma for alloca on AIX 3.
+
+2001-03-20 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (DISTFILES.generated): New variable.
+ (DISTFILES.gettext): Remove plural.c.
+ (dist): Use DISTFILES.generated.
+ (YACC): Use "bison -y" instead of @YACC@.
+ Needed for "make dist" to work in normal packages.
+
+2001-03-20 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (dist): Don't depend on $(DISTFILES). Instead, generate
+ the files to be distributed through a recursive 'make' call.
+
+2001-03-17 Bruno Haible <haible@clisp.cons.org>
+
+ * gettextP.h (struct expression): Add operators lnot, less_than,
+ greater_than, less_or_equal, greater_or_equal. Replace args2/args3
+ union by a 'nargs' counter and an 'args[]' array.
+ * plural.y: Don't include stdarg.h.
+ (new_exp): New function.
+ (new_exp_0, new_exp_2, new_exp_3): Rewritten to call new_exp.
+ (new_exp_1): New function.
+ ('?' ':'): Make right-associative.
+ (EQUOP2): New token, replaces '=' and '!'.
+ (CMPOP2): New token.
+ (ADDOP2): New token, replaces '+' and '-'.
+ (MULOP2): New token, replaces '*', '/' and '%'.
+ ('!'): New token.
+ (exp): Add rules for CMPOP2 and '!'. Don't call YYABORT.
+ (start): Call YYABORT here.
+ (FREE_EXPRESSION): Update.
+ (yylex): Don't skip "\\n". Recognize comparison and '!' operators.
+ Update for new token symbols.
+ * loadmsgcat.c (plvar, plone, germanic_plural, init_germanic_plural):
+ Update.
+ * dcigettext.c (_nl_find_msg): Optimize for space.
+ (plural_eval): Recognize comparison and '!' operators. Optimize for
+ space.
+
+ * dcigettext.c (transcmp): New declaration.
+
+2001-03-10 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (libintl.la): Pass -liconv and flag -no-undefined.
+ Needed on platforms like BeOS.
+
+ * Makefile.in (all-no-yes): Depend on libgnuintl.$la, not libintl.$la.
+ (libgnuintl.a, libgnuintl.la): New targets. Needed for linking
+ ../tests/tstgettext on systems which have gettext() in libintl.so.
+
+ * localcharset.c (locale_charset): Allow wildcard syntax. Resolve
+ alias also if codeset is empty.
+ * config.charset (BeOS): Use wildcard syntax.
+
+ * loadmsgcat.c (_nl_load_domain): locale_charset() doesn't return NULL
+ any more.
+
+2001-03-09 Bruno Haible <haible@clisp.cons.org>
+
+ * config.charset: Update from libiconv-1.6.
+ * localcharset.c: Likewise.
+
+2001-02-25 Ulrich Drepper <drepper@redhat.com>
+
+ * locale.alias: Don't use nb_NO but define aliases for it.
+
+2001-01-26 Ulrich Drepper <drepper@redhat.com>
+
+ * loadmsgcat.c: Include <locale.h> for _LIBC.
+
+2001-03-09 Bruno Haible <haible@clisp.cons.org>
+
+ * dcigettext.c (transmem_block_t): Change to unsigned char, to avoid
+ compiler warning.
+ (_nl_find_msg): Add casts to avoid compiler warnings.
+
+2001-03-09 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (DISTFILES.common): Remove ChangeLog.
+ (DISTFILES.obsolete): New variable.
+ (install-data): Install ChangeLog.inst as ChangeLog. Remove the files
+ listed in DISTFILES.obsolete.
+ (uninstall): Simplify.
+ (distclean): Remove ChangeLog.inst.
+ (dist): Mention ChangeLog explicitly.
+
+2001-03-04 Bruno Haible <haible@clisp.cons.org>
+
+ * dcigettext.c (ISSLASH, HAS_DEVICE, IS_ABSOLUTE_PATH,
+ IS_PATH_WITH_DIR): New macros.
+ (DCIGETTEXT): Use IS_ABSOLUTE_PATH and IS_PATH_WITH_DIR. Increment
+ path_max proportionally.
+ * loadinfo.h (PATH_SEPARATOR): New macro.
+ * l10nflist.c (_nl_make_l10nflist): Use PATH_SEPARATOR instead of ':'.
+ * localealias.c (_nl_expand_alias): Likewise.
+ * libgnuintl.h (gettext) [DJGPP]: Define as a macro as well.
+
+2001-03-06 Bruno Haible <haible@clisp.cons.org>
+
+ * libgnuintl.h (LC_MESSAGES): Don't define on Solaris.
+
+2001-02-24 Bruno Haible <haible@clisp.cons.org>
+
+ * dcigettext.c: Update comment about HAVE_LOCALE_NULL.
+
+2001-02-05 Bruno Haible <haible@clisp.cons.org>
+
+ * libgnuintl.h (LC_MESSAGES): Provide a default value.
+
+2001-01-30 Bruno Haible <haible@clisp.cons.org>
+
+ * config.charset: Update for FreeBSD 4.2.
+
+2001-01-21 Bruno Haible <haible@clisp.cons.org>
+
+ Use libtool.
+ * Makefile.in (l): Use INTL_LIBTOOL_SUFFIX_PREFIX instead of l.
+ (all-no): When USE_INCLUDED_LIBINTL is 'no' but BUILD_INCLUDED_LIBINTL
+ is 'yes', still build libintl.$la because the testsuite needs it.
+ (libintl.la): Add $(CPPFLAGS) $(CFLAGS) $(XCFLAGS). Linking via $(CC)
+ must use all $(CFLAGS).
+ (install-exec): Use libtool to install libintl.$la.
+ (uninstall): Use libtool to uninstall libintl.$la.
+ (mostlyclean): Remove *.la and the .libs subdir.
+ * intl-compat.c: Reorder. Add comment.
+
+2001-01-20 Bruno Haible <haible@clisp.cons.org>
+
+ * loadmsgcat.c (O_BINARY): Define on platforms that don't have it.
+ (_nl_load_domain): Open the catalog file in binary mode.
+
+2001-01-24 Bruno Haible <haible@clisp.cons.org>
+
+ * gettextP.h (SWAP): Remove declaration, to work around a compilation
+ failure on alphaev5-cray-unicosmk2.0.5.X.
+
+2001-01-15 Bruno Haible <haible@clisp.cons.org>
+
+ * dcigettext.c (_nl_find_msg): Cast the second iconv() arg, to avoid
+ a warning.
+
+2001-01-07 Bruno Haible <haible@clisp.cons.org>
+
+ * gettextP.h (__gettextdebug): Remove declaration.
+ (gettext_free_exp__, gettextparse__): New non-libc declarations.
+ * plural.y [!_LIBC]: Define gettextparse__, gettext_free_exp__, not
+ __gettextparse, __gettext_free_exp.
+ * loadmsgcat.c [!_LIBC]: Use gettextparse__, not __gettextparse.
+
+2001-01-07 Bruno Haible <haible@clisp.cons.org>
+
+ * libgnuintl.h: Renamed from intlh.inst.in.
+ Remove comment about __builtin_constant_p.
+ (gettext): Use NULL.
+ * libgettext.h: Completely rewritten. Now a conditional wrapper around
+ <libintl.h>. Keep the handling of ENABLE_NLS and gettext_noop, remove
+ everything else.
+ * gettextP.h: Include gettext.h, for nls_uint32.
+ (gettext__, dgettext__, dcgettext__, textdomain__, bindtextdomain__,
+ bind_textdomain_codeset__): New declarations, from old libgettext.h.
+ * gettext.h: Don't include <stdio.h>.
+ * Makefile.in (HEADERS): Add libgnuintl.h.
+ (DISTFILES.gettext): Remove intlh.inst.in.
+ (all-yes): Depend on libintl.h instead of intlh.inst.
+ (libintl.h): New target. Create as a copy of libgnuintl.h.
+ (intlh.inst): Remove target.
+ (install-exec): Update.
+ ($(OBJECTS): Depend on libgnuintl.h, not libgettext.h.
+ (mostlyclean): Remove libintl.h instead of intlh.inst.
+ (dist-libc): Remove target.
+ * bindtextdom.c: Include libgnuintl.h instead of libgettext.h. Don't
+ include gettext.h.
+ * dcgettext.c: Likewise.
+ * dcigettext.c: Likewise.
+ * dcngettext.c: Likewise.
+ * dngettext.c: Likewise.
+ * finddomain.c: Likewise.
+ * ngettext.c: Likewise.
+ * textdomain.c: Likewise.
+ * dgettext.c: Include libgnuintl.h instead of libgettext.h. Include
+ gettextP.h.
+ * gettext.c: Likewise.
+ * intl-compat.c: Likewise.
+ * localealias.c: Don't include gettext.h.
+ * plural.y: Likewise.
+
+2001-01-07 Bruno Haible <haible@clisp.cons.org>
+
+ Assume <stddef.h>, <stdlib.h>, <string.h>, <locale.h> exist.
+ * intlh.inst.in: Likewise.
+ * libgettext.h: Likewise.
+ * gettextP.h: Likewise.
+ * bindtextdom.c: Likewise.
+ * dcigettext.c: Likewise.
+ * dgettext.c: Likewise.
+ * dngettext.c: Likewise.
+ * explodename.c: Likewise.
+ * finddomain.c: Likewise.
+ * gettext.c: Likewise.
+ * l10nflist.c: Likewise.
+ * loadmsgcat.c: Likewise.
+ * localealias.c: Likewise.
+ * ngettext.c: Likewise.
+ * textdomain.c: Likewise.
+
+2001-01-06 Bruno Haible <haible@clisp.cons.org>
+
+ Remove catgets fallback code.
+ - It does not handle message clash prevention through domains and
+ dgettext().
+ - It does not handle message catalog inheritance and the LANGUAGE
+ environment variable.
+ - It does not handle locale aliases.
+ - It does not handle automatic charset conversion.
+ - It does not handle plural form handling and ngettext().
+ - It uses a slow string to integer conversion.
+ - It is sensitive against installation problems.
+ * cat-compat.c: Remove file.
+ * po2msg.sin, po2tbl.sin: Remove files.
+ * Makefile.in (datadir): Assume DATADIRNAME = share.
+ (SOURCES): Remove cat-compat.c.
+ (DISTFILES.common): Remove po2msg.sin, po2tbl.sin.
+ (distclean): No need to remove po2msg.sed, po2tbl.sed.
+ (../po/cat-id-tbl.$lo): Remove rule.
+ * libgettext.h (_msg_ent): Remove.
+ (_msg_tbl, _msg_tbl_length): Remove declarations.
+ (gettext, dgettext, ngettext, dngettext): Don't depend on
+ !HAVE_CATGETS.
+
+2001-01-04 Ulrich Drepper <drepper@redhat.com>
+
+ * plural.y (yylex): Minimal improvement in number scanner.
+
+2001-01-02 Ulrich Drepper <drepper@redhat.com>
+
+ * dcigettext.c (guess_category_value): Rewrite so that LANGUAGE value
+ is ignored if the selected locale is the C locale.
+
+2000-11-20 Ulrich Drepper <drepper@redhat.com>
+
+ * dcigettext.c (transcmp): Make s1 and s2 const.
+ * loadmsgcat.c (_nl_load_domain): Rearrange domain initialization to
+ avoid warning.
+
+2000-11-09 Ulrich Drepper <drepper@redhat.com>
+
+ * locale.alias: Add thai.
+ Patch by Chanop Silpa-Anan <chanop@syseng.anu.edu.au>.
+
+2001-01-05 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (INCLUDES): Remove reference to $(top_srcdir)/lib.
+ (.SUFFIXES): Put .c before .y, so that Solaris "make" uses the .c.o
+ rule, not the builtin .y.o rule.
+ (.y.c): Use $< instead of $^. $^ is not supported by SUSV2 "make"
+ specification. Remove $*.h explicitly: we don't need plural.h.
+ * gettextP.h: Include <stddef.h>.
+ (__gettext_free_exp, __gettextparse): Convert prototype to K&R C
+ syntax.
+ * bindtextdom.c (offsetof): Provide fallback for platforms that lack
+ it, like SunOS4.
+ (set_binding_values): Convert prototype to K&R C syntax.
+ * cat-compat.c: Include stdlib.h, string.h whenever possible.
+ * dcigettext.c: Ignore the value of C_ALLOCA, because libintl.a
+ must not depend on external .o files.
+ (offsetof): Provide fallback for platforms that lack it, like SunOS4.
+ (transcmp): Convert to K&R C syntax.
+ * explodename.c Include stdlib.h whenever possible.
+ (_nl_find_language): Convert to K&R C syntax.
+ * finddomain.c: Include stdlib.h whenever possible.
+ * l10nflist.c Include stdlib.h whenever possible.
+ (_nl_normalize_codeset): Use tolower, not _tolower.
+ * loadmsgcat.c: Include stdlib.h whenever possible.
+ Include headers needed for alloca().
+ (freea): New macro.
+ (_nl_load_domain): Add fallback code for platforms lacking strtoul,
+ like SunOS4. Add fallback code for platforms lacking alloca.
+ * localealias.c: Include stdlib.h whenever possible.
+ (ADD_BLOCK, FREE_BLOCK): Remove macros.
+ (freea): New macro.
+ (read_alias_file): Simplify fallback code for platforms lacking alloca.
+ * plural.y (new_exp_0, new_exp_2, new_exp_3): New functions.
+ (new_exp): Remove function.
+ (__gettext_free_exp, yylex, yyerror): Convert to K&R C syntax.
+ * textdomain.c: Include stdlib.h whenever possible.
+ * gettext.c: Likewise.
+ * ngettext.c: Likewise.
+ * localcharset.c (volatile): Define to empty if not using ANSI C.
+
+2001-01-01 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (mostlyclean): Remove intlh.inst, charset.alias,
+ ref-add.sed, ref-del.sed.
+ (distclean): In the gettext package, remove VERSION.
+
+2001-01-01 Bruno Haible <haible@clisp.cons.org>
+
+ Finish implementation of plural form handling.
+ * dcigettext.c (known_translation_t): Rename 'domain' field to
+ 'domainname'. Remove 'plindex' field. Add 'domain' and
+ 'translation_length' fields.
+ (transcmp): Don't compare 'plindex' fields.
+ (plural_lookup): New function.
+ (DCIGETTEXT): Change cache handing in the plural case. Don't call
+ plural_eval before the translation and its catalog file have been
+ found. Remove plindex from cache key. Add 'translation_length' and
+ 'domain' to cache result.
+ (_nl_find_msg): Remove index argument, return length of translation
+ to the caller instead. Weaken comparison of string lengths, to account
+ for plural entries. Call iconv() on the entire result string, not
+ only on the portion needed so far.
+ * loadinfo.h (_nl_find_msg): Remove index argument, add lengthp
+ argument.
+ * loadmsgcat.c (_nl_load_domain): Adapt to _nl_find_msg change.
+
+ * intl-compat.c (dcngettext, dngettext, ngettext): New functions.
+ * libgettext.h (ngettext__, dngettext__, dcngettext__): New
+ declarations.
+ (ngettext, dngettext): Add missing macro argument.
+
+ * intlh.inst.in (ngettext, dngettext): Add missing macro argument.
+
+2000-12-31 Bruno Haible <haible@clisp.cons.org>
+
+ * gettextP.h (ZERO): New macro.
+ (struct binding): Always use ZERO.
+ * bindtextdom.c (set_binding_values): Use offsetof, not sizeof.
+ Include <stddef.h> whenever possible.
+ * dcigettext.c (ZERO): Remove macro.
+ (struct transmem_list): Use ZERO.
+ (DCIGETTEXT): Use offsetof, not sizeof.
+ Include <stddef.h> whenever possible.
+
+ * config.charset: Update from libiconv-1.5.1.
+ * localcharset.c: Likewise.
+
+2000-12-30 Bruno Haible <haible@clisp.cons.org>
+
+ * locale.alias: New file, moved here from ../misc/locale.alias. Add
+ "Packages using this file" line.
+ * Makefile.in (DISTFILES.common): Add locale.alias.
+ (install-exec, uninstall): Install/deinstall locale.alias.
+
+2000-10-30 Ulrich Drepper <drepper@redhat.com>
+
+ * dcigettext.c (guess_category_value): For libc always use the
+ setlocale() method.
+
+2000-10-20 Ulrich Drepper <drepper@redhat.com>
+
+ * libintl.glibc (ngettext macro): Add missing parameter.
+ (dngettext macro): Likewise.
+
+2000-10-14 Ulrich Drepper <drepper@redhat.com>
+
+ * localealias.c (read_alias_file): Update string pointers in map[]
+ if realloc() changed the values.
+ Patch by Jakub Jelinek <jakub@redhat.com>.
+
+2000-08-31 Ulrich Drepper <drepper@redhat.com>
+
+ * loadmsgcat.c: Use *stat64 instead of *stat internally.
+
+ * dcigettext.c (free_mem): Correct freeing of _nl_domain_bindings
+ list.
+
+2000-08-27 Ulrich Drepper <drepper@redhat.com>
+
+ * dcigettext.c (DCIGETTEXT): Remove _nl_find_language in code to
+ determine invalid locale name.
+
+2000-08-20 Ulrich Drepper <drepper@redhat.com>
+
+ * dcigettext.c: Unify use of function aliases to make more compact
+ PLT.
+
+ * loadmsgcat.c (_nl_unload_domain): Also free conv_tab element.
+ Pretty printing.
+ * plural.y (new_exp): Take number of optional parameters in second
+ parameter. Test for correct number of parameters and free correctly
+ in case of failure. Adjust all callers.
+ (yylex): Fix handling of '\0'. Allow ';' as terminator character.
+
+2000-07-14 Bruno Haible <haible@clisp.cons.org>
+
+ * dcigettext.c (dcigettext): Call plural_eval on all platforms, not
+ only those having tsearch.
+
+2000-06-30 Ulrich Drepper <drepper@redhat.com>
+
+ * dcigettext.c (_nl_find_msg): Correct reallocation of buffers in
+ case the translation is too large. Remember allocated memory blocks
+ in a list.
+ (free_mem): Free memory for translations.
+
+2000-06-16 Ulrich Drepper <drepper@redhat.com>
+
+ * loadmsgcat.c (_nl_load_domain): Call norm_add_slashes with new
+ parameter to always enable transliteration.
+
+1998-10-20 Paul Eggert <eggert@twinsun.com>
+
+ * po2tbl.sin: Escape trigraphs.
+
+2000-10-12 Bruno Haible <haible@clisp.cons.org>
+
+ * finddomain.c: Remove unneeded includes.
+
+2000-10-12 Bruno Haible <haible@clisp.cons.org>
+
+ * localealias.c (memcpy): Return first argument, just like the real
+ memcpy function does.
+ * bindtextdom.c (memcpy): Likewise.
+ * finddomain.c (memcpy): Likewise.
+ * l10nflist.c (memcpy): Likewise.
+ * textdomain.c (memcpy): Likewise.
+ From Paul Eggert <eggert@twinsun.com>.
+
+2000-09-29 Bruno Haible <haible@clisp.cons.org>
+
+ * libintl.glibc: Update from current glibc version.
+
+2000-09-18 Bruno Haible <haible@clisp.cons.org>
+
+ * dcigettext.c: Outside libc, use local variable names that don't
+ clash with those in libc.
+ * bindtextdom.c: Likewise.
+ * textdomain.c: Likewise.
+
+2000-07-31 Bruno Haible <haible@clisp.cons.org>
+
+ * plural.y: Include config.h. Needed to define 'inline' away for C
+ compilers that don't support it.
+ (yylex): Don't use gcc specific case range syntax.
+ * loadmsgcat.y (INIT_GERMANIC_PLURAL): New macro, for old compilers.
+
+2000-07-28 Bruno Haible <haible@clisp.cons.org>
+
+ Simplification: In all cases where $(gnulocaledir) is used, it is
+ identical to $(localedir).
+ * Makefile.in (DEFS): Remove setting for GNULOCALEDIR.
+ * dcigettext.c (_nl_default_dirname): Initialize with LOCALEDIR.
+
+2000-07-28 Bruno Haible <haible@clisp.cons.org>
+
+ * xopen-msg.sed: Renamed to ...
+ * po2msg.sin: ... here.
+ * linux-msg.sed: Remove file.
+ * Makefile.in (DISTFILES.common): Update.
+
+2000-07-28 Bruno Haible <haible@clisp.cons.org>
+
+ * po2tbl.sed.in: Renamed to ...
+ * po2tbl.sin: ... here.
+ * Makefile.in (DISTFILES.common): Update.
+
+2000-07-28 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (uninstall): Synchronize with the install target.
+ Really remove charset.alias when its reference count drops to 0.
+
+2000-07-28 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (mkinstalldirs): New macro. Needed when configured with
+ --srcdir=<relative pathname>; then ac_aux_dir will be a relative
+ pathname rooted at the top builddir, and @MKINSTALLDIRS@ likewise.
+ (install-exec, install-data): Use it.
+
+2000-07-26 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (install-exec, install-data): Use $(SHELL) for calling
+ $(MKINSTALLDIRS), don't rely on its execution permissions.
+
+ * Makefile.in (LTV_CURRENT, LTV_REVISION, LTV_AGE): New variables.
+ (libintl.la): Use them.
+
+ * Makefile.in (install-exec, install-data, uninstall): Provide DESTDIR
+ support, as recommended by GNU standards. Fix misapplied 2000-06-16
+ patch.
+
+2000-06-16 Bruno Haible <haible@clisp.cons.org>
+
+ * Makefile.in (COMSRCS): Add localcharset.c.
+ (OBJECTS): Add localcharset.$lo.
+ (DISTFILES.common): Add config.charset, ref-{add,del}.sin.
+ (DEFS): Add -DLIBDIR.
+ (all-yes): Add charset.alias, ref-{add,del}.sed.
+ (.SUFFIXES): Add .sin and .sed.
+ (.sin.sed, charset.alias): New rules.
+ (install-exec, uninstall): Install/deinstall charset.alias.
+ * localcharset.c: New file, from fileutils-4.0u.
+ * config.charset: New file, from fileutils-4.0u.
+ * red-add.sin, ref-del.sin: New files, from fileutils-4.0u.
+
+ * intlh.inst.in (bind_textdomain_codeset): New declaration.
+ * libgettext.h (bind_textdomain_codeset, bind_textdomain_codeset__):
+ New declarations.
+ (bind_textdomain_codeset) [!ENABLE_NLS]: New macro.
+ * cat-compat.c (bind_textdomain_codeset): New function.
+ * intl-compat.c (bind_textdomain_codeset): New function.
+
+ * libgettext.h (ngettext, dngettext, dcngettext): New
+ declarations.
+ (dcgettext): Remove macro definition.
+ (textdomain, bindtextdomain) [!ENABLE_NLS]: Parenthesize argument.
+ * intlh.inst.in (ngettext, dngettext, dcngettext): New
+ declarations.
+ (dcgettext): Remove macro definition.
+
+ * *.h, *.c, *.y: Change copyright notice from LGPL to GPL.
+
+2000-05-21 Ulrich Drepper <drepper@redhat.com>
+
+ * dcigettext.c: Fix typo in comment.
+
+2000-05-08 Andreas Jaeger <aj@suse.de>
+
+ * bindtextdom.c (set_binding_values): Add prototype.
+
+2000-05-05 Bruno Haible <haible@clisp.cons.org>
+
+ * dcigettext.c (alignof): New macro.
+ (_nl_find_msg): Use it instead of __alignof__. Pass correct output
+ buffer length to __gconv/iconv. If malloc (freemem_size) fails, set
+ freemem_size to 0.
+
+2000-05-05 Bruno Haible <haible@clisp.cons.org>
+
+ * dcigettext.c (dcigettext): Fix interpretation of tsearch
+ return value.
+
+2000-05-06 Ulrich Drepper <drepper@redhat.com>
+
+ * dcigettext.c (DCIGETTEXT): Always define local variable `index'.
+ (mempcpy): Correct typo in parameter list.
+
+ * hash-string.h: Don't include <values.h>.
+
+ * *.c, *.h, *.y: Update from glibc version.
+
+1998-04-29 Paul Eggert <eggert@twinsun.com>
+
+ * Makefile.in (aliaspath): Don't put `.' at the end.
+
+1998-06-01 Ulrich Drepper <drepper@cygnus.com>
+
+ * localealias.c (read_alias_file): Undo last change.
+ * l10nflist.c (_nl_normalize_codeset): Likewise.
+ * loadinfo.h: Likewise.
+
+1998-05-23 Ulrich Drepper <drepper@cygnus.com>
+
+ * dcgettext.c: Don't use any alloca hack when C_ALLOCA is defined.
+
+1998-05-01 08:47 Ulrich Drepper <drepper@cygnus.com>
+
+ * gettext-0.10.35 released.
+
+1998-04-29 Ulrich Drepper <drepper@cygnus.com>
+
+ * intl/localealias.c (read_alias_file): Use unsigned char for
+ local variables. Remove unused variable tp.
+ * intl/l10nflist.c (_nl_normalize_codeset): Use unsigned char *
+ for type of codeset. For loosing Solaris systems.
+ * intl/loadinfo.h: Adapt prototype of _nl_normalize_codeset.
+ * intl/bindtextdom.c (BINDTEXTDOMAIN): Don't define local variable
+ len if not needed.
+ Patches by Jim Meyering.
+
+1998-04-28 Ulrich Drepper <drepper@cygnus.com>
+
+ * loadmsgcat.c (_nl_load_domain): Don't assign the element use_mmap if
+ mmap is not supported.
+
+ * hash-string.h: Don't include <values.h>.
+
+1998-04-27 Ulrich Drepper <drepper@cygnus.com>
+
+ * textdomain.c: Use strdup is available.
+
+ * localealias.c: Define HAVE_MEMPCPY so that we can use this
+ function. Define and use semapahores to protect modfication of
+ global objects when compiling for glibc. Add code to allow
+ freeing alias table.
+
+ * l10nflist.c: Don't assume stpcpy not being a macro.
+
+ * gettextP.h: Define internal_function macri if not already done.
+ Use glibc byte-swap macros instead of defining SWAP when compiled
+ for glibc.
+ (struct loaded_domain): Add elements to allow unloading.
+
+ * Makefile.in (distclean): Don't remove libintl.h here.
+
+ * bindtextdomain.c: Carry over changes from glibc. Use strdup if
+ available.
+
+ * dcgettext.c: Don't assume stpcpy not being a macro. Mark internal
+ functions. Add memory freeing code for glibc.
+
+ * dgettext.c: Update copyright.
+
+ * explodename.c: Include stdlib.h and string.h only if they exist.
+ Use strings.h eventually.
+
+ * finddomain.c: Mark internal functions. Use strdup if available.
+ Add memory freeing code for glibc.
+
+1997-10-10 20:00 Ulrich Drepper <drepper@cygnus.com>
+
+ * libgettext.h: Fix dummy textdomain and bindtextdomain macros.
+ They should return reasonable values.
+ Reported by Tom Tromey <tromey@cygnus.com>.
+
+1997-09-16 03:33 Ulrich Drepper <drepper@cygnus.com>
+
+ * libgettext.h: Define PARAMS also to `args' if __cplusplus is defined.
+ * intlh.inst.in: Likewise.
+ Reported by Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>.
+
+ * libintl.glibc: Update from current glibc version.
+
+1997-09-06 02:10 Ulrich Drepper <drepper@cygnus.com>
+
+ * intlh.inst.in: Reformat copyright.
+
+1997-08-19 15:22 Ulrich Drepper <drepper@cygnus.com>
+
+ * dcgettext.c (DCGETTEXT): Remove wrong comment.
+
+1997-08-16 00:13 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in (install-data): Don't change directory to install.
+
+1997-08-01 14:30 Ulrich Drepper <drepper@cygnus.com>
+
+ * cat-compat.c: Fix copyright.
+
+ * localealias.c: Don't define strchr unless !HAVE_STRCHR.
+
+ * loadmsgcat.c: Update copyright. Fix typos.
+
+ * l10nflist.c: Don't define strchr unless !HAVE_STRCHR.
+ (_nl_make_l10nflist): Handle sponsor and revision correctly.
+
+ * gettext.c: Update copyright.
+ * gettext.h: Likewise.
+ * hash-string.h: Likewise.
+
+ * finddomain.c: Remoave dead code. Define strchr only if
+ !HAVE_STRCHR.
+
+ * explodename.c: Include <sys/types.h>.
+
+ * explodename.c: Reformat copyright text.
+ (_nl_explode_name): Fix typo.
+
+ * dcgettext.c: Define and use __set_errno.
+ (guess_category_value): Don't use setlocale if HAVE_LC_MESSAGES is
+ not defined.
+
+ * bindtextdom.c: Pretty printing.
+
+1997-05-01 02:25 Ulrich Drepper <drepper@cygnus.com>
+
+ * dcgettext.c (guess_category_value): Don't depend on
+ HAVE_LC_MESSAGES. We don't need the macro here.
+ Patch by Bruno Haible <haible@ilog.fr>.
+
+ * cat-compat.c (textdomain): DoN't refer to HAVE_SETLOCALE_NULL
+ macro. Instead use HAVE_LOCALE_NULL and define it when using
+ glibc, as in dcgettext.c.
+ Patch by Bruno Haible <haible@ilog.fr>.
+
+ * Makefile.in (CPPFLAGS): New variable. Reported by Franc,ois
+ Pinard.
+
+Mon Mar 10 06:51:17 1997 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in: Implement handling of libtool.
+
+ * gettextP.h: Change data structures for use of generic lowlevel
+ i18n file handling.
+
+Wed Dec 4 20:21:18 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * textdomain.c: Put parentheses around arguments of memcpy macro
+ definition.
+ * localealias.c: Likewise.
+ * l10nflist.c: Likewise.
+ * finddomain.c: Likewise.
+ * bindtextdom.c: Likewise.
+ Reported by Thomas Esken.
+
+Mon Nov 25 22:57:51 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * textdomain.c: Move definition of `memcpy` macro to right
+ position.
+
+Fri Nov 22 04:01:58 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * finddomain.c [!HAVE_STRING_H && !_LIBC]: Define memcpy using
+ bcopy if not already defined. Reported by Thomas Esken.
+ * bindtextdom.c: Likewise.
+ * l10nflist.c: Likewise.
+ * localealias.c: Likewise.
+ * textdomain.c: Likewise.
+
+Tue Oct 29 11:10:27 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in (libdir): Change to use exec_prefix instead of
+ prefix. Reported by Knut-HåvardAksnes <etokna@eto.ericsson.se>.
+
+Sat Aug 31 03:07:09 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * l10nflist.c (_nl_normalize_codeset): We convert to lower case,
+ so don't prepend uppercase `ISO' for only numeric arg.
+
+Fri Jul 19 00:15:46 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * l10nflist.c: Move inclusion of argz.h, ctype.h, stdlib.h after
+ definition of _GNU_SOURCE. Patch by Roland McGrath.
+
+ * Makefile.in (uninstall): Fix another bug with `for' loop and
+ empty arguments. Patch by Jim Meyering. Correct name os
+ uninstalled files: no intl- prefix anymore.
+
+ * Makefile.in (install-data): Again work around shells which
+ cannot handle mpty for list. Reported by Jim Meyering.
+
+Sat Jul 13 18:11:35 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in (install): Split goal. Now depend on install-exec
+ and install-data.
+ (install-exec, install-data): New goals. Created from former
+ install goal.
+ Reported by Karl Berry.
+
+Sat Jun 22 04:58:14 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in (MKINSTALLDIRS): New variable. Path to
+ mkinstalldirs script.
+ (install): use MKINSTALLDIRS variable or if the script is not present
+ try to find it in the $top_scrdir).
+
+Wed Jun 19 02:56:56 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * l10nflist.c: Linux libc *partly* includes the argz_* functions.
+ Grr. Work around by renaming the static version and use macros
+ for renaming.
+
+Tue Jun 18 20:11:17 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * l10nflist.c: Correct presence test macros of __argz_* functions.
+
+ * l10nflist.c: Include <argz.h> based on test of it instead when
+ __argz_* functions are available.
+ Reported by Andreas Schwab.
+
+Thu Jun 13 15:17:44 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * explodename.c, l10nflist.c: Define NULL for dumb systems.
+
+Tue Jun 11 17:05:13 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * intlh.inst.in, libgettext.h (dcgettext): Rename local variable
+ result to __result to prevent name clash.
+
+ * l10nflist.c, localealias.c, dcgettext.c: Define _GNU_SOURCE to
+ get prototype for stpcpy and strcasecmp.
+
+ * intlh.inst.in, libgettext.h: Move declaration of
+ `_nl_msg_cat_cntr' outside __extension__ block to prevent warning
+ from gcc's -Wnested-extern option.
+
+Fri Jun 7 01:58:00 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in (install): Remove comment.
+
+Thu Jun 6 17:28:17 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in (install): Work around for another Buglix stupidity.
+ Always use an `else' close for `if's. Reported by Nelson Beebe.
+
+ * Makefile.in (intlh.inst): Correct typo in phony rule.
+ Reported by Nelson Beebe.
+
+Thu Jun 6 01:49:52 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * dcgettext.c (read_alias_file): Rename variable alloca_list to
+ block_list as the macro calls assume.
+ Patch by Eric Backus.
+
+ * localealias.c [!HAVE_ALLOCA]: Define alloca as macro using
+ malloc.
+ (read_alias_file): Rename varriabe alloca_list to block_list as the
+ macro calls assume.
+ Patch by Eric Backus.
+
+ * l10nflist.c: Correct conditional for <argz.h> inclusion.
+ Reported by Roland McGrath.
+
+ * Makefile.in (all): Depend on all-@USE_INCLUDED_LIBINTL@, not
+ all-@USE_NLS@.
+
+ * Makefile.in (install): intlh.inst comes from local dir, not
+ $(srcdir).
+
+ * Makefile.in (intlh.inst): Special handling of this goal. If
+ used in gettext, this is really a rul to construct this file. If
+ used in any other package it is defined as a .PHONY rule with
+ empty body.
+
+ * finddomain.c: Extract locale file information handling into
+ l10nfile.c. Rename local stpcpy__ function to stpcpy.
+
+ * dcgettext.c (stpcpy): Add local definition.
+
+ * l10nflist.c: Solve some portability problems. Patches partly by
+ Thomas Esken. Add local definition of stpcpy.
+
+Tue Jun 4 02:47:49 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * intlh.inst.in: Don't depend including <locale.h> on
+ HAVE_LOCALE_H. Instead configure must rewrite this fiile
+ depending on the result of the configure run.
+
+ * Makefile.in (install): libintl.inst is now called intlh.inst.
+ Add rules for updating intlh.inst from intlh.inst.in.
+
+ * libintl.inst: Renamed to intlh.inst.in.
+
+ * localealias.c, dcgettext.c [__GNUC__]: Define HAVE_ALLOCA to 1
+ because gcc has __buitlin_alloca.
+ Reported by Roland McGrath.
+
+Mon Jun 3 00:32:16 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in (installcheck): New goal to fulfill needs of
+ automake's distcheck.
+
+ * Makefile.in (install): Reorder commands so that VERSION is
+ found.
+
+ * Makefile.in (gettextsrcdir): Now use subdirectory intl/ in
+ @datadir@/gettext.
+ (COMSRCS): Add l10nfile.c.
+ (OBJECTS): Add l10nfile.o.
+ (DISTFILES): Rename to DISTFILE.normal. Remove $(DISTFILES.common).
+ (DISTFILE.gettext): Remove $(DISTFILES.common).
+ (all-gettext): Remove goal.
+ (install): If $(PACKAGE) = gettext install, otherwose do nothing. No
+ package but gettext itself should install libintl.h + headers.
+ (dist): Extend goal to work for gettext, too.
+ (dist-gettext): Remove goal.
+
+ * dcgettext.c [!HAVE_ALLOCA]: Define macro alloca by using malloc.
+
+Sun Jun 2 17:33:06 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * loadmsgcat.c (_nl_load_domain): Parameter is now comes from
+ find_l10nfile.
+
+Sat Jun 1 02:23:03 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * l10nflist.c (__argz_next): Add definition.
+
+ * dcgettext.c [!HAVE_ALLOCA]: Add code for handling missing alloca
+ code. Use new l10nfile handling.
+
+ * localealias.c [!HAVE_ALLOCA]: Add code for handling missing
+ alloca code.
+
+ * l10nflist.c: Initial revision.
+
+Tue Apr 2 18:51:18 1996 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (all-gettext): New goal. Same as all-yes.
+
+Thu Mar 28 23:01:22 1996 Karl Eichwalder <ke@ke.central.de>
+
+ * Makefile.in (gettextsrcdir): Define using @datadir@.
+
+Tue Mar 26 12:39:14 1996 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c: Include <ctype.h>. Reported by Roland McGrath.
+
+Sat Mar 23 02:00:35 1996 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c (stpcpy): Rename to stpcpy__ to prevent clashing
+ with external declaration.
+
+Sat Mar 2 00:47:09 1996 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (all-no): Rename from all_no.
+
+Sat Feb 17 00:25:59 1996 Ulrich Drepper <drepper@myware>
+
+ * gettextP.h [loaded_domain]: Array `successor' must now contain up
+ to 63 elements (because of codeset name normalization).
+
+ * finddomain.c: Implement codeset name normalization.
+
+Thu Feb 15 04:39:09 1996 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (all): Define to `all-@USE_NLS@'.
+ (all-yes, all_no): New goals. `all-no' is noop, `all-yes'
+ is former all.
+
+Mon Jan 15 21:46:01 1996 Howard Gayle <howard@hal.com>
+
+ * localealias.c (alias_compare): Increment string pointers in loop
+ of strcasecmp replacement.
+
+Fri Dec 29 21:16:34 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (install-src): Who commented this goal out ? :-)
+
+Fri Dec 29 15:08:16 1995 Ulrich Drepper <drepper@myware>
+
+ * dcgettext.c (DCGETTEXT): Save `errno'. Failing system calls
+ should not effect it because a missing catalog is no error.
+ Reported by Harald K<o:>nig <koenig@tat.physik.uni-tuebingen.de>.
+
+Tue Dec 19 22:09:13 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (Makefile): Explicitly use $(SHELL) for running
+ shell scripts.
+
+Fri Dec 15 17:34:59 1995 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * Makefile.in (install-src): Only install library and header when
+ we use the own implementation. Don't do it when using the
+ system's gettext or catgets functions.
+
+ * dcgettext.c (find_msg): Must not swap domain->hash_size here.
+
+Sat Dec 9 16:24:37 1995 Ulrich Drepper <drepper@myware>
+
+ * localealias.c, libintl.inst, libgettext.h, hash-string.h,
+ gettextP.h, finddomain.c, dcgettext.c, cat-compat.c:
+ Use PARAMS instead of __P. Suggested by Roland McGrath.
+
+Tue Dec 5 11:39:14 1995 Larry Schwimmer <rosebud@cyclone.stanford.edu>
+
+ * libgettext.h: Use `#if !defined (_LIBINTL_H)' instead of `#if
+ !_LIBINTL_H' because Solaris defines _LIBINTL_H as empty.
+
+Mon Dec 4 15:42:07 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (install-src):
+ Install libintl.inst instead of libintl.h.install.
+
+Sat Dec 2 22:51:38 1995 Marcus Daniels <marcus@sysc.pdx.edu>
+
+ * cat-compat.c (textdomain):
+ Reverse order in which files are tried you load. First
+ try local file, when this failed absolute path.
+
+Wed Nov 29 02:03:53 1995 Nelson H. F. Beebe <beebe@math.utah.edu>
+
+ * cat-compat.c (bindtextdomain): Add missing { }.
+
+Sun Nov 26 18:21:41 1995 Ulrich Drepper <drepper@myware>
+
+ * libintl.inst: Add missing __P definition. Reported by Nelson Beebe.
+
+ * Makefile.in:
+ Add dummy `all' and `dvi' goals. Reported by Tom Tromey.
+
+Sat Nov 25 16:12:01 1995 Franc,ois Pinard <pinard@iro.umontreal.ca>
+
+ * hash-string.h: Capitalize arguments of macros.
+
+Sat Nov 25 12:01:36 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (DISTFILES): Prevent files names longer than 13
+ characters. libintl.h.glibc->libintl.glibc,
+ libintl.h.install->libintl.inst. Reported by Joshua R. Poulson.
+
+Sat Nov 25 11:31:12 1995 Eric Backus <ericb@lsid.hp.com>
+
+ * dcgettext.c: Fix bug in preprocessor conditionals.
+
+Sat Nov 25 02:35:27 1995 Nelson H. F. Beebe <beebe@math.utah.edu>
+
+ * libgettext.h: Solaris cc does not understand
+ #if !SYMBOL1 && !SYMBOL2. Sad but true.
+
+Thu Nov 23 16:22:14 1995 Ulrich Drepper <drepper@myware>
+
+ * hash-string.h (hash_string):
+ Fix for machine with >32 bit `unsigned long's.
+
+ * dcgettext.c (DCGETTEXT):
+ Fix horrible bug in loop for alternative translation.
+
+Thu Nov 23 01:45:29 1995 Ulrich Drepper <drepper@myware>
+
+ * po2tbl.sed.in, linux-msg.sed, xopen-msg.sed:
+ Some further simplifications in message number generation.
+
+Mon Nov 20 21:08:43 1995 Ulrich Drepper <drepper@myware>
+
+ * libintl.h.glibc: Use __const instead of const in prototypes.
+
+ * Makefile.in (install-src):
+ Install libintl.h.install instead of libintl.h. This
+ is a stripped-down version. Suggested by Peter Miller.
+
+ * libintl.h.install, libintl.h.glibc: Initial revision.
+
+ * localealias.c (_nl_expand_alias, read_alias_file):
+ Protect prototypes in type casts by __P.
+
+Tue Nov 14 16:43:58 1995 Ulrich Drepper <drepper@myware>
+
+ * hash-string.h: Correct prototype for hash_string.
+
+Sun Nov 12 12:42:30 1995 Ulrich Drepper <drepper@myware>
+
+ * hash-string.h (hash_string): Add prototype.
+
+ * gettextP.h: Fix copyright.
+ (SWAP): Add prototype.
+
+Wed Nov 8 22:56:33 1995 Ulrich Drepper <drepper@myware>
+
+ * localealias.c (read_alias_file): Forgot sizeof.
+ Avoid calling *printf function. This introduces a big overhead.
+ Patch by Roland McGrath.
+
+Tue Nov 7 14:21:08 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c, cat-compat.c: Wrong indentation in #if for stpcpy.
+
+ * finddomain.c (stpcpy):
+ Define substitution function local. The macro was to flaky.
+
+ * cat-compat.c: Fix typo.
+
+ * xopen-msg.sed, linux-msg.sed:
+ While bringing message number to right place only accept digits.
+
+ * linux-msg.sed, xopen-msg.sed: Now that the counter does not have
+ leading 0s we don't need to remove them. Reported by Marcus
+ Daniels.
+
+ * Makefile.in (../po/cat-id-tbl.o): Use $(top_srdir) in
+ dependency. Reported by Marcus Daniels.
+
+ * cat-compat.c: (stpcpy) [!_LIBC && !HAVE_STPCPY]: Define replacement.
+ Generally cleanup using #if instead of #ifndef.
+
+ * Makefile.in: Correct typos in comment. By Franc,ois Pinard.
+
+Mon Nov 6 00:27:02 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (install-src): Don't install libintl.h and libintl.a
+ if we use an available gettext implementation.
+
+Sun Nov 5 22:02:08 1995 Ulrich Drepper <drepper@myware>
+
+ * libgettext.h: Fix typo: HAVE_CATGETTS -> HAVE_CATGETS. Reported
+ by Franc,ois Pinard.
+
+ * libgettext.h: Use #if instead of #ifdef/#ifndef.
+
+ * finddomain.c:
+ Comments describing what has to be done should start with FIXME.
+
+Sun Nov 5 19:38:01 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (DISTFILES): Split. Use DISTFILES with normal meaning.
+ DISTFILES.common names the files common to both dist goals.
+ DISTFILES.gettext are the files only distributed in GNU gettext.
+
+Sun Nov 5 17:32:54 1995 Ulrich Drepper <drepper@myware>
+
+ * dcgettext.c (DCGETTEXT): Correct searching in derived locales.
+ This was necessary since a change in _nl_find_msg several weeks
+ ago. I really don't know this is still not fixed.
+
+Sun Nov 5 12:43:12 1995 Ulrich Drepper <drepper@myware>
+
+ * loadmsgcat.c (_nl_load_domain): Test for FILENAME == NULL. This
+ might mark a special condition.
+
+ * finddomain.c (make_entry_rec): Don't make illegal entry as decided.
+
+ * Makefile.in (dist): Suppress error message when ln failed.
+ Get files from $(srcdir) explicitly.
+
+ * libgettext.h (gettext_const): Rename to gettext_noop.
+
+Fri Nov 3 07:36:50 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c (make_entry_rec):
+ Protect against wrong locale names by testing mask.
+
+ * libgettext.h (gettext_const): Add macro definition.
+ Capitalize macro arguments.
+
+Thu Nov 2 23:15:51 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c (_nl_find_domain):
+ Test for pointer != NULL before accessing value.
+ Reported by Tom Tromey.
+
+ * gettext.c (NULL):
+ Define as (void*)0 instad of 0. Reported by Franc,ois Pinard.
+
+Mon Oct 30 21:28:52 1995 Ulrich Drepper <drepper@myware>
+
+ * po2tbl.sed.in: Serious typo bug fixed by Jim Meyering.
+
+Sat Oct 28 23:20:47 1995 Ulrich Drepper <drepper@myware>
+
+ * libgettext.h: Disable dcgettext optimization for Solaris 2.3.
+
+ * localealias.c (alias_compare):
+ Peter Miller reported that tolower in some systems is
+ even dumber than I thought. Protect call by `isupper'.
+
+Fri Oct 27 22:22:51 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (libdir, includedir): New variables.
+ (install-src): Install libintl.a and libintl.h in correct dirs.
+
+Fri Oct 27 22:07:29 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (SOURCES): Fix typo: intrl.compat.c -> intl-compat.c.
+
+ * po2tbl.sed.in: Patch for buggy SEDs by Christian von Roques.
+
+ * localealias.c:
+ Fix typo and superflous test. Reported by Christian von Roques.
+
+Fri Oct 6 11:52:05 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c (_nl_find_domain):
+ Correct some remainder from the pre-CEN syntax. Now
+ we don't have a constant number of successors anymore.
+
+Wed Sep 27 21:41:13 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (DISTFILES): Add libintl.h.glibc.
+
+ * Makefile.in (dist-libc): Add goal for packing sources for glibc.
+ (COMSRCS, COMHDRS): Splitted to separate sources shared with glibc.
+
+ * loadmsgcat.c: Forget to continue #if line.
+
+ * localealias.c:
+ [_LIBC]: Rename strcasecmp to __strcasecmp to keep ANSI C name
+ space clean.
+
+ * dcgettext.c, finddomain.c: Better comment to last change.
+
+ * loadmsgcat.c:
+ [_LIBC]: Rename fstat, open, close, read, mmap, and munmap to
+ __fstat, __open, __close, __read, __mmap, and __munmap resp
+ to keep ANSI C name space clean.
+
+ * finddomain.c:
+ [_LIBC]: Rename stpcpy to __stpcpy to keep ANSI C name space clean.
+
+ * dcgettext.c:
+ [_LIBC]: Rename getced and stpcpy to __getcwd and __stpcpy resp to
+ keep ANSI C name space clean.
+
+ * libgettext.h:
+ Include sys/types.h for those old SysV systems out there.
+ Reported by Francesco Potorti`.
+
+ * loadmsgcat.c (use_mmap): Define if compiled for glibc.
+
+ * bindtextdom.c: Include all those standard headers
+ unconditionally if _LIBC is defined.
+
+ * finddomain.c: Fix 2 times defiend -> defined.
+
+ * textdomain.c: Include libintl.h instead of libgettext.h when
+ compiling for glibc. Include all those standard headers
+ unconditionally if _LIBC is defined.
+
+ * localealias.c, loadmsgcat.c: Prepare to be compiled in glibc.
+
+ * gettext.c:
+ Include libintl.h instead of libgettext.h when compiling for glibc.
+ Get NULL from stddef.h if we compile for glibc.
+
+ * finddomain.c: Include libintl.h instead of libgettext.h when
+ compiling for glibc. Include all those standard headers
+ unconditionally if _LIBC is defined.
+
+ * dcgettext.c: Include all those standard headers unconditionally
+ if _LIBC is defined.
+
+ * dgettext.c: If compiled in glibc include libintl.h instead of
+ libgettext.h.
+ (locale.h): Don't rely on HAVE_LOCALE_H when compiling for glibc.
+
+ * dcgettext.c: If compiled in glibc include libintl.h instead of
+ libgettext.h.
+ (getcwd): Don't rely on HAVE_GETCWD when compiling for glibc.
+
+ * bindtextdom.c:
+ If compiled in glibc include libintl.h instead of libgettext.h.
+
+Mon Sep 25 22:23:06 1995 Ulrich Drepper <drepper@myware>
+
+ * localealias.c (_nl_expand_alias): Don't call bsearch if NMAP <= 0.
+ Reported by Marcus Daniels.
+
+ * cat-compat.c (bindtextdomain):
+ String used in putenv must not be recycled.
+ Reported by Marcus Daniels.
+
+ * libgettext.h (__USE_GNU_GETTEXT):
+ Additional symbol to signal that we use GNU gettext
+ library.
+
+ * cat-compat.c (bindtextdomain):
+ Fix bug with the strange stpcpy replacement.
+ Reported by Nelson Beebe.
+
+Sat Sep 23 08:23:51 1995 Ulrich Drepper <drepper@myware>
+
+ * cat-compat.c: Include <string.h> for stpcpy prototype.
+
+ * localealias.c (read_alias_file):
+ While expand strdup code temporary variable `cp' hided
+ higher level variable with same name. Rename to `tp'.
+
+ * textdomain.c (textdomain):
+ Avoid warning by using temporary variable in strdup code.
+
+ * finddomain.c (_nl_find_domain): Remove unused variable `application'.
+
+Thu Sep 21 15:51:44 1995 Ulrich Drepper <drepper@myware>
+
+ * localealias.c (alias_compare):
+ Use strcasecmp() only if available. Else use
+ implementation in place.
+
+ * intl-compat.c:
+ Wrapper functions now call *__ functions instead of __*.
+
+ * libgettext.h: Declare prototypes for *__ functions instead for __*.
+
+ * cat-compat.c, loadmsgcat.c:
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part
+ of the standard libc and so prevent libintl.a from being used
+ standalone.
+
+ * bindtextdom.c:
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part
+ of the standard libc and so prevent libintl.a from being used
+ standalone.
+ Rename to bindtextdomain__ if not used in GNU C Library.
+
+ * dgettext.c:
+ Rename function to dgettext__ if not used in GNU C Library.
+
+ * gettext.c:
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part
+ of the standard libc and so prevent libintl.a from being used
+ standalone.
+ Functions now called gettext__ if not used in GNU C Library.
+
+ * dcgettext.c, localealias.c, textdomain.c, finddomain.c:
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part
+ of the standard libc and so prevent libintl.a from being used
+ standalone.
+
+Sun Sep 17 23:14:49 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c: Correct some bugs in handling of CEN standard
+ locale definitions.
+
+Thu Sep 7 01:49:28 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c: Implement CEN syntax.
+
+ * gettextP.h (loaded_domain): Extend number of successors to 31.
+
+Sat Aug 19 19:25:29 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (aliaspath): Remove path to X11 locale dir.
+
+ * Makefile.in: Make install-src depend on install. This helps
+ gettext to install the sources and other packages can use the
+ install goal.
+
+Sat Aug 19 15:19:33 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (uninstall): Remove stuff installed by install-src.
+
+Tue Aug 15 13:13:53 1995 Ulrich Drepper <drepper@myware>
+
+ * VERSION.in: Initial revision.
+
+ * Makefile.in (DISTFILES):
+ Add VERSION file. This is not necessary for gettext, but
+ for other packages using this library.
+
+Tue Aug 15 06:16:44 1995 Ulrich Drepper <drepper@myware>
+
+ * gettextP.h (_nl_find_domain):
+ New prototype after changing search strategy.
+
+ * finddomain.c (_nl_find_domain):
+ We now try only to find a specified catalog. Fall back to other
+ catalogs listed in the locale list is now done in __dcgettext.
+
+ * dcgettext.c (__dcgettext):
+ Now we provide message fall back even to different languages.
+ I.e. if a message is not available in one language all the other
+ in the locale list a tried. Formerly fall back was only possible
+ within one language. Implemented by moving one loop from
+ _nl_find_domain to here.
+
+Mon Aug 14 23:45:50 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (gettextsrcdir):
+ Directory where source of GNU gettext library are made
+ available.
+ (INSTALL, INSTALL_DATA): Programs used for installing sources.
+ (gettext-src): New. Rule to install GNU gettext sources for use in
+ gettextize shell script.
+
+Sun Aug 13 14:40:48 1995 Ulrich Drepper <drepper@myware>
+
+ * loadmsgcat.c (_nl_load_domain):
+ Use mmap for loading only when munmap function is
+ also available.
+
+ * Makefile.in (install): Depend on `all' goal.
+
+Wed Aug 9 11:04:33 1995 Ulrich Drepper <drepper@myware>
+
+ * localealias.c (read_alias_file):
+ Do not overwrite '\n' when terminating alias value string.
+
+ * localealias.c (read_alias_file):
+ Handle long lines. Ignore the rest not fitting in
+ the buffer after the initial `fgets' call.
+
+Wed Aug 9 00:54:29 1995 Ulrich Drepper <drepper@myware>
+
+ * gettextP.h (_nl_load_domain):
+ Add prototype, replacing prototype for _nl_load_msg_cat.
+
+ * finddomain.c (_nl_find_domain):
+ Remove unneeded variable filename and filename_len.
+ (expand_alias): Remove prototype because functions does not
+ exist anymore.
+
+ * localealias.c (read_alias_file):
+ Change type of fname_len parameter to int.
+ (xmalloc): Add prototype.
+
+ * loadmsgcat.c: Better prototypes for xmalloc.
+
+Tue Aug 8 22:30:39 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c (_nl_find_domain):
+ Allow alias name to be constructed from the four components.
+
+ * Makefile.in (aliaspath): New variable. Set to preliminary value.
+ (SOURCES): Add localealias.c.
+ (OBJECTS): Add localealias.o.
+
+ * gettextP.h: Add prototype for _nl_expand_alias.
+
+ * finddomain.c: Aliasing handled in intl/localealias.c.
+
+ * localealias.c: Aliasing for locale names.
+
+ * bindtextdom.c: Better prototypes for xmalloc and xstrdup.
+
+Mon Aug 7 23:47:42 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (DISTFILES): gettext.perl is now found in misc/.
+
+ * cat-compat.c (bindtextdomain):
+ Correct implementation. dirname parameter was not used.
+ Reported by Marcus Daniels.
+
+ * gettextP.h (loaded_domain):
+ New fields `successor' and `decided' for oo, lazy
+ message handling implementation.
+
+ * dcgettext.c:
+ Adopt for oo, lazy message handliing.
+ Now we can inherit translations from less specific locales.
+ (find_msg): New function.
+
+ * loadmsgcat.c, finddomain.c:
+ Complete rewrite. Implement oo, lazy message handling :-).
+ We now have an additional environment variable `LANGUAGE' with
+ a higher priority than LC_ALL for the LC_MESSAGE locale.
+ Here we can set a colon separated list of specifications each
+ of the form `language[_territory[.codeset]][@modifier]'.
+
+Sat Aug 5 09:55:42 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c (unistd.h):
+ Include to get _PC_PATH_MAX defined on system having it.
+
+Fri Aug 4 22:42:00 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c (stpcpy): Include prototype.
+
+ * Makefile.in (dist): Remove `copying instead' message.
+
+Wed Aug 2 18:52:03 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (ID, TAGS): Do not use $^.
+
+Tue Aug 1 20:07:11 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (TAGS, ID): Use $^ as command argument.
+ (TAGS): Give etags -o option t write to current directory,
+ not $(srcdir).
+ (ID): Use $(srcdir) instead os $(top_srcdir)/src.
+ (distclean): Remove ID.
+
+Sun Jul 30 11:51:46 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (gnulocaledir):
+ New variable, always using share/ for data directory.
+ (DEFS): Add GNULOCALEDIR, used in finddomain.c.
+
+ * finddomain.c (_nl_default_dirname):
+ Set to GNULOCALEDIR, because it always has to point
+ to the directory where GNU gettext Library writes it to.
+
+ * intl-compat.c (textdomain, bindtextdomain):
+ Undefine macros before function definition.
+
+Sat Jul 22 01:10:02 1995 Ulrich Drepper <drepper@myware>
+
+ * libgettext.h (_LIBINTL_H):
+ Protect definition in case where this file is included as
+ libgettext.h on Solaris machines. Add comment about this.
+
+Wed Jul 19 02:36:42 1995 Ulrich Drepper <drepper@myware>
+
+ * intl-compat.c (textdomain): Correct typo.
+
+Wed Jul 19 01:51:35 1995 Ulrich Drepper <drepper@myware>
+
+ * dcgettext.c (dcgettext): Function now called __dcgettext.
+
+ * dgettext.c (dgettext): Now called __dgettext and calls
+ __dcgettext.
+
+ * gettext.c (gettext):
+ Function now called __gettext and calls __dgettext.
+
+ * textdomain.c (textdomain): Function now called __textdomain.
+
+ * bindtextdom.c (bindtextdomain): Function now called
+ __bindtextdomain.
+
+ * intl-compat.c: Initial revision.
+
+ * Makefile.in (SOURCES): Add intl-compat.c.
+ (OBJECTS): We always compile the GNU gettext library functions.
+ OBJECTS contains all objects but cat-compat.o, ../po/cat-if-tbl.o,
+ and intl-compat.o.
+ (GETTOBJS): Contains now only intl-compat.o.
+
+ * libgettext.h:
+ Re-include protection matches dualistic character of libgettext.h.
+ For all functions in GNU gettext library define __ counter part.
+
+ * finddomain.c (strchr): Define as index if not found in C library.
+ (_nl_find_domain): For relative paths paste / in between.
+
+Tue Jul 18 16:37:45 1995 Ulrich Drepper <drepper@myware>
+
+ * loadmsgcat.c, finddomain.c: Add inclusion of sys/types.h.
+
+ * xopen-msg.sed: Fix bug with `msgstr ""' lines.
+ A little bit better comments.
+
+Tue Jul 18 01:18:27 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in:
+ po-mode.el, makelinks, combine-sh are now found in ../misc.
+
+ * po-mode.el, makelinks, combine-sh, elisp-comp:
+ Moved to ../misc/.
+
+ * libgettext.h, gettextP.h, gettext.h: Uniform test for __STDC__.
+
+Sun Jul 16 22:33:02 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (INSTALL, INSTALL_DATA): New variables.
+ (install-data, uninstall): Install/uninstall .elc file.
+
+ * po-mode.el (Installation comment):
+ Add .pox as possible extension of .po files.
+
+Sun Jul 16 13:23:27 1995 Ulrich Drepper <drepper@myware>
+
+ * elisp-comp: Complete new version by Franc,ois: This does not
+ fail when not compiling in the source directory.
+
+Sun Jul 16 00:12:17 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (../po/cat-id-tbl.o):
+ Use $(MAKE) instead of make for recursive make.
+
+ * Makefile.in (.el.elc): Use $(SHELL) instead of /bin/sh.
+ (install-exec): Add missing dummy goal.
+ (install-data, uninstall): @ in multi-line shell command at
+ beginning, not in front of echo. Reported by Eric Backus.
+
+Sat Jul 15 00:21:28 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (DISTFILES):
+ Rename libgettext.perl to gettext.perl to fit in 14 chars
+ file systems.
+
+ * gettext.perl:
+ Rename to gettext.perl to fit in 14 chars file systems.
+
+Thu Jul 13 23:17:20 1995 Ulrich Drepper <drepper@myware>
+
+ * cat-compat.c: If !STDC_HEADERS try to include malloc.h.
+
+Thu Jul 13 20:55:02 1995 Ulrich Drepper <drepper@myware>
+
+ * po2tbl.sed.in: Pretty printing.
+
+ * linux-msg.sed, xopen-msg.sed:
+ Correct bugs with handling substitute flags in branches.
+
+ * hash-string.h (hash_string):
+ Old K&R compilers don't under stand `unsigned char'.
+
+ * gettext.h (nls_uint32):
+ Some old K&R compilers (eg HP) don't understand `unsigned int'.
+
+ * cat-compat.c (msg_to_cat_id): De-ANSI-fy prototypes.
+
+Thu Jul 13 01:34:33 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (ELCFILES): New variable.
+ (DISTFILES): Add elisp-comp.
+ Add implicit rule for .el -> .elc compilation.
+ (install-data): install $ELCFILES
+ (clean): renamed po-to-tbl and po-to-msg to po2tbl and po2msg resp.
+
+ * elisp-comp: Initial revision
+
+Wed Jul 12 16:14:52 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in:
+ cat-id-tbl.c is now found in po/. This enables us to use an identical
+ intl/ directory in all packages.
+
+ * dcgettext.c (dcgettext): hashing does not work for table size <= 2.
+
+ * textdomain.c: fix typo (#if def -> #if defined)
+
+Tue Jul 11 18:44:43 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (stamp-cat-id): use top_srcdir to address source files
+ (DISTFILES,distclean): move tupdate.perl to src/
+
+ * po-to-tbl.sed.in:
+ add additional jump to clear change flag to recognize multiline strings
+
+Tue Jul 11 01:32:50 1995 Ulrich Drepper <drepper@myware>
+
+ * textdomain.c: Protect inclusion of stdlib.h and string.h.
+
+ * loadmsgcat.c: Protect inclusion of stdlib.h.
+
+ * libgettext.h: Protect inclusion of locale.h.
+ Allow use in C++ programs.
+ Define NULL is not happened already.
+
+ * Makefile.in (DISTFILES): ship po-to-tbl.sed.in instead of
+ po-to-tbl.sed.
+ (distclean): remove po-to-tbl.sed and tupdate.perl.
+
+ * tupdate.perl.in: Substitute Perl path even in exec line.
+ Don't include entries without translation from old .po file.
+
+Tue Jul 4 00:41:51 1995 Ulrich Drepper <drepper@myware>
+
+ * tupdate.perl.in: use "Updated: " in msgid "".
+
+ * cat-compat.c: Fix typo (LOCALDIR -> LOCALEDIR).
+ Define getenv if !__STDC__.
+
+ * bindtextdom.c: Protect stdlib.h and string.h inclusion.
+ Define free if !__STDC__.
+
+ * finddomain.c: Change DEF_MSG_DOM_DIR to LOCALEDIR.
+ Define free if !__STDC__.
+
+ * cat-compat.c: Change DEF_MSG_DOM_DIR to LOCALEDIR.
+
+Mon Jul 3 23:56:30 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in: Use LOCALEDIR instead of DEF_MSG_DOM_DIR.
+ Remove unneeded $(srcdir) from Makefile.in dependency.
+
+ * makelinks: Add copyright and short description.
+
+ * po-mode.el: Last version for 0.7.
+
+ * tupdate.perl.in: Fix die message.
+
+ * dcgettext.c: Protect include of string.h.
+
+ * gettext.c: Protect include of stdlib.h and further tries to get NULL.
+
+ * finddomain.c: Some corrections in includes.
+
+ * Makefile.in (INCLUDES): Prune list correct path to Makefile.in.
+
+ * po-to-tbl.sed: Adopt for new .po file format.
+
+ * linux-msg.sed, xopen-msg.sed: Adopt for new .po file format.
+
+Sun Jul 2 23:55:03 1995 Ulrich Drepper <drepper@myware>
+
+ * tupdate.perl.in: Complete rewrite for new .po file format.
+
+Sun Jul 2 02:06:50 1995 Ulrich Drepper <drepper@myware>
+
+ * First official release. This directory contains all the code
+ needed to internationalize own packages. It provides functions
+ which allow to use the X/Open catgets function with an interface
+ like the Uniforum gettext function. For system which does not
+ have neither of those a complete implementation is provided.
diff --git a/intl/ChangeLog.inst b/intl/ChangeLog.inst
new file mode 100644
index 000000000..e62afd415
--- /dev/null
+++ b/intl/ChangeLog.inst
@@ -0,0 +1,4 @@
+2001-07-24 GNU <bug-gnu-utils@gnu.org>
+
+ * Version 0.10.39 released.
+
diff --git a/intl/Makefile.in b/intl/Makefile.in
new file mode 100644
index 000000000..22695b7b2
--- /dev/null
+++ b/intl/Makefile.in
@@ -0,0 +1,319 @@
+# Makefile for directory with message catalog handling in GNU NLS Utilities.
+# 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 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = ..
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+transform = @program_transform_name@
+libdir = @libdir@
+includedir = @includedir@
+datadir = @datadir@
+localedir = $(datadir)/locale
+gettextsrcdir = $(datadir)/gettext/intl
+aliaspath = $(localedir)
+subdir = intl
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac`
+
+l = @INTL_LIBTOOL_SUFFIX_PREFIX@
+
+AR = ar
+CC = @CC@
+LIBTOOL = @LIBTOOL@
+RANLIB = @RANLIB@
+YACC = @INTLBISON@ -y -d
+YFLAGS = --name-prefix=__gettext
+
+DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \
+-DLIBDIR=\"$(libdir)\" @DEFS@
+CPPFLAGS = @CPPFLAGS@
+CFLAGS = @CFLAGS@
+DEBUG_CFLAGS = @DEBUG_CFLAGS@
+LDFLAGS = @LDFLAGS@
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+HEADERS = $(COMHDRS) libgnuintl.h libgettext.h loadinfo.h
+COMHDRS = gettext.h gettextP.h hash-string.h
+SOURCES = $(COMSRCS) intl-compat.c
+COMSRCS = 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 \
+localcharset.c
+OBJECTS = @INTLOBJS@ 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 localcharset.$lo
+GETTOBJS = intl-compat.$lo
+DISTFILES.common = Makefile.in \
+config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES)
+DISTFILES.generated = plural.c
+DISTFILES.normal = VERSION
+DISTFILES.gettext = libintl.glibc
+DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c
+
+# Libtool's library version information for libintl.
+# Before making a gettext release, the gettext maintainer must change this
+# according to the libtool documentation, section "Library interface versions".
+# Maintainers of other packages that include the intl directory must *not*
+# change these values.
+LTV_CURRENT=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.. -I. -I$(top_srcdir)/intl
+
+all: all-@USE_INCLUDED_LIBINTL@
+all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed
+all-no: all-no-@BUILD_INCLUDED_LIBINTL@
+all-no-yes: libgnuintl.$la
+all-no-no:
+
+libintl.a libgnuintl.a: $(OBJECTS)
+ rm -f $@
+ $(AR) cru $@ $(OBJECTS)
+ $(RANLIB) $@
+
+libintl.la libgnuintl.la: $(OBJECTS)
+ $(LIBTOOL) --mode=link \
+ $(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \
+ $(OBJECTS) @LIBICONV@ \
+ -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \
+ -rpath $(libdir) \
+ -no-undefined
+
+libintl.h: libgnuintl.h
+ cp $(srcdir)/libgnuintl.h libintl.h
+
+charset.alias: config.charset
+ $(SHELL) $(srcdir)/config.charset '@host@' > t-$@
+ mv t-$@ $@
+
+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
+# system which has the GNU gettext() function in its C library or in a
+# separate library.
+# If you want to use the one which comes with this version of the
+# package, you have to use `configure --with-included-gettext'.
+install: install-exec install-data
+install-exec: all
+ if test "$(PACKAGE)" = "gettext" \
+ && test '@INTLOBJS@' = '$(GETTOBJS)'; then \
+ $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \
+ $(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \
+ $(LIBTOOL) --mode=install \
+ $(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \
+ else \
+ : ; \
+ fi
+ if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+ $(mkinstalldirs) $(DESTDIR)$(libdir); \
+ temp=$(DESTDIR)$(libdir)/t-charset.alias; \
+ dest=$(DESTDIR)$(libdir)/charset.alias; \
+ if test -f $(DESTDIR)$(libdir)/charset.alias; then \
+ orig=$(DESTDIR)$(libdir)/charset.alias; \
+ sed -f ref-add.sed $$orig > $$temp; \
+ $(INSTALL_DATA) $$temp $$dest; \
+ rm -f $$temp; \
+ else \
+ if test @GLIBC21@ = no; then \
+ orig=charset.alias; \
+ sed -f ref-add.sed $$orig > $$temp; \
+ $(INSTALL_DATA) $$temp $$dest; \
+ rm -f $$temp; \
+ fi; \
+ fi; \
+ $(mkinstalldirs) $(DESTDIR)$(localedir); \
+ test -f $(DESTDIR)$(localedir)/locale.alias \
+ && orig=$(DESTDIR)$(localedir)/locale.alias \
+ || orig=$(srcdir)/locale.alias; \
+ temp=$(DESTDIR)$(localedir)/t-locale.alias; \
+ dest=$(DESTDIR)$(localedir)/locale.alias; \
+ sed -f ref-add.sed $$orig > $$temp; \
+ $(INSTALL_DATA) $$temp $$dest; \
+ rm -f $$temp; \
+ else \
+ : ; \
+ fi
+install-data: all
+ if test "$(PACKAGE)" = "gettext"; then \
+ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
+ $(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \
+ $(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \
+ dists="$(DISTFILES.common)"; \
+ for file in $$dists; do \
+ $(INSTALL_DATA) $(srcdir)/$$file \
+ $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ chmod a+x $(DESTDIR)$(gettextsrcdir)/config.charset; \
+ dists="$(DISTFILES.generated)"; \
+ for file in $$dists; do \
+ if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
+ $(INSTALL_DATA) $$dir/$$file \
+ $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ dists="$(DISTFILES.obsolete)"; \
+ for file in $$dists; do \
+ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+ if test "$(PACKAGE)" = "gettext" \
+ && test '@INTLOBJS@' = '$(GETTOBJS)'; then \
+ rm -f $(DESTDIR)$(includedir)/libintl.h; \
+ $(LIBTOOL) --mode=uninstall \
+ rm -f $(DESTDIR)$(libdir)/libintl.$la; \
+ else \
+ : ; \
+ fi
+ if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+ if test -f $(DESTDIR)$(libdir)/charset.alias; then \
+ temp=$(DESTDIR)$(libdir)/t-charset.alias; \
+ dest=$(DESTDIR)$(libdir)/charset.alias; \
+ sed -f ref-del.sed $$dest > $$temp; \
+ if grep '^# Packages using this file: $$' $$temp > /dev/null; then \
+ rm -f $$dest; \
+ else \
+ $(INSTALL_DATA) $$temp $$dest; \
+ fi; \
+ rm -f $$temp; \
+ fi; \
+ if test -f $(DESTDIR)$(localedir)/locale.alias; then \
+ temp=$(DESTDIR)$(localedir)/t-locale.alias; \
+ dest=$(DESTDIR)$(localedir)/locale.alias; \
+ sed -f ref-del.sed $$dest > $$temp; \
+ if grep '^# Packages using this file: $$' $$temp > /dev/null; then \
+ rm -f $$dest; \
+ else \
+ $(INSTALL_DATA) $$temp $$dest; \
+ fi; \
+ rm -f $$temp; \
+ fi; \
+ else \
+ : ; \
+ fi
+ if test "$(PACKAGE)" = "gettext"; then \
+ for file in VERSION ChangeLog $(DISTFILES.common) $(DISTFILES.generated); do \
+ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+
+info dvi:
+
+$(OBJECTS): ../config.h libgnuintl.h
+bindtextdom.$lo finddomain.$lo loadmsgcat.$lo: gettextP.h gettext.h loadinfo.h
+dcgettext.$lo: gettextP.h gettext.h hash-string.h loadinfo.h
+
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES)
+ here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES)
+
+id: ID
+
+ID: $(HEADERS) $(SOURCES)
+ here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES)
+
+
+mostlyclean:
+ rm -f *.a *.la *.o *.lo core core.* *~ \#* .*~ .\#*
+ rm -f libintl.h charset.alias ref-add.sed ref-del.sed
+ rm -f -r .libs _libs
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile ID TAGS
+ if test "$(PACKAGE)" = gettext; then \
+ rm -f ChangeLog.inst $(DISTFILES.normal); \
+ else \
+ : ; \
+ fi
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+
+# GNU gettext needs not contain the file `VERSION' but contains some
+# other files which should not be distributed in other packages.
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: Makefile
+ if test "$(PACKAGE)" = gettext; then \
+ additional="$(DISTFILES.gettext)"; \
+ else \
+ additional="$(DISTFILES.normal)"; \
+ fi; \
+ $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \
+ for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \
+ if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
+ ln $$dir/$$file $(distdir) 2> /dev/null \
+ || cp -p $$dir/$$file $(distdir); \
+ done
+
+Makefile: Makefile.in ../config.status
+ cd .. \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+debug:
+ @$(MAKE) CFLAGS="$(DEBUG_CFLAGS)"
+
+install-debug: debug
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec install-data
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/intl/VERSION b/intl/VERSION
new file mode 100644
index 000000000..be17e2701
--- /dev/null
+++ b/intl/VERSION
@@ -0,0 +1 @@
+GNU gettext library from gettext-0.10.39
diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c
new file mode 100644
index 000000000..7e5a74a43
--- /dev/null
+++ b/intl/bindtextdom.c
@@ -0,0 +1,368 @@
+/* Implementation of the bindtextdomain(3) function
+ 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+#include "gettextP.h"
+
+#ifdef _LIBC
+/* We have to handle multi-threaded applications. */
+# include <bits/libc-lock.h>
+#else
+/* Provide dummy implementation if this is outside glibc. */
+# define __libc_rwlock_define(CLASS, NAME)
+# define __libc_rwlock_wrlock(NAME)
+# define __libc_rwlock_unlock(NAME)
+#endif
+
+/* The internal variables in the standalone libintl.a must have different
+ names than the internal variables in GNU libc, otherwise programs
+ using libintl.a cannot be linked statically. */
+#if !defined _LIBC
+# define _nl_default_dirname _nl_default_dirname__
+# define _nl_domain_bindings _nl_domain_bindings__
+#endif
+
+/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */
+#ifndef offsetof
+# define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Contains the default location of the message catalogs. */
+extern const char _nl_default_dirname[];
+
+/* List with bindings of specific domains. */
+extern struct binding *_nl_domain_bindings;
+
+/* Lock variable to protect the global data in the gettext implementation. */
+__libc_rwlock_define (extern, _nl_state_lock)
+
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define BINDTEXTDOMAIN __bindtextdomain
+# define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset
+# ifndef strdup
+# define strdup(str) __strdup (str)
+# endif
+#else
+# define BINDTEXTDOMAIN bindtextdomain__
+# define BIND_TEXTDOMAIN_CODESET bind_textdomain_codeset__
+#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
+ to be used for the DOMAINNAME message catalog.
+ If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not
+ modified, only the current value is returned.
+ If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither
+ modified nor returned. */
+static void
+set_binding_values (domainname, dirnamep, codesetp)
+ const char *domainname;
+ const char **dirnamep;
+ const char **codesetp;
+{
+ struct binding *binding;
+ int modified;
+
+ /* Some sanity checks. */
+ if (domainname == NULL || domainname[0] == '\0')
+ {
+ if (dirnamep)
+ *dirnamep = NULL;
+ if (codesetp)
+ *codesetp = NULL;
+ return;
+ }
+
+ __libc_rwlock_wrlock (_nl_state_lock);
+
+ modified = 0;
+
+ for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+ {
+ int compare = strcmp (domainname, binding->domainname);
+ if (compare == 0)
+ /* We found it! */
+ break;
+ if (compare < 0)
+ {
+ /* It is not in the list. */
+ binding = NULL;
+ break;
+ }
+ }
+
+ if (binding != NULL)
+ {
+ if (dirnamep)
+ {
+ const char *dirname = *dirnamep;
+
+ if (dirname == NULL)
+ /* The current binding has be to returned. */
+ *dirnamep = binding->dirname;
+ else
+ {
+ /* The domain is already bound. If the new value and the old
+ one are equal we simply do nothing. Otherwise replace the
+ old binding. */
+ char *result = binding->dirname;
+ if (strcmp (dirname, result) != 0)
+ {
+ if (strcmp (dirname, _nl_default_dirname) == 0)
+ result = (char *) _nl_default_dirname;
+ else
+ {
+#if defined _LIBC || defined HAVE_STRDUP
+ result = strdup (dirname);
+#else
+ size_t len = strlen (dirname) + 1;
+ result = (char *) malloc (len);
+ if (__builtin_expect (result != NULL, 1))
+ memcpy (result, dirname, len);
+#endif
+ }
+
+ if (__builtin_expect (result != NULL, 1))
+ {
+ if (binding->dirname != _nl_default_dirname)
+ free (binding->dirname);
+
+ binding->dirname = result;
+ modified = 1;
+ }
+ }
+ *dirnamep = result;
+ }
+ }
+
+ if (codesetp)
+ {
+ const char *codeset = *codesetp;
+
+ if (codeset == NULL)
+ /* The current binding has be to returned. */
+ *codesetp = binding->codeset;
+ else
+ {
+ /* The domain is already bound. If the new value and the old
+ one are equal we simply do nothing. Otherwise replace the
+ old binding. */
+ char *result = binding->codeset;
+ if (result == NULL || strcmp (codeset, result) != 0)
+ {
+#if defined _LIBC || defined HAVE_STRDUP
+ result = strdup (codeset);
+#else
+ size_t len = strlen (codeset) + 1;
+ result = (char *) malloc (len);
+ if (__builtin_expect (result != NULL, 1))
+ memcpy (result, codeset, len);
+#endif
+
+ if (__builtin_expect (result != NULL, 1))
+ {
+ if (binding->codeset != NULL)
+ free (binding->codeset);
+
+ binding->codeset = result;
+ binding->codeset_cntr++;
+ modified = 1;
+ }
+ }
+ *codesetp = result;
+ }
+ }
+ }
+ else if ((dirnamep == NULL || *dirnamep == NULL)
+ && (codesetp == NULL || *codesetp == NULL))
+ {
+ /* Simply return the default values. */
+ if (dirnamep)
+ *dirnamep = _nl_default_dirname;
+ if (codesetp)
+ *codesetp = NULL;
+ }
+ else
+ {
+ /* We have to create a new binding. */
+ size_t len = strlen (domainname) + 1;
+ struct binding *new_binding =
+ (struct binding *) malloc (offsetof (struct binding, domainname) + len);
+
+ if (__builtin_expect (new_binding == NULL, 0))
+ goto failed;
+
+ memcpy (new_binding->domainname, domainname, len);
+
+ if (dirnamep)
+ {
+ const char *dirname = *dirnamep;
+
+ if (dirname == NULL)
+ /* The default value. */
+ dirname = _nl_default_dirname;
+ else
+ {
+ if (strcmp (dirname, _nl_default_dirname) == 0)
+ dirname = _nl_default_dirname;
+ else
+ {
+ char *result;
+#if defined _LIBC || defined HAVE_STRDUP
+ result = strdup (dirname);
+ if (__builtin_expect (result == NULL, 0))
+ goto failed_dirname;
+#else
+ size_t len = strlen (dirname) + 1;
+ result = (char *) malloc (len);
+ if (__builtin_expect (result == NULL, 0))
+ goto failed_dirname;
+ memcpy (result, dirname, len);
+#endif
+ dirname = result;
+ }
+ }
+ *dirnamep = dirname;
+ new_binding->dirname = (char *) dirname;
+ }
+ else
+ /* The default value. */
+ new_binding->dirname = (char *) _nl_default_dirname;
+
+ new_binding->codeset_cntr = 0;
+
+ if (codesetp)
+ {
+ const char *codeset = *codesetp;
+
+ if (codeset != NULL)
+ {
+ char *result;
+
+#if defined _LIBC || defined HAVE_STRDUP
+ result = strdup (codeset);
+ if (__builtin_expect (result == NULL, 0))
+ goto failed_codeset;
+#else
+ size_t len = strlen (codeset) + 1;
+ result = (char *) malloc (len);
+ if (__builtin_expect (result == NULL, 0))
+ goto failed_codeset;
+ memcpy (result, codeset, len);
+#endif
+ codeset = result;
+ new_binding->codeset_cntr++;
+ }
+ *codesetp = codeset;
+ new_binding->codeset = (char *) codeset;
+ }
+ else
+ new_binding->codeset = NULL;
+
+ /* Now enqueue it. */
+ if (_nl_domain_bindings == NULL
+ || strcmp (domainname, _nl_domain_bindings->domainname) < 0)
+ {
+ new_binding->next = _nl_domain_bindings;
+ _nl_domain_bindings = new_binding;
+ }
+ else
+ {
+ binding = _nl_domain_bindings;
+ while (binding->next != NULL
+ && strcmp (domainname, binding->next->domainname) > 0)
+ binding = binding->next;
+
+ new_binding->next = binding->next;
+ binding->next = new_binding;
+ }
+
+ modified = 1;
+
+ /* Here we deal with memory allocation failures. */
+ if (0)
+ {
+ failed_codeset:
+ if (new_binding->dirname != _nl_default_dirname)
+ free (new_binding->dirname);
+ failed_dirname:
+ free (new_binding);
+ failed:
+ if (dirnamep)
+ *dirnamep = NULL;
+ if (codesetp)
+ *codesetp = NULL;
+ }
+ }
+
+ /* If we modified any binding, we flush the caches. */
+ if (modified)
+ ++_nl_msg_cat_cntr;
+
+ __libc_rwlock_unlock (_nl_state_lock);
+}
+
+/* Specify that the DOMAINNAME message catalog will be found
+ in DIRNAME rather than in the system locale data base. */
+char *
+BINDTEXTDOMAIN (domainname, dirname)
+ const char *domainname;
+ const char *dirname;
+{
+ set_binding_values (domainname, &dirname, NULL);
+ return (char *) dirname;
+}
+
+/* Specify the character encoding in which the messages from the
+ DOMAINNAME message catalog will be returned. */
+char *
+BIND_TEXTDOMAIN_CODESET (domainname, codeset)
+ const char *domainname;
+ const char *codeset;
+{
+ set_binding_values (domainname, NULL, &codeset);
+ return (char *) codeset;
+}
+
+#ifdef _LIBC
+/* Aliases for function names in GNU C Library. */
+weak_alias (__bindtextdomain, bindtextdomain);
+weak_alias (__bind_textdomain_codeset, bind_textdomain_codeset);
+#endif
diff --git a/intl/config.charset b/intl/config.charset
new file mode 100755
index 000000000..f4f2611c5
--- /dev/null
+++ b/intl/config.charset
@@ -0,0 +1,438 @@
+#! /bin/sh
+# Output a system dependent table of character encoding aliases.
+#
+# Copyright (C) 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.
+#
+# The table consists of lines of the form
+# ALIAS CANONICAL
+#
+# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)".
+# ALIAS is compared in a case sensitive way.
+#
+# CANONICAL is the GNU canonical name for this character encoding.
+# It must be an encoding supported by libiconv. Support by GNU libc is
+# also desirable. CANONICAL is case insensitive. Usually an upper case
+# MIME charset name is preferred.
+# The current list of GNU canonical charset names is as follows.
+#
+# name used by which systems a MIME name?
+# ASCII, ANSI_X3.4-1968 glibc solaris freebsd
+# ISO-8859-1 glibc aix hpux irix osf solaris freebsd yes
+# ISO-8859-2 glibc aix hpux irix osf solaris freebsd yes
+# ISO-8859-3 glibc yes
+# ISO-8859-4 osf solaris freebsd yes
+# ISO-8859-5 glibc aix hpux irix osf solaris freebsd yes
+# ISO-8859-6 glibc aix hpux solaris yes
+# ISO-8859-7 glibc aix hpux irix osf solaris yes
+# ISO-8859-8 glibc aix hpux osf solaris yes
+# ISO-8859-9 glibc aix hpux irix osf solaris yes
+# ISO-8859-13 glibc
+# ISO-8859-15 glibc aix osf solaris freebsd
+# KOI8-R glibc solaris freebsd yes
+# KOI8-U glibc freebsd yes
+# CP437 dos
+# CP775 dos
+# CP850 aix osf dos
+# CP852 dos
+# CP855 dos
+# CP856 aix
+# CP857 dos
+# CP861 dos
+# CP862 dos
+# CP864 dos
+# CP865 dos
+# CP866 freebsd dos
+# CP869 dos
+# CP874 win32 dos
+# CP922 aix
+# CP932 aix win32 dos
+# CP943 aix
+# CP949 osf win32 dos
+# CP950 win32 dos
+# CP1046 aix
+# CP1124 aix
+# CP1129 aix
+# CP1250 win32
+# CP1251 glibc win32
+# CP1252 aix win32
+# CP1253 win32
+# CP1254 win32
+# CP1255 win32
+# CP1256 win32
+# CP1257 win32
+# GB2312 glibc aix hpux irix solaris freebsd yes
+# EUC-JP glibc aix hpux irix osf solaris freebsd yes
+# EUC-KR glibc aix hpux irix osf solaris freebsd yes
+# EUC-TW glibc aix hpux irix osf solaris
+# BIG5 glibc aix hpux osf solaris freebsd yes
+# BIG5-HKSCS glibc
+# GBK aix osf win32 dos
+# GB18030 glibc
+# SHIFT_JIS hpux osf solaris freebsd yes
+# JOHAB glibc win32
+# TIS-620 glibc aix hpux osf solaris
+# VISCII glibc yes
+# HP-ROMAN8 hpux
+# HP-ARABIC8 hpux
+# HP-GREEK8 hpux
+# HP-HEBREW8 hpux
+# HP-TURKISH8 hpux
+# HP-KANA8 hpux
+# DEC-KANJI osf
+# DEC-HANYU osf
+# UTF-8 glibc aix hpux osf solaris yes
+#
+# Note: Names which are not marked as being a MIME name should not be used in
+# Internet protocols for information interchange (mail, news, etc.).
+#
+# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications
+# must understand both names and treat them as equivalent.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+
+host="$1"
+os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'`
+echo "# This file contains a table of character encoding aliases,"
+echo "# suitable for operating system '${os}'."
+echo "# It was automatically generated from config.charset."
+# List of references, updated during installation:
+echo "# Packages using this file: "
+case "$os" in
+ linux* | *-gnu*)
+ # With glibc-2.1 or newer, we don't need any canonicalization,
+ # because glibc has iconv and both glibc and libiconv support all
+ # GNU canonical names directly. Therefore, the Makefile does not
+ # need to install the alias file at all.
+ # The following applies only to glibc-2.0.x and older libcs.
+ echo "ISO_646.IRV:1983 ASCII"
+ ;;
+ aix*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-6 ISO-8859-6"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "IBM-850 CP850"
+ echo "IBM-856 CP856"
+ echo "IBM-921 ISO-8859-13"
+ echo "IBM-922 CP922"
+ echo "IBM-932 CP932"
+ echo "IBM-943 CP943"
+ echo "IBM-1046 CP1046"
+ echo "IBM-1124 CP1124"
+ echo "IBM-1129 CP1129"
+ echo "IBM-1252 CP1252"
+ echo "IBM-eucCN GB2312"
+ echo "IBM-eucJP EUC-JP"
+ echo "IBM-eucKR EUC-KR"
+ echo "IBM-eucTW EUC-TW"
+ echo "big5 BIG5"
+ echo "GBK GBK"
+ echo "TIS-620 TIS-620"
+ echo "UTF-8 UTF-8"
+ ;;
+ hpux*)
+ echo "iso88591 ISO-8859-1"
+ echo "iso88592 ISO-8859-2"
+ echo "iso88595 ISO-8859-5"
+ echo "iso88596 ISO-8859-6"
+ echo "iso88597 ISO-8859-7"
+ echo "iso88598 ISO-8859-8"
+ echo "iso88599 ISO-8859-9"
+ echo "iso885915 ISO-8859-15"
+ echo "roman8 HP-ROMAN8"
+ echo "arabic8 HP-ARABIC8"
+ echo "greek8 HP-GREEK8"
+ echo "hebrew8 HP-HEBREW8"
+ echo "turkish8 HP-TURKISH8"
+ echo "kana8 HP-KANA8"
+ echo "tis620 TIS-620"
+ echo "big5 BIG5"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "hp15CN GB2312"
+ #echo "ccdc ?" # what is this?
+ echo "SJIS SHIFT_JIS"
+ echo "utf8 UTF-8"
+ ;;
+ irix*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "eucCN GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ ;;
+ osf*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "cp850 CP850"
+ echo "big5 BIG5"
+ echo "dechanyu DEC-HANYU"
+ echo "dechanzi GB2312"
+ echo "deckanji DEC-KANJI"
+ echo "deckorean EUC-KR"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "GBK GBK"
+ echo "KSC5601 CP949"
+ echo "sdeckanji EUC-JP"
+ echo "SJIS SHIFT_JIS"
+ echo "TACTIS TIS-620"
+ echo "UTF-8 UTF-8"
+ ;;
+ solaris*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-6 ISO-8859-6"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "koi8-r KOI8-R"
+ echo "BIG5 BIG5"
+ echo "gb2312 GB2312"
+ echo "cns11643 EUC-TW"
+ echo "5601 EUC-KR"
+ echo "eucJP EUC-JP"
+ echo "PCK SHIFT_JIS"
+ echo "TIS620.2533 TIS-620"
+ #echo "sun_eu_greek ?" # what is this?
+ echo "UTF-8 UTF-8"
+ ;;
+ freebsd*)
+ # FreeBSD 4.2 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 "US-ASCII ASCII"
+ for l in la_LN lt_LN; do
+ echo "$l.ASCII ASCII"
+ done
+ for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \
+ lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do
+ echo "$l.ISO_8859-1 ISO-8859-1"
+ echo "$l.DIS_8859-15 ISO-8859-15"
+ done
+ for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do
+ echo "$l.ISO_8859-2 ISO-8859-2"
+ done
+ for l in la_LN lt_LT; do
+ echo "$l.ISO_8859-4 ISO-8859-4"
+ done
+ for l in ru_RU ru_SU; do
+ echo "$l.KOI8-R KOI8-R"
+ echo "$l.ISO_8859-5 ISO-8859-5"
+ echo "$l.CP866 CP866"
+ done
+ echo "uk_UA.KOI8-U KOI8-U"
+ echo "zh_TW.BIG5 BIG5"
+ echo "zh_TW.Big5 BIG5"
+ echo "zh_CN.EUC GB2312"
+ echo "ja_JP.EUC EUC-JP"
+ echo "ja_JP.SJIS SHIFT_JIS"
+ echo "ja_JP.Shift_JIS SHIFT_JIS"
+ echo "ko_KR.EUC EUC-KR"
+ ;;
+ beos*)
+ # BeOS has a single locale, and it has UTF-8 encoding.
+ echo "* UTF-8"
+ ;;
+ msdosdjgpp*)
+ # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "#"
+ echo "# The encodings given here may not all be correct."
+ echo "# If you find that the encoding given for your language and"
+ echo "# country is not the one your DOS machine actually uses, just"
+ echo "# correct it in this file, and send a mail to"
+ echo "# Juan Manuel Guerrero <st001906@hrz1.hrz.tu-darmstadt.de>"
+ echo "# and Bruno Haible <haible@clisp.cons.org>."
+ echo "#"
+ echo "C ASCII"
+ # ISO-8859-1 languages
+ echo "ca CP850"
+ echo "ca_ES CP850"
+ echo "da CP865" # not CP850 ??
+ echo "da_DK CP865" # not CP850 ??
+ echo "de CP850"
+ echo "de_AT CP850"
+ echo "de_CH CP850"
+ echo "de_DE CP850"
+ echo "en CP850"
+ echo "en_AU CP850" # not CP437 ??
+ echo "en_CA CP850"
+ echo "en_GB CP850"
+ echo "en_NZ CP437"
+ echo "en_US CP437"
+ echo "en_ZA CP850" # not CP437 ??
+ echo "es CP850"
+ echo "es_AR CP850"
+ echo "es_BO CP850"
+ echo "es_CL CP850"
+ echo "es_CO CP850"
+ echo "es_CR CP850"
+ echo "es_CU CP850"
+ echo "es_DO CP850"
+ echo "es_EC CP850"
+ echo "es_ES CP850"
+ echo "es_GT CP850"
+ echo "es_HN CP850"
+ echo "es_MX CP850"
+ echo "es_NI CP850"
+ echo "es_PA CP850"
+ echo "es_PY CP850"
+ echo "es_PE CP850"
+ echo "es_SV CP850"
+ echo "es_UY CP850"
+ echo "es_VE CP850"
+ echo "et CP850"
+ echo "et_EE CP850"
+ echo "eu CP850"
+ echo "eu_ES CP850"
+ echo "fi CP850"
+ echo "fi_FI CP850"
+ echo "fr CP850"
+ echo "fr_BE CP850"
+ echo "fr_CA CP850"
+ echo "fr_CH CP850"
+ echo "fr_FR CP850"
+ echo "ga CP850"
+ echo "ga_IE CP850"
+ echo "gd CP850"
+ echo "gd_GB CP850"
+ echo "gl CP850"
+ echo "gl_ES CP850"
+ echo "id CP850" # not CP437 ??
+ echo "id_ID CP850" # not CP437 ??
+ echo "is CP861" # not CP850 ??
+ echo "is_IS CP861" # not CP850 ??
+ echo "it CP850"
+ echo "it_CH CP850"
+ echo "it_IT CP850"
+ echo "lt CP775"
+ echo "lt_LT CP775"
+ echo "lv CP775"
+ echo "lv_LV CP775"
+ echo "nb CP865" # not CP850 ??
+ echo "nb_NO CP865" # not CP850 ??
+ echo "nl CP850"
+ echo "nl_BE CP850"
+ echo "nl_NL CP850"
+ echo "nn CP865" # not CP850 ??
+ echo "nn_NO CP865" # not CP850 ??
+ echo "no CP865" # not CP850 ??
+ echo "no_NO CP865" # not CP850 ??
+ echo "pt CP850"
+ echo "pt_BR CP850"
+ echo "pt_PT CP850"
+ echo "sv CP850"
+ echo "sv_SE CP850"
+ # ISO-8859-2 languages
+ echo "cs CP852"
+ echo "cs_CZ CP852"
+ echo "hr CP852"
+ echo "hr_HR CP852"
+ echo "hu CP852"
+ echo "hu_HU CP852"
+ echo "pl CP852"
+ echo "pl_PL CP852"
+ echo "ro CP852"
+ echo "ro_RO CP852"
+ echo "sk CP852"
+ echo "sk_SK CP852"
+ echo "sl CP852"
+ echo "sl_SI CP852"
+ echo "sq CP852"
+ echo "sq_AL CP852"
+ echo "sr CP852" # CP852 or CP866 or CP855 ??
+ echo "sr_YU CP852" # CP852 or CP866 or CP855 ??
+ # ISO-8859-3 languages
+ echo "mt CP850"
+ echo "mt_MT CP850"
+ # ISO-8859-5 languages
+ echo "be CP866"
+ echo "be_BE CP866"
+ echo "bg CP866" # not CP855 ??
+ echo "bg_BG CP866" # not CP855 ??
+ echo "mk CP866" # not CP855 ??
+ echo "mk_MK CP866" # not CP855 ??
+ echo "ru KOI8-R" # not CP866 ??
+ echo "ru_RU KOI8-R" # not CP866 ??
+ # ISO-8859-6 languages
+ echo "ar CP864"
+ echo "ar_AE CP864"
+ echo "ar_DZ CP864"
+ echo "ar_EG CP864"
+ echo "ar_IQ CP864"
+ echo "ar_IR CP864"
+ echo "ar_JO CP864"
+ echo "ar_KW CP864"
+ echo "ar_MA CP864"
+ echo "ar_OM CP864"
+ echo "ar_QA CP864"
+ echo "ar_SA CP864"
+ echo "ar_SY CP864"
+ # ISO-8859-7 languages
+ echo "el CP869"
+ echo "el_GR CP869"
+ # ISO-8859-8 languages
+ echo "he CP862"
+ echo "he_IL CP862"
+ # ISO-8859-9 languages
+ echo "tr CP857"
+ echo "tr_TR CP857"
+ # Japanese
+ echo "ja CP932"
+ echo "ja_JP CP932"
+ # Chinese
+ echo "zh_CN GBK"
+ echo "zh_TW CP950" # not CP938 ??
+ # Korean
+ echo "kr CP949" # not CP934 ??
+ echo "kr_KR CP949" # not CP934 ??
+ # Thai
+ echo "th CP874"
+ echo "th_TH CP874"
+ # Other
+ echo "eo CP850"
+ echo "eo_EO CP850"
+ ;;
+esac
diff --git a/intl/dcgettext.c b/intl/dcgettext.c
new file mode 100644
index 000000000..469e78de7
--- /dev/null
+++ b/intl/dcgettext.c
@@ -0,0 +1,57 @@
+/* Implementation of the dcgettext(3) function.
+ Copyright (C) 1995-1999, 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define DCGETTEXT __dcgettext
+# define DCIGETTEXT __dcigettext
+#else
+# define DCGETTEXT dcgettext__
+# define DCIGETTEXT dcigettext__
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+ locale. */
+char *
+DCGETTEXT (domainname, msgid, category)
+ const char *domainname;
+ const char *msgid;
+ int category;
+{
+ return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__dcgettext, dcgettext);
+#endif
diff --git a/intl/dcigettext.c b/intl/dcigettext.c
new file mode 100644
index 000000000..b7627bf61
--- /dev/null
+++ b/intl/dcigettext.c
@@ -0,0 +1,1258 @@
+/* Implementation of the internal dcigettext function.
+ Copyright (C) 1995-1999, 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#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
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+
+#include <string.h>
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+# define strchr index
+# endif
+#endif
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include <locale.h>
+
+#if defined HAVE_SYS_PARAM_H || defined _LIBC
+# include <sys/param.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+#include "hash-string.h"
+
+/* Thread safetyness. */
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+#else
+/* Provide dummy implementation if this is outside glibc. */
+# define __libc_lock_define_initialized(CLASS, NAME)
+# define __libc_lock_lock(NAME)
+# define __libc_lock_unlock(NAME)
+# define __libc_rwlock_define_initialized(CLASS, NAME)
+# define __libc_rwlock_rdlock(NAME)
+# define __libc_rwlock_unlock(NAME)
+#endif
+
+/* Alignment of types. */
+#if defined __GNUC__ && __GNUC__ >= 2
+# define alignof(TYPE) __alignof__ (TYPE)
+#else
+# define alignof(TYPE) \
+ ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2)
+#endif
+
+/* The internal variables in the standalone libintl.a must have different
+ names than the internal variables in GNU libc, otherwise programs
+ using libintl.a cannot be linked statically. */
+#if !defined _LIBC
+# define _nl_default_default_domain _nl_default_default_domain__
+# define _nl_current_default_domain _nl_current_default_domain__
+# define _nl_default_dirname _nl_default_dirname__
+# define _nl_domain_bindings _nl_domain_bindings__
+#endif
+
+/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */
+#ifndef offsetof
+# define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions. This is required by the standard
+ because some ANSI C functions will require linking with this object
+ file and the name space must not be polluted. */
+# define getcwd __getcwd
+# ifndef stpcpy
+# define stpcpy __stpcpy
+# endif
+# define tfind __tfind
+#else
+# if !defined HAVE_GETCWD
+char *getwd ();
+# define getcwd(buf, max) getwd (buf)
+# else
+char *getcwd ();
+# endif
+# ifndef HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+# endif
+# ifndef HAVE_MEMPCPY
+static void *mempcpy PARAMS ((void *dest, const void *src, size_t n));
+# endif
+#endif
+
+/* Amount to increase buffer size by in each try. */
+#define PATH_INCR 32
+
+/* The following is from pathmax.h. */
+/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define
+ PATH_MAX but might cause redefinition warnings when sys/param.h is
+ later included (as on MORE/BSD 4.3). */
+#if defined _POSIX_VERSION || (defined HAVE_LIMITS_H && !defined __GNUC__)
+# include <limits.h>
+#endif
+
+#ifndef _POSIX_PATH_MAX
+# define _POSIX_PATH_MAX 255
+#endif
+
+#if !defined PATH_MAX && defined _PC_PATH_MAX
+# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX))
+#endif
+
+/* Don't include sys/param.h if it already has been. */
+#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+#endif
+
+#if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+#endif
+
+#ifndef PATH_MAX
+# define PATH_MAX _POSIX_PATH_MAX
+#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.
+ 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_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+# define IS_PATH_WITH_DIR(P) \
+ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+#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
+ are stored. */
+struct known_translation_t
+{
+ /* Domain in which to search. */
+ char *domainname;
+
+ /* The category. */
+ int category;
+
+ /* State of the catalog counter at the point the string was found. */
+ int counter;
+
+ /* Catalog where the string was found. */
+ struct loaded_l10nfile *domain;
+
+ /* And finally the translation. */
+ const char *translation;
+ size_t translation_length;
+
+ /* Pointer to the string in question. */
+ char msgid[ZERO];
+};
+
+/* Root of the search tree with known translations. We can use this
+ only if the system provides the `tsearch' function family. */
+#if defined HAVE_TSEARCH || defined _LIBC
+# include <search.h>
+
+static void *root;
+
+# ifdef _LIBC
+# define tsearch __tsearch
+# endif
+
+/* Function to compare two entries in the table of known translations. */
+static int transcmp PARAMS ((const void *p1, const void *p2));
+static int
+transcmp (p1, p2)
+ const void *p1;
+ const void *p2;
+{
+ const struct known_translation_t *s1;
+ const struct known_translation_t *s2;
+ int result;
+
+ s1 = (const struct known_translation_t *) p1;
+ s2 = (const struct known_translation_t *) p2;
+
+ result = strcmp (s1->msgid, s2->msgid);
+ if (result == 0)
+ {
+ result = strcmp (s1->domainname, s2->domainname);
+ if (result == 0)
+ /* We compare the category last (though this is the cheapest
+ operation) since it is hopefully always the same (namely
+ LC_MESSAGES). */
+ result = s1->category - s2->category;
+ }
+
+ return result;
+}
+#endif
+
+/* Name of the default domain used for gettext(3) prior any call to
+ textdomain(3). The default value for this is "messages". */
+const char _nl_default_default_domain[] = "messages";
+
+/* Value used as the default domain for gettext(3). */
+const char *_nl_current_default_domain = _nl_default_default_domain;
+
+/* Contains the default location of the message catalogs. */
+const char _nl_default_dirname[] = LOCALEDIR;
+
+/* List with bindings of specific domains created by bindtextdomain()
+ calls. */
+struct binding *_nl_domain_bindings;
+
+/* Prototypes for local functions. */
+static char *plural_lookup PARAMS ((struct loaded_l10nfile *domain,
+ unsigned long int n,
+ const char *translation,
+ size_t translation_len))
+ internal_function;
+static unsigned long int plural_eval PARAMS ((struct expression *pexp,
+ unsigned long int n))
+ 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;
+
+
+/* For those loosing systems which don't have `alloca' we have to add
+ some additional code emulating it. */
+#ifdef HAVE_ALLOCA
+/* Nothing has to be done. */
+# define ADD_BLOCK(list, address) /* nothing */
+# define FREE_BLOCKS(list) /* nothing */
+#else
+struct block_list
+{
+ void *address;
+ struct block_list *next;
+};
+# define ADD_BLOCK(list, addr) \
+ do { \
+ struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \
+ /* If we cannot get a free block we cannot add the new element to \
+ the list. */ \
+ if (newp != NULL) { \
+ newp->address = (addr); \
+ newp->next = (list); \
+ (list) = newp; \
+ } \
+ } while (0)
+# define FREE_BLOCKS(list) \
+ do { \
+ while (list != NULL) { \
+ struct block_list *old = list; \
+ list = list->next; \
+ free (old); \
+ } \
+ } while (0)
+# undef alloca
+# define alloca(size) (malloc (size))
+#endif /* have alloca */
+
+
+#ifdef _LIBC
+/* List of blocks allocated for translations. */
+typedef struct transmem_list
+{
+ struct transmem_list *next;
+ char data[ZERO];
+} transmem_block_t;
+static struct transmem_list *transmem_list;
+#else
+typedef unsigned char transmem_block_t;
+#endif
+
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define DCIGETTEXT __dcigettext
+#else
+# define DCIGETTEXT dcigettext__
+#endif
+
+/* Lock variable to protect the global data in the gettext implementation. */
+#ifdef _LIBC
+__libc_rwlock_define_initialized (, _nl_state_lock)
+#endif
+
+/* Checking whether the binaries runs SUID must be done and glibc provides
+ easier methods therefore we make a difference here. */
+#ifdef _LIBC
+# define ENABLE_SECURE __libc_enable_secure
+# define DETERMINE_SECURE
+#else
+# ifndef HAVE_GETUID
+# define getuid() 0
+# endif
+# ifndef HAVE_GETGID
+# define getgid() 0
+# endif
+# ifndef HAVE_GETEUID
+# define geteuid() getuid()
+# endif
+# ifndef HAVE_GETEGID
+# define getegid() getgid()
+# endif
+static int enable_secure;
+# define ENABLE_SECURE (enable_secure == 1)
+# define DETERMINE_SECURE \
+ if (enable_secure == 0) \
+ { \
+ if (getuid () != geteuid () || getgid () != getegid ()) \
+ enable_secure = 1; \
+ else \
+ enable_secure = -1; \
+ }
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current
+ CATEGORY locale and, if PLURAL is nonzero, search over string
+ depending on the plural form determined by N. */
+char *
+DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
+ const char *domainname;
+ const char *msgid1;
+ const char *msgid2;
+ int plural;
+ unsigned long int n;
+ int category;
+{
+#ifndef HAVE_ALLOCA
+ struct block_list *block_list = NULL;
+#endif
+ struct loaded_l10nfile *domain;
+ struct binding *binding;
+ const char *categoryname;
+ const char *categoryvalue;
+ char *dirname, *xdomainname;
+ char *single_locale;
+ char *retval;
+ size_t retlen;
+ int saved_errno;
+#if defined HAVE_TSEARCH || defined _LIBC
+ struct known_translation_t *search;
+ struct known_translation_t **foundp = NULL;
+ size_t msgid_len;
+#endif
+ size_t domainname_len;
+
+ /* If no real MSGID is given return NULL. */
+ if (msgid1 == NULL)
+ return NULL;
+
+ __libc_rwlock_rdlock (_nl_state_lock);
+
+ /* If DOMAINNAME is NULL, we are interested in the default domain. If
+ CATEGORY is not LC_MESSAGES this might not make much sense but the
+ definition left this undefined. */
+ if (domainname == NULL)
+ domainname = _nl_current_default_domain;
+
+#if defined HAVE_TSEARCH || defined _LIBC
+ msgid_len = strlen (msgid1) + 1;
+
+ /* Try to find the translation among those which we found at
+ some time. */
+ search = (struct known_translation_t *)
+ alloca (offsetof (struct known_translation_t, msgid) + msgid_len);
+ memcpy (search->msgid, msgid1, msgid_len);
+ search->domainname = (char *) domainname;
+ search->category = category;
+
+ foundp = (struct known_translation_t **) tfind (search, &root, transcmp);
+ if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr)
+ {
+ /* Now deal with plural. */
+ if (plural)
+ retval = plural_lookup ((*foundp)->domain, n, (*foundp)->translation,
+ (*foundp)->translation_length);
+ else
+ retval = (char *) (*foundp)->translation;
+
+ __libc_rwlock_unlock (_nl_state_lock);
+ return retval;
+ }
+#endif
+
+ /* Preserve the `errno' value. */
+ saved_errno = errno;
+
+ /* See whether this is a SUID binary or not. */
+ DETERMINE_SECURE;
+
+ /* First find matching binding. */
+ for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+ {
+ int compare = strcmp (domainname, binding->domainname);
+ if (compare == 0)
+ /* We found it! */
+ break;
+ if (compare < 0)
+ {
+ /* It is not in the list. */
+ binding = NULL;
+ break;
+ }
+ }
+
+ if (binding == NULL)
+ dirname = (char *) _nl_default_dirname;
+ else if (IS_ABSOLUTE_PATH (binding->dirname))
+ dirname = binding->dirname;
+ else
+ {
+ /* We have a relative path. Make it absolute now. */
+ size_t dirname_len = strlen (binding->dirname) + 1;
+ size_t path_max;
+ char *ret;
+
+ path_max = (unsigned int) PATH_MAX;
+ path_max += 2; /* The getcwd docs say to do this. */
+
+ for (;;)
+ {
+ dirname = (char *) alloca (path_max + dirname_len);
+ ADD_BLOCK (block_list, dirname);
+
+ __set_errno (0);
+ ret = getcwd (dirname, path_max);
+ if (ret != NULL || errno != ERANGE)
+ break;
+
+ path_max += path_max / 2;
+ path_max += PATH_INCR;
+ }
+
+ if (ret == NULL)
+ {
+ /* We cannot get the current working directory. Don't signal an
+ error but simply return the default string. */
+ 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);
+ }
+
+ /* Now determine the symbolic name of CATEGORY and its value. */
+ categoryname = category_to_name (category);
+ categoryvalue = guess_category_value (category, categoryname);
+
+ domainname_len = strlen (domainname);
+ xdomainname = (char *) alloca (strlen (categoryname)
+ + domainname_len + 5);
+ ADD_BLOCK (block_list, xdomainname);
+
+ stpcpy (mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
+ domainname, domainname_len),
+ ".mo");
+
+ /* Creating working area. */
+ single_locale = (char *) alloca (strlen (categoryvalue) + 1);
+ ADD_BLOCK (block_list, single_locale);
+
+
+ /* Search for the given string. This is a loop because we perhaps
+ got an ordered list of languages to consider for the translation. */
+ while (1)
+ {
+ /* Make CATEGORYVALUE point to the next element of the list. */
+ while (categoryvalue[0] != '\0' && categoryvalue[0] == ':')
+ ++categoryvalue;
+ if (categoryvalue[0] == '\0')
+ {
+ /* The whole contents of CATEGORYVALUE has been searched but
+ no valid entry has been found. We solve this situation
+ by implicitly appending a "C" entry, i.e. no translation
+ will take place. */
+ single_locale[0] = 'C';
+ single_locale[1] = '\0';
+ }
+ else
+ {
+ char *cp = single_locale;
+ while (categoryvalue[0] != '\0' && categoryvalue[0] != ':')
+ *cp++ = *categoryvalue++;
+ *cp = '\0';
+
+ /* When this is a SUID binary we must not allow accessing files
+ outside the dedicated directories. */
+ if (ENABLE_SECURE && IS_PATH_WITH_DIR (single_locale))
+ /* Ingore this entry. */
+ continue;
+ }
+
+ /* If the current locale value is C (or POSIX) we don't load a
+ domain. Return the MSGID. */
+ if (strcmp (single_locale, "C") == 0
+ || strcmp (single_locale, "POSIX") == 0)
+ {
+ 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
+ DOMAINNAME and CATEGORY. */
+ domain = _nl_find_domain (dirname, single_locale, xdomainname, binding);
+
+ if (domain != NULL)
+ {
+ retval = _nl_find_msg (domain, binding, msgid1, &retlen);
+
+ if (retval == NULL)
+ {
+ int cnt;
+
+ for (cnt = 0; domain->successor[cnt] != NULL; ++cnt)
+ {
+ retval = _nl_find_msg (domain->successor[cnt], binding,
+ msgid1, &retlen);
+
+ if (retval != NULL)
+ {
+ domain = domain->successor[cnt];
+ break;
+ }
+ }
+ }
+
+ if (retval != NULL)
+ {
+ /* Found the translation of MSGID1 in domain DOMAIN:
+ starting at RETVAL, RETLEN bytes. */
+ FREE_BLOCKS (block_list);
+ __set_errno (saved_errno);
+#if defined HAVE_TSEARCH || defined _LIBC
+ if (foundp == NULL)
+ {
+ /* Create a new entry and add it to the search tree. */
+ struct known_translation_t *newp;
+
+ newp = (struct known_translation_t *)
+ malloc (offsetof (struct known_translation_t, msgid)
+ + msgid_len + domainname_len + 1);
+ if (newp != NULL)
+ {
+ newp->domainname =
+ mempcpy (newp->msgid, msgid1, msgid_len);
+ memcpy (newp->domainname, domainname, domainname_len + 1);
+ newp->category = category;
+ newp->counter = _nl_msg_cat_cntr;
+ newp->domain = domain;
+ newp->translation = retval;
+ newp->translation_length = retlen;
+
+ /* Insert the entry in the search tree. */
+ foundp = (struct known_translation_t **)
+ tsearch (newp, &root, transcmp);
+ if (foundp == NULL
+ || __builtin_expect (*foundp != newp, 0))
+ /* The insert failed. */
+ free (newp);
+ }
+ }
+ else
+ {
+ /* We can update the existing entry. */
+ (*foundp)->counter = _nl_msg_cat_cntr;
+ (*foundp)->domain = domain;
+ (*foundp)->translation = retval;
+ (*foundp)->translation_length = retlen;
+ }
+#endif
+ /* Now deal with plural. */
+ if (plural)
+ retval = plural_lookup (domain, n, retval, retlen);
+
+ __libc_rwlock_unlock (_nl_state_lock);
+ return retval;
+ }
+ }
+ }
+ /* NOTREACHED */
+}
+
+
+char *
+internal_function
+_nl_find_msg (domain_file, domainbinding, msgid, lengthp)
+ struct loaded_l10nfile *domain_file;
+ struct binding *domainbinding;
+ const char *msgid;
+ size_t *lengthp;
+{
+ struct loaded_domain *domain;
+ size_t act;
+ char *result;
+ size_t resultlen;
+
+ if (domain_file->decided == 0)
+ _nl_load_domain (domain_file, domainbinding);
+
+ if (domain_file->data == NULL)
+ return NULL;
+
+ domain = (struct loaded_domain *) domain_file->data;
+
+ /* Locate the MSGID and its translation. */
+ if (domain->hash_size > 2 && domain->hash_tab != NULL)
+ {
+ /* Use the hashing table. */
+ nls_uint32 len = strlen (msgid);
+ nls_uint32 hash_val = hash_string (msgid);
+ nls_uint32 idx = hash_val % domain->hash_size;
+ nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2));
+
+ while (1)
+ {
+ nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]);
+
+ if (nstr == 0)
+ /* Hash table entry is empty. */
+ return NULL;
+
+ /* Compare msgid with the original string at index nstr-1.
+ We compare the lengths with >=, not ==, because plural entries
+ are represented by strings with an embedded NUL. */
+ if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) >= len
+ && (strcmp (msgid,
+ domain->data + W (domain->must_swap,
+ domain->orig_tab[nstr - 1].offset))
+ == 0))
+ {
+ act = nstr - 1;
+ goto found;
+ }
+
+ if (idx >= domain->hash_size - incr)
+ idx -= domain->hash_size - incr;
+ else
+ idx += incr;
+ }
+ /* NOTREACHED */
+ }
+ else
+ {
+ /* Try the default method: binary search in the sorted array of
+ messages. */
+ size_t top, bottom;
+
+ bottom = 0;
+ top = domain->nstrings;
+ while (bottom < top)
+ {
+ int cmp_val;
+
+ act = (bottom + top) / 2;
+ cmp_val = strcmp (msgid, (domain->data
+ + W (domain->must_swap,
+ domain->orig_tab[act].offset)));
+ if (cmp_val < 0)
+ top = act;
+ else if (cmp_val > 0)
+ bottom = act + 1;
+ else
+ goto found;
+ }
+ /* No translation was found. */
+ return NULL;
+ }
+
+ found:
+ /* The translation was found at index ACT. If we have to convert the
+ string to use a different character set, this is the time. */
+ result = ((char *) domain->data
+ + W (domain->must_swap, domain->trans_tab[act].offset));
+ resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1;
+
+#if defined _LIBC || HAVE_ICONV
+ if (domain->codeset_cntr
+ != (domainbinding != NULL ? domainbinding->codeset_cntr : 0))
+ {
+ /* The domain's codeset has changed through bind_textdomain_codeset()
+ since the message catalog was initialized or last accessed. We
+ have to reinitialize the converter. */
+ _nl_free_domain_conv (domain);
+ _nl_init_domain_conv (domain_file, domain, domainbinding);
+ }
+
+ if (
+# ifdef _LIBC
+ domain->conv != (__gconv_t) -1
+# else
+# if HAVE_ICONV
+ domain->conv != (iconv_t) -1
+# endif
+# endif
+ )
+ {
+ /* We are supposed to do a conversion. First allocate an
+ appropriate table with the same structure as the table
+ of translations in the file, where we can put the pointers
+ to the converted strings in.
+ There is a slight complication with plural entries. They
+ are represented by consecutive NUL terminated strings. We
+ handle this case by converting RESULTLEN bytes, including
+ NULs. */
+
+ if (domain->conv_tab == NULL
+ && ((domain->conv_tab = (char **) calloc (domain->nstrings,
+ sizeof (char *)))
+ == NULL))
+ /* Mark that we didn't succeed allocating a table. */
+ domain->conv_tab = (char **) -1;
+
+ if (__builtin_expect (domain->conv_tab == (char **) -1, 0))
+ /* Nothing we can do, no more memory. */
+ goto converted;
+
+ if (domain->conv_tab[act] == NULL)
+ {
+ /* We haven't used this string so far, so it is not
+ translated yet. Do this now. */
+ /* We use a bit more efficient memory handling.
+ We allocate always larger blocks which get used over
+ time. This is faster than many small allocations. */
+ __libc_lock_define_initialized (static, lock)
+# define INITIAL_BLOCK_SIZE 4080
+ static unsigned char *freemem;
+ static size_t freemem_size;
+
+ const unsigned char *inbuf;
+ unsigned char *outbuf;
+ int malloc_count;
+# ifndef _LIBC
+ transmem_block_t *transmem_list = NULL;
+# endif
+
+ __libc_lock_lock (lock);
+
+ inbuf = (const unsigned char *) result;
+ outbuf = freemem + sizeof (size_t);
+
+ malloc_count = 0;
+ while (1)
+ {
+ transmem_block_t *newmem;
+# ifdef _LIBC
+ size_t non_reversible;
+ int res;
+
+ if (freemem_size < sizeof (size_t))
+ goto resize_freemem;
+
+ res = __gconv (domain->conv,
+ &inbuf, inbuf + resultlen,
+ &outbuf,
+ outbuf + freemem_size - sizeof (size_t),
+ &non_reversible);
+
+ if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT)
+ break;
+
+ if (res != __GCONV_FULL_OUTPUT)
+ {
+ __libc_lock_unlock (lock);
+ goto converted;
+ }
+
+ inbuf = result;
+# else
+# if HAVE_ICONV
+ const char *inptr = (const char *) inbuf;
+ size_t inleft = resultlen;
+ char *outptr = (char *) outbuf;
+ size_t outleft;
+
+ if (freemem_size < sizeof (size_t))
+ goto resize_freemem;
+
+ outleft = freemem_size - sizeof (size_t);
+ if (iconv (domain->conv,
+ (ICONV_CONST char **) &inptr, &inleft,
+ &outptr, &outleft)
+ != (size_t) (-1))
+ {
+ outbuf = (unsigned char *) outptr;
+ break;
+ }
+ if (errno != E2BIG)
+ {
+ __libc_lock_unlock (lock);
+ goto converted;
+ }
+# endif
+# endif
+
+ resize_freemem:
+ /* We must allocate a new buffer or resize the old one. */
+ if (malloc_count > 0)
+ {
+ ++malloc_count;
+ freemem_size = malloc_count * INITIAL_BLOCK_SIZE;
+ newmem = (transmem_block_t *) realloc (transmem_list,
+ freemem_size);
+# ifdef _LIBC
+ if (newmem != NULL)
+ transmem_list = transmem_list->next;
+ else
+ {
+ struct transmem_list *old = transmem_list;
+
+ transmem_list = transmem_list->next;
+ free (old);
+ }
+# endif
+ }
+ else
+ {
+ malloc_count = 1;
+ freemem_size = INITIAL_BLOCK_SIZE;
+ newmem = (transmem_block_t *) malloc (freemem_size);
+ }
+ if (__builtin_expect (newmem == NULL, 0))
+ {
+ freemem = NULL;
+ freemem_size = 0;
+ __libc_lock_unlock (lock);
+ goto converted;
+ }
+
+# ifdef _LIBC
+ /* Add the block to the list of blocks we have to free
+ at some point. */
+ newmem->next = transmem_list;
+ transmem_list = newmem;
+
+ freemem = newmem->data;
+ freemem_size -= offsetof (struct transmem_list, data);
+# else
+ transmem_list = newmem;
+ freemem = newmem;
+# endif
+
+ outbuf = freemem + sizeof (size_t);
+ }
+
+ /* We have now in our buffer a converted string. Put this
+ into the table of conversions. */
+ *(size_t *) freemem = outbuf - freemem - sizeof (size_t);
+ domain->conv_tab[act] = (char *) freemem;
+ /* Shrink freemem, but keep it aligned. */
+ freemem_size -= outbuf - freemem;
+ freemem = outbuf;
+ freemem += freemem_size & (alignof (size_t) - 1);
+ freemem_size = freemem_size & ~ (alignof (size_t) - 1);
+
+ __libc_lock_unlock (lock);
+ }
+
+ /* Now domain->conv_tab[act] contains the translation of all
+ the plural variants. */
+ result = domain->conv_tab[act] + sizeof (size_t);
+ resultlen = *(size_t *) domain->conv_tab[act];
+ }
+
+ converted:
+ /* The result string is converted. */
+
+#endif /* _LIBC || HAVE_ICONV */
+
+ *lengthp = resultlen;
+ return result;
+}
+
+
+/* Look up a plural variant. */
+static char *
+internal_function
+plural_lookup (domain, n, translation, translation_len)
+ struct loaded_l10nfile *domain;
+ unsigned long int n;
+ const char *translation;
+ size_t translation_len;
+{
+ struct loaded_domain *domaindata = (struct loaded_domain *) domain->data;
+ unsigned long int index;
+ const char *p;
+
+ index = plural_eval (domaindata->plural, n);
+ if (index >= domaindata->nplurals)
+ /* This should never happen. It means the plural expression and the
+ given maximum value do not match. */
+ index = 0;
+
+ /* Skip INDEX strings at TRANSLATION. */
+ p = translation;
+ while (index-- > 0)
+ {
+#ifdef _LIBC
+ p = __rawmemchr (p, '\0');
+#else
+ p = strchr (p, '\0');
+#endif
+ /* And skip over the NUL byte. */
+ p++;
+
+ if (p >= translation + translation_len)
+ /* This should never happen. It means the plural expression
+ evaluated to a value larger than the number of variants
+ available for MSGID1. */
+ return (char *) translation;
+ }
+ return (char *) p;
+}
+
+
+/* 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. */
+static const char *
+internal_function
+category_to_name (category)
+ int category;
+{
+ const char *retval;
+
+ switch (category)
+ {
+#ifdef LC_COLLATE
+ case LC_COLLATE:
+ retval = "LC_COLLATE";
+ break;
+#endif
+#ifdef LC_CTYPE
+ case LC_CTYPE:
+ retval = "LC_CTYPE";
+ break;
+#endif
+#ifdef LC_MONETARY
+ case LC_MONETARY:
+ retval = "LC_MONETARY";
+ break;
+#endif
+#ifdef LC_NUMERIC
+ case LC_NUMERIC:
+ retval = "LC_NUMERIC";
+ break;
+#endif
+#ifdef LC_TIME
+ case LC_TIME:
+ retval = "LC_TIME";
+ break;
+#endif
+#ifdef LC_MESSAGES
+ case LC_MESSAGES:
+ retval = "LC_MESSAGES";
+ break;
+#endif
+#ifdef LC_RESPONSE
+ case LC_RESPONSE:
+ retval = "LC_RESPONSE";
+ break;
+#endif
+#ifdef LC_ALL
+ case LC_ALL:
+ /* This might not make sense but is perhaps better than any other
+ value. */
+ retval = "LC_ALL";
+ break;
+#endif
+ default:
+ /* If you have a better idea for a default value let me know. */
+ retval = "LC_XXX";
+ }
+
+ return retval;
+}
+
+/* Guess value of current locale from value of the environment variables. */
+static const char *
+internal_function
+guess_category_value (category, categoryname)
+ int category;
+ const char *categoryname;
+{
+ const char *language;
+ const char *retval;
+
+ /* The highest priority value is the `LANGUAGE' environment
+ variable. But we don't use the value if the currently selected
+ locale is the C locale. This is a GNU extension. */
+ language = getenv ("LANGUAGE");
+ if (language != NULL && language[0] == '\0')
+ language = NULL;
+
+ /* 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
+ `setlocale' function itself. */
+#if defined _LIBC || (defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL)
+ retval = setlocale (category, NULL);
+#else
+ /* Setting of LC_ALL overwrites all other. */
+ 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
+
+ return language != NULL && strcmp (retval, "C") != 0 ? language : retval;
+}
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library. So we
+ avoid the non-standard function stpcpy. In GNU C Library this
+ function is available, though. Also allow the symbol HAVE_STPCPY
+ to be defined. */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+ char *dest;
+ const char *src;
+{
+ while ((*dest++ = *src++) != '\0')
+ /* Do nothing. */ ;
+ return dest - 1;
+}
+#endif
+
+#if !_LIBC && !HAVE_MEMPCPY
+static void *
+mempcpy (dest, src, n)
+ void *dest;
+ const void *src;
+ size_t n;
+{
+ return (void *) ((char *) memcpy (dest, src, n) + n);
+}
+#endif
+
+
+#ifdef _LIBC
+/* If we want to free all resources we have to do some work at
+ program's end. */
+static void __attribute__ ((unused))
+free_mem (void)
+{
+ void *old;
+
+ while (_nl_domain_bindings != NULL)
+ {
+ struct binding *oldp = _nl_domain_bindings;
+ _nl_domain_bindings = _nl_domain_bindings->next;
+ if (oldp->dirname != _nl_default_dirname)
+ /* Yes, this is a pointer comparison. */
+ free (oldp->dirname);
+ free (oldp->codeset);
+ free (oldp);
+ }
+
+ if (_nl_current_default_domain != _nl_default_default_domain)
+ /* Yes, again a pointer comparison. */
+ free ((char *) _nl_current_default_domain);
+
+ /* Remove the search tree with the known translations. */
+ __tdestroy (root, free);
+ root = NULL;
+
+ while (transmem_list != NULL)
+ {
+ old = transmem_list;
+ transmem_list = transmem_list->next;
+ free (old);
+ }
+}
+
+text_set_element (__libc_subfreeres, free_mem);
+#endif
diff --git a/intl/dcngettext.c b/intl/dcngettext.c
new file mode 100644
index 000000000..e5da25775
--- /dev/null
+++ b/intl/dcngettext.c
@@ -0,0 +1,59 @@
+/* Implementation of the dcngettext(3) function.
+ Copyright (C) 1995-1999, 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define DCNGETTEXT __dcngettext
+# define DCIGETTEXT __dcigettext
+#else
+# define DCNGETTEXT dcngettext__
+# define DCIGETTEXT dcigettext__
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+ locale. */
+char *
+DCNGETTEXT (domainname, msgid1, msgid2, n, category)
+ const char *domainname;
+ const char *msgid1;
+ const char *msgid2;
+ unsigned long int n;
+ int category;
+{
+ return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__dcngettext, dcngettext);
+#endif
diff --git a/intl/dgettext.c b/intl/dgettext.c
new file mode 100644
index 000000000..c5130411d
--- /dev/null
+++ b/intl/dgettext.c
@@ -0,0 +1,58 @@
+/* Implementation of the dgettext(3) function.
+ Copyright (C) 1995-1997, 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <locale.h>
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define DGETTEXT __dgettext
+# define DCGETTEXT __dcgettext
+#else
+# define DGETTEXT dgettext__
+# define DCGETTEXT dcgettext__
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog of the current
+ LC_MESSAGES locale. */
+char *
+DGETTEXT (domainname, msgid)
+ const char *domainname;
+ const char *msgid;
+{
+ return DCGETTEXT (domainname, msgid, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__dgettext, dgettext);
+#endif
diff --git a/intl/dngettext.c b/intl/dngettext.c
new file mode 100644
index 000000000..79aaa9ae6
--- /dev/null
+++ b/intl/dngettext.c
@@ -0,0 +1,60 @@
+/* Implementation of the dngettext(3) function.
+ Copyright (C) 1995-1997, 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <locale.h>
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define DNGETTEXT __dngettext
+# define DCNGETTEXT __dcngettext
+#else
+# define DNGETTEXT dngettext__
+# define DCNGETTEXT dcngettext__
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog of the current
+ LC_MESSAGES locale and skip message according to the plural form. */
+char *
+DNGETTEXT (domainname, msgid1, msgid2, n)
+ const char *domainname;
+ const char *msgid1;
+ const char *msgid2;
+ unsigned long int n;
+{
+ return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__dngettext, dngettext);
+#endif
diff --git a/intl/explodename.c b/intl/explodename.c
new file mode 100644
index 000000000..c4ddcc41a
--- /dev/null
+++ b/intl/explodename.c
@@ -0,0 +1,191 @@
+/* Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found. Sigh! */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+# define NULL ((void *) 0)
+# else
+# define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+char *
+_nl_find_language (name)
+ const char *name;
+{
+ while (name[0] != '\0' && name[0] != '_' && name[0] != '@'
+ && name[0] != '+' && name[0] != ',')
+ ++name;
+
+ return (char *) name;
+}
+
+
+int
+_nl_explode_name (name, language, modifier, territory, codeset,
+ normalized_codeset, special, sponsor, revision)
+ char *name;
+ const char **language;
+ const char **modifier;
+ const char **territory;
+ const char **codeset;
+ const char **normalized_codeset;
+ const char **special;
+ const char **sponsor;
+ const char **revision;
+{
+ enum { undecided, xpg, cen } syntax;
+ char *cp;
+ int mask;
+
+ *modifier = NULL;
+ *territory = NULL;
+ *codeset = NULL;
+ *normalized_codeset = NULL;
+ *special = NULL;
+ *sponsor = NULL;
+ *revision = NULL;
+
+ /* Now we determine the single parts of the locale name. First
+ look for the language. Termination symbols are `_' and `@' if
+ we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */
+ mask = 0;
+ syntax = undecided;
+ *language = cp = name;
+ cp = _nl_find_language (*language);
+
+ if (*language == cp)
+ /* This does not make sense: language has to be specified. Use
+ this entry as it is without exploding. Perhaps it is an alias. */
+ cp = strchr (*language, '\0');
+ else if (cp[0] == '_')
+ {
+ /* Next is the territory. */
+ cp[0] = '\0';
+ *territory = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
+ && cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
+ ++cp;
+
+ mask |= TERRITORY;
+
+ if (cp[0] == '.')
+ {
+ /* Next is the codeset. */
+ syntax = xpg;
+ cp[0] = '\0';
+ *codeset = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != '@')
+ ++cp;
+
+ mask |= XPG_CODESET;
+
+ if (*codeset != cp && (*codeset)[0] != '\0')
+ {
+ *normalized_codeset = _nl_normalize_codeset (*codeset,
+ cp - *codeset);
+ if (strcmp (*codeset, *normalized_codeset) == 0)
+ free ((char *) *normalized_codeset);
+ else
+ mask |= XPG_NORM_CODESET;
+ }
+ }
+ }
+
+ if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
+ {
+ /* Next is the modifier. */
+ syntax = cp[0] == '@' ? xpg : cen;
+ cp[0] = '\0';
+ *modifier = ++cp;
+
+ while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
+ && cp[0] != ',' && cp[0] != '_')
+ ++cp;
+
+ mask |= XPG_MODIFIER | CEN_AUDIENCE;
+ }
+
+ if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
+ {
+ syntax = cen;
+
+ if (cp[0] == '+')
+ {
+ /* Next is special application (CEN syntax). */
+ cp[0] = '\0';
+ *special = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
+ ++cp;
+
+ mask |= CEN_SPECIAL;
+ }
+
+ if (cp[0] == ',')
+ {
+ /* Next is sponsor (CEN syntax). */
+ cp[0] = '\0';
+ *sponsor = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != '_')
+ ++cp;
+
+ mask |= CEN_SPONSOR;
+ }
+
+ if (cp[0] == '_')
+ {
+ /* Next is revision (CEN syntax). */
+ cp[0] = '\0';
+ *revision = ++cp;
+
+ mask |= CEN_REVISION;
+ }
+ }
+
+ /* For CEN syntax values it might be important to have the
+ separator character in the file name, not for XPG syntax. */
+ if (syntax == xpg)
+ {
+ if (*territory != NULL && (*territory)[0] == '\0')
+ mask &= ~TERRITORY;
+
+ if (*codeset != NULL && (*codeset)[0] == '\0')
+ mask &= ~XPG_CODESET;
+
+ if (*modifier != NULL && (*modifier)[0] == '\0')
+ mask &= ~XPG_MODIFIER;
+ }
+
+ return mask;
+}
diff --git a/intl/finddomain.c b/intl/finddomain.c
new file mode 100644
index 000000000..4882554fc
--- /dev/null
+++ b/intl/finddomain.c
@@ -0,0 +1,197 @@
+/* Handle list of needed message catalogs
+ Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper@gnu.org>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+/* List of already loaded domains. */
+static struct loaded_l10nfile *_nl_loaded_domains;
+
+
+/* Return a data structure describing the message catalog described by
+ the DOMAINNAME and CATEGORY parameters with respect to the currently
+ established bindings. */
+struct loaded_l10nfile *
+internal_function
+_nl_find_domain (dirname, locale, domainname, domainbinding)
+ const char *dirname;
+ char *locale;
+ const char *domainname;
+ struct binding *domainbinding;
+{
+ struct loaded_l10nfile *retval;
+ const char *language;
+ const char *modifier;
+ const char *territory;
+ const char *codeset;
+ const char *normalized_codeset;
+ const char *special;
+ const char *sponsor;
+ const char *revision;
+ const char *alias_value;
+ int mask;
+
+ /* LOCALE can consist of up to four recognized parts for the XPG syntax:
+
+ language[_territory[.codeset]][@modifier]
+
+ and six parts for the CEN syntax:
+
+ language[_territory][+audience][+special][,[sponsor][_revision]]
+
+ Beside the first part all of them are allowed to be missing. If
+ the full specified locale is not found, the less specific one are
+ looked for. The various parts will be stripped off according to
+ the following order:
+ (1) revision
+ (2) sponsor
+ (3) special
+ (4) codeset
+ (5) normalized codeset
+ (6) territory
+ (7) audience/modifier
+ */
+
+ /* If we have already tested for this locale entry there has to
+ be one data set in the list of loaded domains. */
+ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+ strlen (dirname) + 1, 0, locale, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, domainname, 0);
+ if (retval != NULL)
+ {
+ /* We know something about this locale. */
+ int cnt;
+
+ if (retval->decided == 0)
+ _nl_load_domain (retval, domainbinding);
+
+ if (retval->data != NULL)
+ return retval;
+
+ for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+ {
+ if (retval->successor[cnt]->decided == 0)
+ _nl_load_domain (retval->successor[cnt], domainbinding);
+
+ if (retval->successor[cnt]->data != NULL)
+ break;
+ }
+ return cnt >= 0 ? retval : NULL;
+ /* NOTREACHED */
+ }
+
+ /* See whether the locale value is an alias. If yes its value
+ *overwrites* the alias name. No test for the original value is
+ done. */
+ alias_value = _nl_expand_alias (locale);
+ if (alias_value != NULL)
+ {
+#if defined _LIBC || defined HAVE_STRDUP
+ locale = strdup (alias_value);
+ if (locale == NULL)
+ return NULL;
+#else
+ size_t len = strlen (alias_value) + 1;
+ locale = (char *) malloc (len);
+ if (locale == NULL)
+ return NULL;
+
+ memcpy (locale, alias_value, len);
+#endif
+ }
+
+ /* Now we determine the single parts of the locale name. First
+ look for the language. Termination symbols are `_' and `@' if
+ we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */
+ mask = _nl_explode_name (locale, &language, &modifier, &territory,
+ &codeset, &normalized_codeset, &special,
+ &sponsor, &revision);
+
+ /* Create all possible locale entries which might be interested in
+ generalization. */
+ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+ strlen (dirname) + 1, mask, language, territory,
+ codeset, normalized_codeset, modifier, special,
+ sponsor, revision, domainname, 1);
+ if (retval == NULL)
+ /* This means we are out of core. */
+ return NULL;
+
+ if (retval->decided == 0)
+ _nl_load_domain (retval, domainbinding);
+ if (retval->data == NULL)
+ {
+ int cnt;
+ for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+ {
+ if (retval->successor[cnt]->decided == 0)
+ _nl_load_domain (retval->successor[cnt], domainbinding);
+ if (retval->successor[cnt]->data != NULL)
+ break;
+ }
+ }
+
+ /* The room for an alias was dynamically allocated. Free it now. */
+ if (alias_value != NULL)
+ free (locale);
+
+ /* The space for normalized_codeset is dynamically allocated. Free it. */
+ if (mask & XPG_NORM_CODESET)
+ free ((void *) normalized_codeset);
+
+ return retval;
+}
+
+
+#ifdef _LIBC
+static void __attribute__ ((unused))
+free_mem (void)
+{
+ struct loaded_l10nfile *runp = _nl_loaded_domains;
+
+ while (runp != NULL)
+ {
+ struct loaded_l10nfile *here = runp;
+ if (runp->data != NULL)
+ _nl_unload_domain ((struct loaded_domain *) runp->data);
+ runp = runp->next;
+ free ((char *) here->filename);
+ free (here);
+ }
+}
+
+text_set_element (__libc_subfreeres, free_mem);
+#endif
diff --git a/intl/gettext.c b/intl/gettext.c
new file mode 100644
index 000000000..a64020553
--- /dev/null
+++ b/intl/gettext.c
@@ -0,0 +1,63 @@
+/* Implementation of gettext(3) function.
+ Copyright (C) 1995, 1997, 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _LIBC
+# define __need_NULL
+# include <stddef.h>
+#else
+# include <stdlib.h> /* Just for NULL. */
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define GETTEXT __gettext
+# define DCGETTEXT __dcgettext
+#else
+# define GETTEXT gettext__
+# define DCGETTEXT dcgettext__
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+ LC_MESSAGES locale. If not found, returns MSGID itself (the default
+ text). */
+char *
+GETTEXT (msgid)
+ const char *msgid;
+{
+ return DCGETTEXT (NULL, msgid, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__gettext, gettext);
+#endif
diff --git a/intl/gettext.h b/intl/gettext.h
new file mode 100644
index 000000000..eb5889074
--- /dev/null
+++ b/intl/gettext.h
@@ -0,0 +1,101 @@
+/* Description of GNU message catalog format: general file layout.
+ Copyright (C) 1995, 1997, 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef _GETTEXT_H
+#define _GETTEXT_H 1
+
+#if HAVE_LIMITS_H || _LIBC
+# include <limits.h>
+#endif
+
+/* @@ end of prolog @@ */
+
+/* The magic number of the GNU message catalog format. */
+#define _MAGIC 0x950412de
+#define _MAGIC_SWAPPED 0xde120495
+
+/* Revision number of the currently used .mo (binary) file format. */
+#define MO_REVISION_NUMBER 0
+
+/* The following contortions are an attempt to use the C preprocessor
+ to determine an unsigned integral type that is 32 bits wide. An
+ alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
+ as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work
+ when cross-compiling. */
+
+#if __STDC__
+# define UINT_MAX_32_BITS 4294967295U
+#else
+# define UINT_MAX_32_BITS 0xFFFFFFFF
+#endif
+
+/* If UINT_MAX isn't defined, assume it's a 32-bit type.
+ This should be valid for all systems GNU cares about because
+ that doesn't include 16-bit systems, and only modern systems
+ (that certainly have <limits.h>) have 64+-bit integral types. */
+
+#ifndef UINT_MAX
+# define UINT_MAX UINT_MAX_32_BITS
+#endif
+
+#if UINT_MAX == UINT_MAX_32_BITS
+typedef unsigned nls_uint32;
+#else
+# if USHRT_MAX == UINT_MAX_32_BITS
+typedef unsigned short nls_uint32;
+# else
+# if ULONG_MAX == UINT_MAX_32_BITS
+typedef unsigned long nls_uint32;
+# else
+ /* The following line is intended to throw an error. Using #error is
+ not portable enough. */
+ "Cannot determine unsigned 32-bit data type."
+# endif
+# endif
+#endif
+
+
+/* Header for binary .mo file format. */
+struct mo_file_header
+{
+ /* The magic number. */
+ nls_uint32 magic;
+ /* The revision number of the file format. */
+ nls_uint32 revision;
+ /* The number of strings pairs. */
+ nls_uint32 nstrings;
+ /* Offset of table with start offsets of original strings. */
+ nls_uint32 orig_tab_offset;
+ /* Offset of table with start offsets of translation strings. */
+ nls_uint32 trans_tab_offset;
+ /* Size of hashing table. */
+ nls_uint32 hash_tab_size;
+ /* Offset of first hashing entry. */
+ nls_uint32 hash_tab_offset;
+};
+
+struct string_desc
+{
+ /* Length of addressed string. */
+ nls_uint32 length;
+ /* Offset of string in file. */
+ nls_uint32 offset;
+};
+
+/* @@ begin of epilog @@ */
+
+#endif /* gettext.h */
diff --git a/intl/gettextP.h b/intl/gettextP.h
new file mode 100644
index 000000000..ee8ca48e9
--- /dev/null
+++ b/intl/gettextP.h
@@ -0,0 +1,251 @@
+/* Header describing internals of libintl library.
+ Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef _GETTEXTP_H
+#define _GETTEXTP_H
+
+#include <stddef.h> /* Get size_t. */
+
+#ifdef _LIBC
+# include "../iconv/gconv_int.h"
+#else
+# if HAVE_ICONV
+# include <iconv.h>
+# endif
+#endif
+
+#include "loadinfo.h"
+
+#include "gettext.h" /* Get nls_uint32. */
+
+/* @@ end of prolog @@ */
+
+#ifndef PARAMS
+# if __STDC__
+# define PARAMS(args) args
+# else
+# define PARAMS(args) ()
+# endif
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+/* Tell the compiler when a conditional or integer expression is
+ almost always true or almost always false. */
+#ifndef HAVE_BUILTIN_EXPECT
+# define __builtin_expect(expr, val) (expr)
+#endif
+
+#ifndef W
+# define W(flag, data) ((flag) ? SWAP (data) : (data))
+#endif
+
+
+#ifdef _LIBC
+# include <byteswap.h>
+# define SWAP(i) bswap_32 (i)
+#else
+static inline nls_uint32
+SWAP (i)
+ nls_uint32 i;
+{
+ return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
+}
+#endif
+
+
+/* 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, /* 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. */
+struct loaded_domain
+{
+ const char *data;
+ int use_mmap;
+ size_t mmap_size;
+ int must_swap;
+ nls_uint32 nstrings;
+ struct string_desc *orig_tab;
+ struct string_desc *trans_tab;
+ nls_uint32 hash_size;
+ nls_uint32 *hash_tab;
+ int codeset_cntr;
+#ifdef _LIBC
+ __gconv_t conv;
+#else
+# if HAVE_ICONV
+ iconv_t conv;
+# endif
+#endif
+ char **conv_tab;
+
+ struct expression *plural;
+ unsigned long int nplurals;
+};
+
+/* We want to allocate a string at the end of the struct. But ISO C
+ doesn't allow zero sized arrays. */
+#ifdef __GNUC__
+# define ZERO 0
+#else
+# define ZERO 1
+#endif
+
+/* A set of settings bound to a message domain. Used to store settings
+ from bindtextdomain() and bind_textdomain_codeset(). */
+struct binding
+{
+ struct binding *next;
+ char *dirname;
+ int codeset_cntr; /* Incremented each time codeset changes. */
+ char *codeset;
+ char domainname[ZERO];
+};
+
+/* A counter which is incremented each time some previous translations
+ become invalid.
+ This variable is part of the external ABI of the GNU libintl. */
+extern int _nl_msg_cat_cntr;
+
+struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname,
+ char *__locale,
+ 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
+
+#ifdef _LIBC
+extern void __gettext_free_exp PARAMS ((struct expression *exp))
+ internal_function;
+extern int __gettextparse PARAMS ((void *arg));
+#else
+extern void gettext_free_exp__ PARAMS ((struct expression *exp))
+ internal_function;
+extern int gettextparse__ PARAMS ((void *arg));
+#endif
+
+/* @@ begin of epilog @@ */
+
+#endif /* gettextP.h */
diff --git a/intl/hash-string.h b/intl/hash-string.h
new file mode 100644
index 000000000..37d4ce1a2
--- /dev/null
+++ b/intl/hash-string.h
@@ -0,0 +1,58 @@
+/* Description of GNU message catalog format: string hashing function.
+ Copyright (C) 1995, 1997, 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* @@ 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. */
+#define HASHWORDBITS 32
+
+
+/* Defines the so called `hashpjw' function by P.J. Weinberger
+ [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
+ 1986, 1987 Bell Telephone Laboratories, Inc.] */
+static unsigned long int hash_string PARAMS ((const char *__str_param));
+
+static inline unsigned long int
+hash_string (str_param)
+ const char *str_param;
+{
+ unsigned long int hval, g;
+ const char *str = str_param;
+
+ /* Compute the hash value for the given string. */
+ hval = 0;
+ while (*str != '\0')
+ {
+ hval <<= 4;
+ hval += (unsigned long int) *str++;
+ g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
+ if (g != 0)
+ {
+ hval ^= g >> (HASHWORDBITS - 8);
+ hval ^= g;
+ }
+ }
+ return hval;
+}
diff --git a/intl/intl-compat.c b/intl/intl-compat.c
new file mode 100644
index 000000000..b8edaa17a
--- /dev/null
+++ b/intl/intl-compat.c
@@ -0,0 +1,165 @@
+/* intl-compat.c - Stub functions to call gettext functions from GNU gettext
+ Library.
+ Copyright (C) 1995, 2000, 2001 Software Foundation, Inc.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libgnuintl.h"
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+/* This file redirects the gettext functions (without prefix or suffix) to
+ those defined in the included GNU gettext library (with "__" suffix).
+ It is compiled into libintl when the included GNU gettext library is
+ configured --with-included-gettext.
+
+ This redirection works also in the case that the system C library or
+ the system libintl library contain gettext/textdomain/... functions.
+ If it didn't, we would need to add preprocessor level redirections to
+ 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 dgettext
+#undef dcgettext
+#undef ngettext
+#undef dngettext
+#undef dcngettext
+#undef textdomain
+#undef bindtextdomain
+#undef bind_textdomain_codeset
+
+
+char *
+gettext (msgid)
+ const char *msgid;
+{
+ return gettext__ (msgid);
+}
+
+
+char *
+dgettext (domainname, msgid)
+ const char *domainname;
+ const char *msgid;
+{
+ return dgettext__ (domainname, msgid);
+}
+
+
+char *
+dcgettext (domainname, msgid, category)
+ const char *domainname;
+ const char *msgid;
+ int category;
+{
+ return dcgettext__ (domainname, msgid, category);
+}
+
+
+char *
+ngettext (msgid1, msgid2, n)
+ const char *msgid1;
+ const char *msgid2;
+ unsigned long int n;
+{
+ return ngettext__ (msgid1, msgid2, n);
+}
+
+
+char *
+dngettext (domainname, msgid1, msgid2, n)
+ const char *domainname;
+ const char *msgid1;
+ const char *msgid2;
+ unsigned long int n;
+{
+ return dngettext__ (domainname, msgid1, msgid2, n);
+}
+
+
+char *
+dcngettext (domainname, msgid1, msgid2, n, category)
+ const char *domainname;
+ const char *msgid1;
+ const char *msgid2;
+ unsigned long int n;
+ int category;
+{
+ return dcngettext__ (domainname, msgid1, msgid2, n, category);
+}
+
+
+char *
+textdomain (domainname)
+ const char *domainname;
+{
+ return textdomain__ (domainname);
+}
+
+
+char *
+bindtextdomain (domainname, dirname)
+ const char *domainname;
+ const char *dirname;
+{
+ return bindtextdomain__ (domainname, dirname);
+}
+
+
+char *
+bind_textdomain_codeset (domainname, codeset)
+ const char *domainname;
+ const char *codeset;
+{
+ return bind_textdomain_codeset__ (domainname, codeset);
+}
diff --git a/intl/l10nflist.c b/intl/l10nflist.c
new file mode 100644
index 000000000..557253eb9
--- /dev/null
+++ b/intl/l10nflist.c
@@ -0,0 +1,404 @@
+/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* Tell glibc's <string.h> to provide a prototype for stpcpy().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+# define strchr index
+# endif
+#endif
+
+#if defined _LIBC || defined HAVE_ARGZ_H
+# include <argz.h>
+#endif
+#include <ctype.h>
+#include <sys/types.h>
+#include <stdlib.h>
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found. Sigh! */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+# define NULL ((void *) 0)
+# else
+# define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions. This is required by the standard
+ because some ANSI C functions will require linking with this object
+ file and the name space must not be polluted. */
+# ifndef stpcpy
+# define stpcpy(dest, src) __stpcpy(dest, src)
+# endif
+#else
+# ifndef HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+# endif
+#endif
+
+/* Define function which are usually not available. */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_COUNT
+/* Returns the number of strings in ARGZ. */
+static size_t argz_count__ PARAMS ((const char *argz, size_t len));
+
+static size_t
+argz_count__ (argz, len)
+ const char *argz;
+ size_t len;
+{
+ size_t count = 0;
+ while (len > 0)
+ {
+ size_t part_len = strlen (argz);
+ argz += part_len + 1;
+ len -= part_len + 1;
+ count++;
+ }
+ return count;
+}
+# undef __argz_count
+# define __argz_count(argz, len) argz_count__ (argz, len)
+#endif /* !_LIBC && !HAVE___ARGZ_COUNT */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY
+/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
+ except the last into the character SEP. */
+static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep));
+
+static void
+argz_stringify__ (argz, len, sep)
+ char *argz;
+ size_t len;
+ int sep;
+{
+ while (len > 0)
+ {
+ size_t part_len = strlen (argz);
+ argz += part_len;
+ len -= part_len + 1;
+ if (len > 0)
+ *argz++ = sep;
+ }
+}
+# undef __argz_stringify
+# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
+#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_NEXT
+static char *argz_next__ PARAMS ((char *argz, size_t argz_len,
+ const char *entry));
+
+static char *
+argz_next__ (argz, argz_len, entry)
+ char *argz;
+ size_t argz_len;
+ const char *entry;
+{
+ if (entry)
+ {
+ if (entry < argz + argz_len)
+ entry = strchr (entry, '\0') + 1;
+
+ return entry >= argz + argz_len ? NULL : (char *) entry;
+ }
+ else
+ if (argz_len > 0)
+ return argz;
+ else
+ return 0;
+}
+# undef __argz_next
+# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry)
+#endif /* !_LIBC && !HAVE___ARGZ_NEXT */
+
+
+/* Return number of bits set in X. */
+static int pop PARAMS ((int x));
+
+static inline int
+pop (x)
+ int x;
+{
+ /* We assume that no more than 16 bits are used. */
+ x = ((x & ~0x5555) >> 1) + (x & 0x5555);
+ x = ((x & ~0x3333) >> 2) + (x & 0x3333);
+ x = ((x >> 4) + x) & 0x0f0f;
+ x = ((x >> 8) + x) & 0xff;
+
+ return x;
+}
+
+
+struct loaded_l10nfile *
+_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
+ territory, codeset, normalized_codeset, modifier, special,
+ sponsor, revision, filename, do_allocate)
+ struct loaded_l10nfile **l10nfile_list;
+ const char *dirlist;
+ size_t dirlist_len;
+ int mask;
+ const char *language;
+ const char *territory;
+ const char *codeset;
+ const char *normalized_codeset;
+ const char *modifier;
+ const char *special;
+ const char *sponsor;
+ const char *revision;
+ const char *filename;
+ int do_allocate;
+{
+ char *abs_filename;
+ struct loaded_l10nfile *last = NULL;
+ struct loaded_l10nfile *retval;
+ char *cp;
+ size_t entries;
+ int cnt;
+
+ /* Allocate room for the full file name. */
+ abs_filename = (char *) malloc (dirlist_len
+ + strlen (language)
+ + ((mask & TERRITORY) != 0
+ ? strlen (territory) + 1 : 0)
+ + ((mask & XPG_CODESET) != 0
+ ? strlen (codeset) + 1 : 0)
+ + ((mask & XPG_NORM_CODESET) != 0
+ ? strlen (normalized_codeset) + 1 : 0)
+ + (((mask & XPG_MODIFIER) != 0
+ || (mask & CEN_AUDIENCE) != 0)
+ ? strlen (modifier) + 1 : 0)
+ + ((mask & CEN_SPECIAL) != 0
+ ? strlen (special) + 1 : 0)
+ + (((mask & CEN_SPONSOR) != 0
+ || (mask & CEN_REVISION) != 0)
+ ? (1 + ((mask & CEN_SPONSOR) != 0
+ ? strlen (sponsor) + 1 : 0)
+ + ((mask & CEN_REVISION) != 0
+ ? strlen (revision) + 1 : 0)) : 0)
+ + 1 + strlen (filename) + 1);
+
+ if (abs_filename == NULL)
+ return NULL;
+
+ retval = NULL;
+ last = NULL;
+
+ /* Construct file name. */
+ memcpy (abs_filename, dirlist, dirlist_len);
+ __argz_stringify (abs_filename, dirlist_len, PATH_SEPARATOR);
+ cp = abs_filename + (dirlist_len - 1);
+ *cp++ = '/';
+ cp = stpcpy (cp, language);
+
+ if ((mask & TERRITORY) != 0)
+ {
+ *cp++ = '_';
+ cp = stpcpy (cp, territory);
+ }
+ if ((mask & XPG_CODESET) != 0)
+ {
+ *cp++ = '.';
+ cp = stpcpy (cp, codeset);
+ }
+ if ((mask & XPG_NORM_CODESET) != 0)
+ {
+ *cp++ = '.';
+ cp = stpcpy (cp, normalized_codeset);
+ }
+ if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0)
+ {
+ /* This component can be part of both syntaces but has different
+ leading characters. For CEN we use `+', else `@'. */
+ *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@';
+ cp = stpcpy (cp, modifier);
+ }
+ if ((mask & CEN_SPECIAL) != 0)
+ {
+ *cp++ = '+';
+ cp = stpcpy (cp, special);
+ }
+ if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0)
+ {
+ *cp++ = ',';
+ if ((mask & CEN_SPONSOR) != 0)
+ cp = stpcpy (cp, sponsor);
+ if ((mask & CEN_REVISION) != 0)
+ {
+ *cp++ = '_';
+ cp = stpcpy (cp, revision);
+ }
+ }
+
+ *cp++ = '/';
+ stpcpy (cp, filename);
+
+ /* Look in list of already loaded domains whether it is already
+ available. */
+ last = NULL;
+ for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
+ if (retval->filename != NULL)
+ {
+ int compare = strcmp (retval->filename, abs_filename);
+ if (compare == 0)
+ /* We found it! */
+ break;
+ if (compare < 0)
+ {
+ /* It's not in the list. */
+ retval = NULL;
+ break;
+ }
+
+ last = retval;
+ }
+
+ if (retval != NULL || do_allocate == 0)
+ {
+ free (abs_filename);
+ return retval;
+ }
+
+ retval = (struct loaded_l10nfile *)
+ malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len)
+ * (1 << pop (mask))
+ * sizeof (struct loaded_l10nfile *)));
+ if (retval == NULL)
+ return NULL;
+
+ retval->filename = abs_filename;
+ retval->decided = (__argz_count (dirlist, dirlist_len) != 1
+ || ((mask & XPG_CODESET) != 0
+ && (mask & XPG_NORM_CODESET) != 0));
+ retval->data = NULL;
+
+ if (last == NULL)
+ {
+ retval->next = *l10nfile_list;
+ *l10nfile_list = retval;
+ }
+ else
+ {
+ retval->next = last->next;
+ last->next = retval;
+ }
+
+ entries = 0;
+ /* If the DIRLIST is a real list the RETVAL entry corresponds not to
+ a real file. So we have to use the DIRLIST separation mechanism
+ of the inner loop. */
+ cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask;
+ for (; cnt >= 0; --cnt)
+ if ((cnt & ~mask) == 0
+ && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0)
+ && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0))
+ {
+ /* Iterate over all elements of the DIRLIST. */
+ char *dir = NULL;
+
+ while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
+ != NULL)
+ retval->successor[entries++]
+ = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt,
+ language, territory, codeset,
+ normalized_codeset, modifier, special,
+ sponsor, revision, filename, 1);
+ }
+ retval->successor[entries] = NULL;
+
+ return retval;
+}
+
+/* Normalize codeset name. There is no standard for the codeset
+ names. Normalization allows the user to use any of the common
+ names. The return value is dynamically allocated and has to be
+ freed by the caller. */
+const char *
+_nl_normalize_codeset (codeset, name_len)
+ const char *codeset;
+ size_t name_len;
+{
+ int len = 0;
+ int only_digit = 1;
+ char *retval;
+ char *wp;
+ size_t cnt;
+
+ for (cnt = 0; cnt < name_len; ++cnt)
+ if (isalnum (codeset[cnt]))
+ {
+ ++len;
+
+ if (isalpha (codeset[cnt]))
+ only_digit = 0;
+ }
+
+ retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
+
+ if (retval != NULL)
+ {
+ if (only_digit)
+ wp = stpcpy (retval, "iso");
+ else
+ wp = retval;
+
+ for (cnt = 0; cnt < name_len; ++cnt)
+ if (isalpha (codeset[cnt]))
+ *wp++ = tolower (codeset[cnt]);
+ else if (isdigit (codeset[cnt]))
+ *wp++ = codeset[cnt];
+
+ *wp = '\0';
+ }
+
+ return (const char *) retval;
+}
+
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library. So we
+ avoid the non-standard function stpcpy. In GNU C Library this
+ function is available, though. Also allow the symbol HAVE_STPCPY
+ to be defined. */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+ char *dest;
+ const char *src;
+{
+ while ((*dest++ = *src++) != '\0')
+ /* Do nothing. */ ;
+ return dest - 1;
+}
+#endif
diff --git a/intl/libgettext.h b/intl/libgettext.h
new file mode 100644
index 000000000..553382ca0
--- /dev/null
+++ b/intl/libgettext.h
@@ -0,0 +1,48 @@
+/* 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#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 */
diff --git a/intl/libgnuintl.h b/intl/libgnuintl.h
new file mode 100644
index 000000000..577001a45
--- /dev/null
+++ b/intl/libgnuintl.h
@@ -0,0 +1,127 @@
+/* Message catalogs for internationalization.
+ Copyright (C) 1995-1997, 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#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 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
+# 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
+
+/* Resolve a platform specific conflict on DJGPP. GNU gettext takes
+ precedence over _conio_gettext. */
+#ifdef __DJGPP__
+# undef gettext
+# define gettext gettext
+#endif
+
+#ifndef PARAMS
+# if __STDC__ || defined __cplusplus
+# define PARAMS(args) args
+# else
+# define PARAMS(args) ()
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#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). */
+extern char *gettext PARAMS ((const char *__msgid));
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current
+ LC_MESSAGES locale. */
+extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid));
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+ locale. */
+extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid,
+ int __category));
+
+
+/* Similar to `gettext' but select the plural form corresponding to the
+ number N. */
+extern char *ngettext PARAMS ((const char *__msgid1, const char *__msgid2,
+ unsigned long int __n));
+
+/* Similar to `dgettext' but select the plural form corresponding to the
+ number N. */
+extern char *dngettext PARAMS ((const char *__domainname, const char *__msgid1,
+ const char *__msgid2, unsigned long int __n));
+
+/* Similar to `dcgettext' but select the plural form corresponding to the
+ number N. */
+extern char *dcngettext PARAMS ((const char *__domainname, const char *__msgid1,
+ const char *__msgid2, unsigned long int __n,
+ int __category));
+
+
+/* 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". */
+extern char *textdomain PARAMS ((const char *__domainname));
+
+/* Specify that the DOMAINNAME message catalog will be found
+ in DIRNAME rather than in the system locale data base. */
+extern char *bindtextdomain PARAMS ((const char *__domainname,
+ const char *__dirname));
+
+/* Specify the character encoding in which the messages from the
+ DOMAINNAME message catalog will be returned. */
+extern char *bind_textdomain_codeset PARAMS ((const char *__domainname,
+ const char *__codeset));
+
+
+/* Optimized version of the functions above. */
+#if defined __OPTIMIZED
+/* These are macros, but could also be inline functions. */
+
+# define gettext(msgid) \
+ dgettext (NULL, msgid)
+
+# define dgettext(domainname, msgid) \
+ dcgettext (domainname, msgid, LC_MESSAGES)
+
+# define ngettext(msgid1, msgid2, n) \
+ dngettext (NULL, msgid1, msgid2, n)
+
+# define dngettext(domainname, msgid1, msgid2, n) \
+ dcngettext (domainname, msgid1, msgid2, n, LC_MESSAGES)
+
+#endif /* Optimizing. */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* libintl.h */
diff --git a/intl/libintl.glibc b/intl/libintl.glibc
new file mode 100644
index 000000000..7298852f7
--- /dev/null
+++ b/intl/libintl.glibc
@@ -0,0 +1,116 @@
+/* Message catalogs for internationalization.
+ Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc.
+ This file is derived from the file libgettext.h in the GNU gettext package.
+
+ The GNU C Library 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 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library 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 the GNU C Library; see the file COPYING.LIB. 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 <features.h>
+
+/* We define an additional symbol to signal that we use the GNU
+ implementation of gettext. */
+#define __USE_GNU_GETTEXT 1
+
+__BEGIN_DECLS
+
+/* Look up MSGID in the current default message catalog for the current
+ LC_MESSAGES locale. If not found, returns MSGID itself (the default
+ text). */
+extern char *gettext (__const char *__msgid) __THROW;
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current
+ LC_MESSAGES locale. */
+extern char *dgettext (__const char *__domainname, __const char *__msgid)
+ __THROW;
+extern char *__dgettext (__const char *__domainname, __const char *__msgid)
+ __THROW __attribute_format_arg__ (2);
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+ locale. */
+extern char *dcgettext (__const char *__domainname,
+ __const char *__msgid, int __category) __THROW;
+extern char *__dcgettext (__const char *__domainname,
+ __const char *__msgid, int __category)
+ __THROW __attribute_format_arg__ (2);
+
+
+/* Similar to `gettext' but select the plural form corresponding to the
+ number N. */
+extern char *ngettext (__const char *__msgid1, __const char *__msgid2,
+ unsigned long int __n)
+ __THROW __attribute_format_arg__ (1);
+
+/* Similar to `dgettext' but select the plural form corresponding to the
+ number N. */
+extern char *dngettext (__const char *__domainname, __const char *__msgid1,
+ __const char *__msgid2, unsigned long int __n)
+ __THROW __attribute_format_arg__ (2);
+
+/* Similar to `dcgettext' but select the plural form corresponding to the
+ number N. */
+extern char *dcngettext (__const char *__domainname, __const char *__msgid1,
+ __const char *__msgid2, unsigned long int __n,
+ int __category)
+ __THROW __attribute_format_arg__ (2);
+
+
+/* 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". */
+extern char *textdomain (__const char *__domainname) __THROW;
+
+/* Specify that the DOMAINNAME message catalog will be found
+ in DIRNAME rather than in the system locale data base. */
+extern char *bindtextdomain (__const char *__domainname,
+ __const char *__dirname) __THROW;
+
+/* Specify the character encoding in which the messages from the
+ DOMAINNAME message catalog will be returned. */
+extern char *bind_textdomain_codeset (__const char *__domainname,
+ __const char *__codeset) __THROW;
+
+
+/* Optimized version of the function above. */
+#if defined __OPTIMIZE__
+
+/* We need NULL for `gettext'. */
+# define __need_NULL
+# include <stddef.h>
+
+/* We need LC_MESSAGES for `dgettext'. */
+# include <locale.h>
+
+/* These must be macros. Inlined functions are useless because the
+ `__builtin_constant_p' predicate in dcgettext would always return
+ false. */
+
+# define gettext(msgid) dgettext (NULL, msgid)
+
+# define dgettext(domainname, msgid) \
+ dcgettext (domainname, msgid, LC_MESSAGES)
+
+# define ngettext(msgid1, msgid2, n) dngettext (NULL, msgid1, msgid2, n)
+
+# define dngettext(domainname, msgid1, msgid2, n) \
+ dcngettext (domainname, msgid1, msgid2, n, LC_MESSAGES)
+
+#endif /* Optimizing. */
+
+__END_DECLS
+
+#endif /* libintl.h */
diff --git a/intl/loadinfo.h b/intl/loadinfo.h
new file mode 100644
index 000000000..5171a8f63
--- /dev/null
+++ b/intl/loadinfo.h
@@ -0,0 +1,108 @@
+/* Copyright (C) 1996-1999, 2000, 2001 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef _LOADINFO_H
+#define _LOADINFO_H 1
+
+#ifndef PARAMS
+# if __STDC__
+# define PARAMS(args) args
+# else
+# define PARAMS(args) ()
+# endif
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+/* Tell the compiler when a conditional or integer expression is
+ almost always true or almost always false. */
+#ifndef HAVE_BUILTIN_EXPECT
+# define __builtin_expect(expr, val) (expr)
+#endif
+
+/* Separator in PATH like lists of pathnames. */
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, OS/2, DOS */
+# define PATH_SEPARATOR ';'
+#else
+ /* Unix */
+# define PATH_SEPARATOR ':'
+#endif
+
+/* Encoding of locale name parts. */
+#define CEN_REVISION 1
+#define CEN_SPONSOR 2
+#define CEN_SPECIAL 4
+#define XPG_NORM_CODESET 8
+#define XPG_CODESET 16
+#define TERRITORY 32
+#define CEN_AUDIENCE 64
+#define XPG_MODIFIER 128
+
+#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE)
+#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER)
+
+
+struct loaded_l10nfile
+{
+ const char *filename;
+ int decided;
+
+ const void *data;
+
+ struct loaded_l10nfile *next;
+ struct loaded_l10nfile *successor[1];
+};
+
+
+/* Normalize codeset name. There is no standard for the codeset
+ names. Normalization allows the user to use any of the common
+ names. The return value is dynamically allocated and has to be
+ freed by the caller. */
+extern const char *_nl_normalize_codeset PARAMS ((const char *codeset,
+ size_t name_len));
+
+extern struct loaded_l10nfile *
+_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list,
+ const char *dirlist, size_t dirlist_len, int mask,
+ const char *language, const char *territory,
+ const char *codeset,
+ const char *normalized_codeset,
+ const char *modifier, const char *special,
+ const char *sponsor, const char *revision,
+ const char *filename, int do_allocate));
+
+
+extern const char *_nl_expand_alias PARAMS ((const char *name));
+
+/* normalized_codeset is dynamically allocated and has to be freed by
+ the caller. */
+extern int _nl_explode_name PARAMS ((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));
+
+extern char *_nl_find_language PARAMS ((const char *name));
+
+#endif /* loadinfo.h */
diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c
new file mode 100644
index 000000000..d589243b2
--- /dev/null
+++ b/intl/loadmsgcat.c
@@ -0,0 +1,566 @@
+/* Load needed message catalogs.
+ Copyright (C) 1995-1999, 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#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
+
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#ifdef _LIBC
+# include <langinfo.h>
+# include <locale.h>
+#endif
+
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
+ || (defined _LIBC && defined _POSIX_MAPPED_FILES)
+# include <sys/mman.h>
+# undef HAVE_MMAP
+# define HAVE_MMAP 1
+#else
+# undef HAVE_MMAP
+#endif
+
+#include "gettext.h"
+#include "gettextP.h"
+
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ISO C functions. This is required by the standard
+ because some ISO C functions will require linking with this object
+ file and the name space must not be polluted. */
+# define open __open
+# define close __close
+# define read __read
+# define mmap __mmap
+# define munmap __munmap
+#endif
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define PLURAL_PARSE __gettextparse
+#else
+# define PLURAL_PARSE gettextparse__
+#endif
+
+/* For those losing systems which don't have `alloca' we have to add
+ some additional code emulating it. */
+#ifdef HAVE_ALLOCA
+# define freea(p) /* nothing */
+#else
+# define alloca(n) malloc (n)
+# define freea(p) free (p)
+#endif
+
+/* For systems that distinguish between text and binary I/O.
+ O_BINARY is usually declared in <fcntl.h>. */
+#if !defined O_BINARY && defined _O_BINARY
+ /* For MSC-compatible compilers. */
+# define O_BINARY _O_BINARY
+# define O_TEXT _O_TEXT
+#endif
+#ifdef __BEOS__
+ /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */
+# undef O_BINARY
+# undef O_TEXT
+#endif
+/* On reasonable systems, binary I/O is the default. */
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+
+/* We need a sign, whether a new catalog was loaded, which can be associated
+ with all translations. This is important if the translations are
+ cached by one of GCC's features. */
+int _nl_msg_cat_cntr;
+
+#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
+ }
+};
+static 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;
+static 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
+
+
+/* Initialize the codeset dependent parts of an opened message catalog.
+ Return the header entry. */
+const char *
+internal_function
+_nl_init_domain_conv (domain_file, domain, domainbinding)
+ struct loaded_l10nfile *domain_file;
+ struct loaded_domain *domain;
+ struct binding *domainbinding;
+{
+ /* Find out about the character set the file is encoded with.
+ This can be found (in textual form) in the entry "". If this
+ entry does not exist or if this does not contain the `charset='
+ information, we will assume the charset matches the one the
+ current locale and we don't have to perform any conversion. */
+ char *nullentry;
+ size_t nullentrylen;
+
+ /* Preinitialize fields, to avoid recursion during _nl_find_msg. */
+ domain->codeset_cntr =
+ (domainbinding != NULL ? domainbinding->codeset_cntr : 0);
+#ifdef _LIBC
+ domain->conv = (__gconv_t) -1;
+#else
+# if HAVE_ICONV
+ domain->conv = (iconv_t) -1;
+# endif
+#endif
+ domain->conv_tab = NULL;
+
+ /* Get the header entry. */
+ nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen);
+
+ if (nullentry != NULL)
+ {
+#if defined _LIBC || HAVE_ICONV
+ const char *charsetstr;
+
+ charsetstr = strstr (nullentry, "charset=");
+ if (charsetstr != NULL)
+ {
+ size_t len;
+ char *charset;
+ const char *outcharset;
+
+ charsetstr += strlen ("charset=");
+ len = strcspn (charsetstr, " \t\n");
+
+ charset = (char *) alloca (len + 1);
+# if defined _LIBC || HAVE_MEMPCPY
+ *((char *) mempcpy (charset, charsetstr, len)) = '\0';
+# else
+ memcpy (charset, charsetstr, len);
+ charset[len] = '\0';
+# endif
+
+ /* The output charset should normally be determined by the
+ locale. But sometimes the locale is not used or not correctly
+ set up, so we provide a possibility for the user to override
+ this. Moreover, the value specified through
+ bind_textdomain_codeset overrides both. */
+ if (domainbinding != NULL && domainbinding->codeset != NULL)
+ outcharset = domainbinding->codeset;
+ else
+ {
+ outcharset = getenv ("OUTPUT_CHARSET");
+ if (outcharset == NULL || outcharset[0] == '\0')
+ {
+# ifdef _LIBC
+ outcharset = (*_nl_current[LC_CTYPE])->values[_NL_ITEM_INDEX (CODESET)].string;
+# else
+# if HAVE_ICONV
+ extern const char *locale_charset (void);
+ outcharset = locale_charset ();
+# endif
+# endif
+ }
+ }
+
+# ifdef _LIBC
+ /* We always want to use transliteration. */
+ outcharset = norm_add_slashes (outcharset, "TRANSLIT");
+ charset = norm_add_slashes (charset, NULL);
+ if (__gconv_open (outcharset, charset, &domain->conv,
+ GCONV_AVOID_NOCONV)
+ != __GCONV_OK)
+ domain->conv = (__gconv_t) -1;
+# else
+# if HAVE_ICONV
+ /* When using GNU libiconv, we want to use transliteration. */
+# if _LIBICONV_VERSION >= 0x0105
+ len = strlen (outcharset);
+ {
+ char *tmp = (char *) alloca (len + 10 + 1);
+ memcpy (tmp, outcharset, len);
+ memcpy (tmp + len, "//TRANSLIT", 10 + 1);
+ outcharset = tmp;
+ }
+# endif
+ domain->conv = iconv_open (outcharset, charset);
+# if _LIBICONV_VERSION >= 0x0105
+ freea (outcharset);
+# endif
+# endif
+# endif
+
+ freea (charset);
+ }
+#endif /* _LIBC || HAVE_ICONV */
+ }
+
+ return nullentry;
+}
+
+/* Frees the codeset dependent parts of an opened message catalog. */
+void
+internal_function
+_nl_free_domain_conv (domain)
+ struct loaded_domain *domain;
+{
+ if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1)
+ free (domain->conv_tab);
+
+#ifdef _LIBC
+ if (domain->conv != (__gconv_t) -1)
+ __gconv_close (domain->conv);
+#else
+# if HAVE_ICONV
+ if (domain->conv != (iconv_t) -1)
+ iconv_close (domain->conv);
+# endif
+#endif
+}
+
+/* Load the message catalogs specified by FILENAME. If it is no valid
+ message catalog do nothing. */
+void
+internal_function
+_nl_load_domain (domain_file, domainbinding)
+ struct loaded_l10nfile *domain_file;
+ struct binding *domainbinding;
+{
+ int fd;
+ size_t size;
+#ifdef _LIBC
+ struct stat64 st;
+#else
+ struct stat st;
+#endif
+ struct mo_file_header *data = (struct mo_file_header *) -1;
+ int use_mmap = 0;
+ struct loaded_domain *domain;
+ const char *nullentry;
+
+ domain_file->decided = 1;
+ domain_file->data = NULL;
+
+ /* Note that it would be useless to store domainbinding in domain_file
+ because domainbinding might be == NULL now but != NULL later (after
+ a call to bind_textdomain_codeset). */
+
+ /* If the record does not represent a valid locale the FILENAME
+ might be NULL. This can happen when according to the given
+ specification the locale file name is different for XPG and CEN
+ syntax. */
+ if (domain_file->filename == NULL)
+ return;
+
+ /* Try to open the addressed file. */
+ fd = open (domain_file->filename, O_RDONLY | O_BINARY);
+ if (fd == -1)
+ return;
+
+ /* We must know about the size of the file. */
+ if (
+#ifdef _LIBC
+ __builtin_expect (fstat64 (fd, &st) != 0, 0)
+#else
+ __builtin_expect (fstat (fd, &st) != 0, 0)
+#endif
+ || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0)
+ || __builtin_expect (size < sizeof (struct mo_file_header), 0))
+ {
+ /* Something went wrong. */
+ close (fd);
+ return;
+ }
+
+#ifdef HAVE_MMAP
+ /* Now we are ready to load the file. If mmap() is available we try
+ this first. If not available or it failed we try to load it. */
+ data = (struct mo_file_header *) mmap (NULL, size, PROT_READ,
+ MAP_PRIVATE, fd, 0);
+
+ if (__builtin_expect (data != (struct mo_file_header *) -1, 1))
+ {
+ /* mmap() call was successful. */
+ close (fd);
+ use_mmap = 1;
+ }
+#endif
+
+ /* If the data is not yet available (i.e. mmap'ed) we try to load
+ it manually. */
+ if (data == (struct mo_file_header *) -1)
+ {
+ size_t to_read;
+ char *read_ptr;
+
+ data = (struct mo_file_header *) malloc (size);
+ if (data == NULL)
+ return;
+
+ to_read = size;
+ read_ptr = (char *) data;
+ do
+ {
+ long int nb = (long int) read (fd, read_ptr, to_read);
+ if (nb <= 0)
+ {
+#ifdef EINTR
+ if (nb == -1 && errno == EINTR)
+ continue;
+#endif
+ close (fd);
+ return;
+ }
+ read_ptr += nb;
+ to_read -= nb;
+ }
+ while (to_read > 0);
+
+ close (fd);
+ }
+
+ /* Using the magic number we can test whether it really is a message
+ catalog file. */
+ if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED,
+ 0))
+ {
+ /* The magic number is wrong: not a message catalog file. */
+#ifdef HAVE_MMAP
+ if (use_mmap)
+ munmap ((caddr_t) data, size);
+ else
+#endif
+ free (data);
+ return;
+ }
+
+ domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain));
+ if (domain == NULL)
+ return;
+ domain_file->data = domain;
+
+ domain->data = (char *) data;
+ domain->use_mmap = use_mmap;
+ domain->mmap_size = size;
+ domain->must_swap = data->magic != _MAGIC;
+
+ /* Fill in the information about the available tables. */
+ switch (W (domain->must_swap, data->revision))
+ {
+ case 0:
+ domain->nstrings = W (domain->must_swap, data->nstrings);
+ domain->orig_tab = (struct string_desc *)
+ ((char *) data + W (domain->must_swap, data->orig_tab_offset));
+ domain->trans_tab = (struct string_desc *)
+ ((char *) data + W (domain->must_swap, data->trans_tab_offset));
+ domain->hash_size = W (domain->must_swap, data->hash_tab_size);
+ domain->hash_tab = (nls_uint32 *)
+ ((char *) data + W (domain->must_swap, data->hash_tab_offset));
+ break;
+ default:
+ /* This is an invalid revision. */
+#ifdef HAVE_MMAP
+ if (use_mmap)
+ munmap ((caddr_t) data, size);
+ else
+#endif
+ free (data);
+ free (domain);
+ domain_file->data = NULL;
+ return;
+ }
+
+ /* Now initialize the character set converter from the character set
+ the file is encoded with (found in the header entry) to the domain's
+ specified character set or the locale's character set. */
+ nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding);
+
+ /* Also look for a plural specification. */
+ 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
+ {
+ /* First get the number. */
+ char *endp;
+ unsigned long int n;
+ struct parse_args args;
+
+ nplurals += 9;
+ while (*nplurals != '\0' && isspace (*nplurals))
+ ++nplurals;
+#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
+ domain->nplurals = n;
+ if (nplurals == endp)
+ goto no_plural;
+
+ /* 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;
+ domain->plural = 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 ();
+ domain->plural = &germanic_plural;
+ domain->nplurals = 2;
+ }
+}
+
+
+#ifdef _LIBC
+void
+internal_function
+_nl_unload_domain (domain)
+ struct loaded_domain *domain;
+{
+ if (domain->plural != &germanic_plural)
+ __gettext_free_exp (domain->plural);
+
+ _nl_free_domain_conv (domain);
+
+# ifdef _POSIX_MAPPED_FILES
+ if (domain->use_mmap)
+ munmap ((caddr_t) domain->data, domain->mmap_size);
+ else
+# endif /* _POSIX_MAPPED_FILES */
+ free ((void *) domain->data);
+
+ free (domain);
+}
+#endif
diff --git a/intl/localcharset.c b/intl/localcharset.c
new file mode 100644
index 000000000..61f8f3e85
--- /dev/null
+++ b/intl/localcharset.c
@@ -0,0 +1,271 @@
+/* Determine a canonical name for the current locale's character encoding.
+
+ Copyright (C) 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. */
+
+/* Written by Bruno Haible <haible@clisp.cons.org>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if HAVE_STDDEF_H
+# include <stddef.h>
+#endif
+
+#include <stdio.h>
+#if HAVE_STRING_H
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+#if HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# undef WIN32 /* avoid warning on mingw32 */
+# define WIN32
+#endif
+
+#ifndef WIN32
+# if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+# else
+# if HAVE_SETLOCALE
+# include <locale.h>
+# endif
+# endif
+#else /* WIN32 */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+#endif
+
+#ifndef ISSLASH
+# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
+#endif
+
+/* The following static variable is declared 'volatile' to avoid a
+ possible multithread problem in the function get_charset_aliases. If we
+ are running in a threaded environment, and if two threads initialize
+ 'charset_aliases' simultaneously, both will produce the same value,
+ and everything will be ok if the two assignments to 'charset_aliases'
+ are atomic. But I don't know what will happen if the two assignments mix. */
+#if __STDC__ != 1
+# define volatile /* empty */
+#endif
+/* Pointer to the contents of the charset.alias file, if it has already been
+ read, else NULL. Its format is:
+ ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */
+static const char * volatile charset_aliases;
+
+/* Return a pointer to the contents of the charset.alias file. */
+static const char *
+get_charset_aliases ()
+{
+ const char *cp;
+
+ cp = charset_aliases;
+ if (cp == NULL)
+ {
+#ifndef WIN32
+ FILE *fp;
+ const char *dir = LIBDIR;
+ const char *base = "charset.alias";
+ char *file_name;
+
+ /* Concatenate dir and base into freshly allocated file_name. */
+ {
+ size_t dir_len = strlen (dir);
+ size_t base_len = strlen (base);
+ int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
+ file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
+ if (file_name != NULL)
+ {
+ memcpy (file_name, dir, dir_len);
+ if (add_slash)
+ file_name[dir_len] = DIRECTORY_SEPARATOR;
+ memcpy (file_name + dir_len + add_slash, base, base_len + 1);
+ }
+ }
+
+ if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL)
+ /* Out of memory or file not found, treat it as empty. */
+ cp = "";
+ else
+ {
+ /* Parse the file's contents. */
+ int c;
+ char buf1[50+1];
+ char buf2[50+1];
+ char *res_ptr = NULL;
+ size_t res_size = 0;
+ size_t l1, l2;
+
+ for (;;)
+ {
+ c = getc (fp);
+ if (c == EOF)
+ break;
+ if (c == '\n' || c == ' ' || c == '\t')
+ continue;
+ if (c == '#')
+ {
+ /* Skip comment, to end of line. */
+ do
+ c = getc (fp);
+ while (!(c == EOF || c == '\n'));
+ if (c == EOF)
+ break;
+ continue;
+ }
+ ungetc (c, fp);
+ if (fscanf(fp, "%50s %50s", buf1, buf2) < 2)
+ break;
+ l1 = strlen (buf1);
+ l2 = strlen (buf2);
+ if (res_size == 0)
+ {
+ res_size = l1 + 1 + l2 + 1;
+ res_ptr = malloc (res_size + 1);
+ }
+ else
+ {
+ res_size += l1 + 1 + l2 + 1;
+ res_ptr = realloc (res_ptr, res_size + 1);
+ }
+ if (res_ptr == NULL)
+ {
+ /* Out of memory. */
+ res_size = 0;
+ break;
+ }
+ strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
+ strcpy (res_ptr + res_size - (l2 + 1), buf2);
+ }
+ fclose (fp);
+ if (res_size == 0)
+ cp = "";
+ else
+ {
+ *(res_ptr + res_size) = '\0';
+ cp = res_ptr;
+ }
+ }
+
+ if (file_name != NULL)
+ free (file_name);
+
+#else /* WIN32 */
+
+ /* To avoid the troubles of installing a separate file in the same
+ directory as the DLL and of retrieving the DLL's directory at
+ runtime, simply inline the aliases here. */
+
+ cp = "CP936" "\0" "GBK" "\0"
+ "CP1361" "\0" "JOHAB" "\0";
+#endif
+
+ charset_aliases = cp;
+ }
+
+ return cp;
+}
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed in config.charset.
+ The result must not be freed; it is statically allocated.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+
+#ifdef STATIC
+STATIC
+#endif
+const char *
+locale_charset ()
+{
+ const char *codeset;
+ const char *aliases;
+
+#ifndef WIN32
+
+# if HAVE_LANGINFO_CODESET
+
+ /* Most systems support nl_langinfo (CODESET) nowadays. */
+ codeset = nl_langinfo (CODESET);
+
+# else
+
+ /* On old systems which lack it, use setlocale or getenv. */
+ const char *locale = NULL;
+
+ /* But most old systems don't have a complete set of locales. Some
+ (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't
+ use setlocale here; it would return "C" when it doesn't support the
+ locale name the user has set. */
+# if HAVE_SETLOCALE && 0
+ locale = setlocale (LC_CTYPE, NULL);
+# endif
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ }
+
+ /* On some old systems, one used to set locale = "iso8859_1". On others,
+ you set it to "language_COUNTRY.charset". In any case, we resolve it
+ through the charset.alias file. */
+ codeset = locale;
+
+# endif
+
+#else /* WIN32 */
+
+ static char buf[2 + 10 + 1];
+
+ /* Win32 has a function returning the locale's codepage as a number. */
+ sprintf (buf, "CP%u", GetACP ());
+ codeset = buf;
+
+#endif
+
+ if (codeset == NULL)
+ /* The canonical name cannot be determined. */
+ codeset = "";
+
+ /* Resolve alias. */
+ for (aliases = get_charset_aliases ();
+ *aliases != '\0';
+ aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
+ if (strcmp (codeset, aliases) == 0
+ || (aliases[0] == '*' && aliases[1] == '\0'))
+ {
+ codeset = aliases + strlen (aliases) + 1;
+ break;
+ }
+
+ return codeset;
+}
diff --git a/intl/locale.alias b/intl/locale.alias
new file mode 100644
index 000000000..48940f745
--- /dev/null
+++ b/intl/locale.alias
@@ -0,0 +1,77 @@
+# Locale name alias data base.
+# Copyright (C) 1996,1997,1998,1999,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 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# The format of this file is the same as for the corresponding file of
+# the X Window System, which normally can be found in
+# /usr/lib/X11/locale/locale.alias
+# A single line contains two fields: an alias and a substitution value.
+# All entries are case independent.
+
+# Note: This file is far from being complete. If you have a value for
+# your own site which you think might be useful for others too, share
+# it with the rest of us. Send it using the `glibcbug' script to
+# bugs@gnu.org.
+
+# Packages using this file:
+
+bokmal no_NO.ISO-8859-1
+bokmål no_NO.ISO-8859-1
+catalan ca_ES.ISO-8859-1
+croatian hr_HR.ISO-8859-2
+czech cs_CZ.ISO-8859-2
+danish da_DK.ISO-8859-1
+dansk da_DK.ISO-8859-1
+deutsch de_DE.ISO-8859-1
+dutch nl_NL.ISO-8859-1
+eesti et_EE.ISO-8859-1
+estonian et_EE.ISO-8859-1
+finnish fi_FI.ISO-8859-1
+français fr_FR.ISO-8859-1
+french fr_FR.ISO-8859-1
+galego gl_ES.ISO-8859-1
+galician gl_ES.ISO-8859-1
+german de_DE.ISO-8859-1
+greek el_GR.ISO-8859-7
+hebrew iw_IL.ISO-8859-8
+hrvatski hr_HR.ISO-8859-2
+hungarian hu_HU.ISO-8859-2
+icelandic is_IS.ISO-8859-1
+italian it_IT.ISO-8859-1
+japanese ja_JP.eucJP
+japanese.euc ja_JP.eucJP
+ja_JP ja_JP.eucJP
+ja_JP.ujis ja_JP.eucJP
+japanese.sjis ja_JP.SJIS
+korean ko_KR.eucKR
+korean.euc ko_KR.eucKR
+ko_KR ko_KR.eucKR
+lithuanian lt_LT.ISO-8859-13
+nb_NO no_NO.ISO-8859-1
+nb_NO.ISO-8859-1 no_NO.ISO-8859-1
+norwegian no_NO.ISO-8859-1
+nynorsk nn_NO.ISO-8859-1
+polish pl_PL.ISO-8859-2
+portuguese pt_PT.ISO-8859-1
+romanian ro_RO.ISO-8859-2
+russian ru_RU.ISO-8859-5
+slovak sk_SK.ISO-8859-2
+slovene sl_SI.ISO-8859-2
+slovenian sl_SI.ISO-8859-2
+spanish es_ES.ISO-8859-1
+swedish sv_SE.ISO-8859-1
+thai th_TH.TIS-620
+turkish tr_TR.ISO-8859-9
diff --git a/intl/localealias.c b/intl/localealias.c
new file mode 100644
index 000000000..76f19a9aa
--- /dev/null
+++ b/intl/localealias.c
@@ -0,0 +1,403 @@
+/* Handle aliases for locale names.
+ Copyright (C) 1995-1999, 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#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
+
+#include <stdlib.h>
+
+#include <string.h>
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+# define strchr index
+# endif
+#endif
+
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions. This is required by the standard
+ because some ANSI C functions will require linking with this object
+ file and the name space must not be polluted. */
+# define strcasecmp __strcasecmp
+
+# ifndef mempcpy
+# define mempcpy __mempcpy
+# endif
+# define HAVE_MEMPCPY 1
+
+/* We need locking here since we can be called from different places. */
+# include <bits/libc-lock.h>
+
+__libc_lock_define_initialized (static, lock);
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+/* For those losing systems which don't have `alloca' we have to add
+ some additional code emulating it. */
+#ifdef HAVE_ALLOCA
+# define freea(p) /* nothing */
+#else
+# define alloca(n) malloc (n)
+# define freea(p) free (p)
+#endif
+
+#if defined _LIBC_REENTRANT || defined HAVE_FGETS_UNLOCKED
+# undef fgets
+# define fgets(buf, len, s) fgets_unlocked (buf, len, s)
+#endif
+#if defined _LIBC_REENTRANT || defined HAVE_FEOF_UNLOCKED
+# undef feof
+# define feof(s) feof_unlocked (s)
+#endif
+
+
+struct alias_map
+{
+ const char *alias;
+ const char *value;
+};
+
+
+static char *string_space;
+static size_t string_space_act;
+static size_t string_space_max;
+static struct alias_map *map;
+static size_t nmap;
+static size_t maxmap;
+
+
+/* Prototypes for local functions. */
+static size_t read_alias_file PARAMS ((const char *fname, int fname_len))
+ internal_function;
+static int extend_alias_table PARAMS ((void));
+static int alias_compare PARAMS ((const struct alias_map *map1,
+ const struct alias_map *map2));
+
+
+const char *
+_nl_expand_alias (name)
+ const char *name;
+{
+ static const char *locale_alias_path = LOCALE_ALIAS_PATH;
+ struct alias_map *retval;
+ const char *result = NULL;
+ size_t added;
+
+#ifdef _LIBC
+ __libc_lock_lock (lock);
+#endif
+
+ do
+ {
+ struct alias_map item;
+
+ item.alias = name;
+
+ if (nmap > 0)
+ retval = (struct alias_map *) bsearch (&item, map, nmap,
+ sizeof (struct alias_map),
+ (int (*) PARAMS ((const void *,
+ const void *))
+ ) alias_compare);
+ else
+ retval = NULL;
+
+ /* We really found an alias. Return the value. */
+ if (retval != NULL)
+ {
+ result = retval->value;
+ break;
+ }
+
+ /* Perhaps we can find another alias file. */
+ added = 0;
+ while (added == 0 && locale_alias_path[0] != '\0')
+ {
+ const char *start;
+
+ while (locale_alias_path[0] == PATH_SEPARATOR)
+ ++locale_alias_path;
+ start = locale_alias_path;
+
+ while (locale_alias_path[0] != '\0'
+ && locale_alias_path[0] != PATH_SEPARATOR)
+ ++locale_alias_path;
+
+ if (start < locale_alias_path)
+ added = read_alias_file (start, locale_alias_path - start);
+ }
+ }
+ while (added != 0);
+
+#ifdef _LIBC
+ __libc_lock_unlock (lock);
+#endif
+
+ return result;
+}
+
+
+static size_t
+internal_function
+read_alias_file (fname, fname_len)
+ const char *fname;
+ int fname_len;
+{
+ FILE *fp;
+ char *full_fname;
+ size_t added;
+ static const char aliasfile[] = "/locale.alias";
+
+ full_fname = (char *) alloca (fname_len + sizeof aliasfile);
+#ifdef HAVE_MEMPCPY
+ mempcpy (mempcpy (full_fname, fname, fname_len),
+ aliasfile, sizeof aliasfile);
+#else
+ memcpy (full_fname, fname, fname_len);
+ memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
+#endif
+
+ fp = fopen (full_fname, "r");
+ freea (full_fname);
+ if (fp == NULL)
+ return 0;
+
+ added = 0;
+ while (!feof (fp))
+ {
+ /* It is a reasonable approach to use a fix buffer here because
+ a) we are only interested in the first two fields
+ b) these fields must be usable as file names and so must not
+ be that long
+ */
+ char buf[BUFSIZ];
+ char *alias;
+ char *value;
+ char *cp;
+
+ if (fgets (buf, sizeof buf, fp) == NULL)
+ /* EOF reached. */
+ 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;
+ /* Ignore leading white space. */
+ while (isspace (cp[0]))
+ ++cp;
+
+ /* A leading '#' signals a comment line. */
+ if (cp[0] != '\0' && cp[0] != '#')
+ {
+ alias = cp++;
+ while (cp[0] != '\0' && !isspace (cp[0]))
+ ++cp;
+ /* Terminate alias name. */
+ if (cp[0] != '\0')
+ *cp++ = '\0';
+
+ /* Now look for the beginning of the value. */
+ while (isspace (cp[0]))
+ ++cp;
+
+ if (cp[0] != '\0')
+ {
+ size_t alias_len;
+ size_t value_len;
+
+ value = cp++;
+ while (cp[0] != '\0' && !isspace (cp[0]))
+ ++cp;
+ /* Terminate value. */
+ if (cp[0] == '\n')
+ {
+ /* This has to be done to make the following test
+ for the end of line possible. We are looking for
+ the terminating '\n' which do not overwrite here. */
+ *cp++ = '\0';
+ *cp = '\n';
+ }
+ else if (cp[0] != '\0')
+ *cp++ = '\0';
+
+ if (nmap >= maxmap)
+ if (__builtin_expect (extend_alias_table (), 0))
+ return added;
+
+ alias_len = strlen (alias) + 1;
+ value_len = strlen (value) + 1;
+
+ if (string_space_act + alias_len + value_len > string_space_max)
+ {
+ /* Increase size of memory pool. */
+ size_t new_size = (string_space_max
+ + (alias_len + value_len > 1024
+ ? alias_len + value_len : 1024));
+ char *new_pool = (char *) realloc (string_space, new_size);
+ if (new_pool == NULL)
+ return added;
+
+ if (__builtin_expect (string_space != new_pool, 0))
+ {
+ size_t i;
+
+ for (i = 0; i < nmap; i++)
+ {
+ map[i].alias += new_pool - string_space;
+ map[i].value += new_pool - string_space;
+ }
+ }
+
+ string_space = new_pool;
+ string_space_max = new_size;
+ }
+
+ map[nmap].alias = memcpy (&string_space[string_space_act],
+ alias, alias_len);
+ string_space_act += alias_len;
+
+ map[nmap].value = memcpy (&string_space[string_space_act],
+ value, value_len);
+ string_space_act += value_len;
+
+ ++nmap;
+ ++added;
+ }
+ }
+ }
+
+ /* Should we test for ferror()? I think we have to silently ignore
+ errors. --drepper */
+ fclose (fp);
+
+ if (added > 0)
+ qsort (map, nmap, sizeof (struct alias_map),
+ (int (*) PARAMS ((const void *, const void *))) alias_compare);
+
+ return added;
+}
+
+
+static int
+extend_alias_table ()
+{
+ size_t new_size;
+ struct alias_map *new_map;
+
+ new_size = maxmap == 0 ? 100 : 2 * maxmap;
+ new_map = (struct alias_map *) realloc (map, (new_size
+ * sizeof (struct alias_map)));
+ if (new_map == NULL)
+ /* Simply don't extend: we don't have any more core. */
+ return -1;
+
+ map = new_map;
+ maxmap = new_size;
+ return 0;
+}
+
+
+#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
+alias_compare (map1, map2)
+ const struct alias_map *map1;
+ const struct alias_map *map2;
+{
+#if defined _LIBC || defined HAVE_STRCASECMP
+ return strcasecmp (map1->alias, map2->alias);
+#else
+ const unsigned char *p1 = (const unsigned char *) map1->alias;
+ const unsigned char *p2 = (const unsigned char *) map2->alias;
+ unsigned char c1, c2;
+
+ if (p1 == p2)
+ return 0;
+
+ do
+ {
+ /* I know this seems to be odd but the tolower() function in
+ some systems libc cannot handle nonalpha characters. */
+ c1 = isupper (*p1) ? tolower (*p1) : *p1;
+ c2 = isupper (*p2) ? tolower (*p2) : *p2;
+ if (c1 == '\0')
+ break;
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ return c1 - c2;
+#endif
+}
diff --git a/intl/ngettext.c b/intl/ngettext.c
new file mode 100644
index 000000000..8b1fa02f8
--- /dev/null
+++ b/intl/ngettext.c
@@ -0,0 +1,67 @@
+/* Implementation of ngettext(3) function.
+ Copyright (C) 1995, 1997, 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _LIBC
+# define __need_NULL
+# include <stddef.h>
+#else
+# include <stdlib.h> /* Just for NULL. */
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+#include <locale.h>
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define NGETTEXT __ngettext
+# define DCNGETTEXT __dcngettext
+#else
+# define NGETTEXT ngettext__
+# define DCNGETTEXT dcngettext__
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+ LC_MESSAGES locale. If not found, returns MSGID itself (the default
+ text). */
+char *
+NGETTEXT (msgid1, msgid2, n)
+ const char *msgid1;
+ const char *msgid2;
+ unsigned long int n;
+{
+ return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__ngettext, ngettext);
+#endif
diff --git a/intl/plural.c b/intl/plural.c
new file mode 100644
index 000000000..81913356c
--- /dev/null
+++ b/intl/plural.c
@@ -0,0 +1,1325 @@
+
+/* A Bison parser, made from plural.y
+ by GNU Bison version 1.28 */
+
+#define YYBISON 1 /* Identify Bison output. */
+
+#define yyparse __gettextparse
+#define yylex __gettextlex
+#define yyerror __gettexterror
+#define yylval __gettextlval
+#define yychar __gettextchar
+#define yydebug __gettextdebug
+#define yynerrs __gettextnerrs
+#define EQUOP2 257
+#define CMPOP2 258
+#define ADDOP2 259
+#define MULOP2 260
+#define NUMBER 261
+
+#line 1 "plural.y"
+
+/* Expression parsing for plural form selection.
+ Copyright (C) 2000, 2001 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* The bison generated parser uses alloca. AIX 3 forces us to put this
+ declaration at the beginning of the file. The declaration in bison's
+ skeleton file comes too late. This must come before <config.h>
+ because <config.h> may include arbitrary system headers. */
+#if defined _AIX && !defined __GNUC__
+ #pragma alloca
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include "gettextP.h"
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define FREE_EXPRESSION __gettext_free_exp
+#else
+# define FREE_EXPRESSION gettext_free_exp__
+# define __gettextparse gettextparse__
+#endif
+
+#define YYLEX_PARAM &((struct parse_args *) arg)->cp
+#define YYPARSE_PARAM arg
+
+#line 52 "plural.y"
+typedef union {
+ unsigned long int num;
+ enum operator op;
+ struct expression *exp;
+} YYSTYPE;
+#line 58 "plural.y"
+
+/* Prototypes for local functions. */
+static struct expression *new_exp PARAMS ((int nargs, enum operator op,
+ struct expression * const *args));
+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. */
+
+static struct expression *
+new_exp (nargs, op, args)
+ int nargs;
+ enum operator op;
+ struct expression * const *args;
+{
+ int i;
+ struct expression *newp;
+
+ /* If any of the argument could not be malloc'ed, just return NULL. */
+ for (i = nargs - 1; i >= 0; i--)
+ if (args[i] == NULL)
+ goto fail;
+
+ /* Allocate a new expression. */
+ newp = (struct expression *) malloc (sizeof (*newp));
+ if (newp != NULL)
+ {
+ newp->nargs = nargs;
+ newp->operation = op;
+ for (i = nargs - 1; i >= 0; i--)
+ newp->val.args[i] = args[i];
+ return newp;
+ }
+
+ fail:
+ for (i = nargs - 1; i >= 0; i--)
+ FREE_EXPRESSION (args[i]);
+
+ return NULL;
+}
+
+static inline struct expression *
+new_exp_0 (op)
+ enum operator op;
+{
+ return new_exp (0, op, NULL);
+}
+
+static inline struct expression *
+new_exp_1 (op, right)
+ enum operator op;
+ struct expression *right;
+{
+ struct expression *args[1];
+
+ args[0] = right;
+ return new_exp (1, op, args);
+}
+
+static struct expression *
+new_exp_2 (op, left, right)
+ enum operator op;
+ struct expression *left;
+ struct expression *right;
+{
+ struct expression *args[2];
+
+ args[0] = left;
+ args[1] = right;
+ return new_exp (2, op, args);
+}
+
+static inline struct expression *
+new_exp_3 (op, bexp, tbranch, fbranch)
+ enum operator op;
+ struct expression *bexp;
+ struct expression *tbranch;
+ struct expression *fbranch;
+{
+ struct expression *args[3];
+
+ args[0] = bexp;
+ args[1] = tbranch;
+ args[2] = fbranch;
+ return new_exp (3, op, args);
+}
+
+#include <stdio.h>
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#define const
+#endif
+#endif
+
+
+
+#define YYFINAL 27
+#define YYFLAG -32768
+#define YYNTBASE 16
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 18)
+
+static const char yytranslate[] = { 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 10, 2, 2, 2, 2, 5, 2, 14,
+ 15, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 12, 2, 2,
+ 2, 2, 3, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 13,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 4, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 1, 6, 7, 8, 9,
+ 11
+};
+
+#if YYDEBUG != 0
+static const short yyprhs[] = { 0,
+ 0, 2, 8, 12, 16, 20, 24, 28, 32, 35,
+ 37, 39
+};
+
+static const short yyrhs[] = { 17,
+ 0, 17, 3, 17, 12, 17, 0, 17, 4, 17,
+ 0, 17, 5, 17, 0, 17, 6, 17, 0, 17,
+ 7, 17, 0, 17, 8, 17, 0, 17, 9, 17,
+ 0, 10, 17, 0, 13, 0, 11, 0, 14, 17,
+ 15, 0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+ 177, 185, 189, 193, 197, 201, 205, 209, 213, 217,
+ 221, 226
+};
+#endif
+
+
+#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+
+static const char * const yytname[] = { "$","error","$undefined.","'?'","'|'",
+"'&'","EQUOP2","CMPOP2","ADDOP2","MULOP2","'!'","NUMBER","':'","'n'","'('","')'",
+"start","exp", NULL
+};
+#endif
+
+static const short yyr1[] = { 0,
+ 16, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17
+};
+
+static const short yyr2[] = { 0,
+ 1, 5, 3, 3, 3, 3, 3, 3, 2, 1,
+ 1, 3
+};
+
+static const short yydefact[] = { 0,
+ 0, 11, 10, 0, 1, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 12, 0, 3, 4, 5, 6,
+ 7, 8, 0, 2, 0, 0, 0
+};
+
+static const short yydefgoto[] = { 25,
+ 5
+};
+
+static const short yypact[] = { -9,
+ -9,-32768,-32768, -9, 34,-32768, 11, -9, -9, -9,
+ -9, -9, -9, -9,-32768, 24, 39, 43, 16, 26,
+ -3,-32768, -9, 34, 21, 53,-32768
+};
+
+static const short yypgoto[] = {-32768,
+ -1
+};
+
+
+#define YYLAST 53
+
+
+static const short yytable[] = { 6,
+ 1, 2, 7, 3, 4, 14, 16, 17, 18, 19,
+ 20, 21, 22, 8, 9, 10, 11, 12, 13, 14,
+ 26, 24, 12, 13, 14, 15, 8, 9, 10, 11,
+ 12, 13, 14, 13, 14, 23, 8, 9, 10, 11,
+ 12, 13, 14, 10, 11, 12, 13, 14, 11, 12,
+ 13, 14, 27
+};
+
+static const short yycheck[] = { 1,
+ 10, 11, 4, 13, 14, 9, 8, 9, 10, 11,
+ 12, 13, 14, 3, 4, 5, 6, 7, 8, 9,
+ 0, 23, 7, 8, 9, 15, 3, 4, 5, 6,
+ 7, 8, 9, 8, 9, 12, 3, 4, 5, 6,
+ 7, 8, 9, 5, 6, 7, 8, 9, 6, 7,
+ 8, 9, 0
+};
+#define YYPURE 1
+
+/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+#line 3 "/home/haible/gnu/arch/linuxlibc6/share/bison.simple"
+/* This file comes from bison-1.28. */
+
+/* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* This is the parser code that is written into each bison parser
+ when the %semantic_parser declaration is not specified in the grammar.
+ It was written by Richard Stallman by simplifying the hairy parser
+ used when %semantic_parser is specified. */
+
+#ifndef YYSTACK_USE_ALLOCA
+#ifdef alloca
+#define YYSTACK_USE_ALLOCA
+#else /* alloca not defined */
+#ifdef __GNUC__
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#else /* not GNU C. */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
+#define YYSTACK_USE_ALLOCA
+#include <alloca.h>
+#else /* not sparc */
+/* We think this test detects Watcom and Microsoft C. */
+/* This used to test MSDOS, but that is a bad idea
+ since that symbol is in the user namespace. */
+#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
+#if 0 /* No need for malloc.h, which pollutes the namespace;
+ instead, just don't use alloca. */
+#include <malloc.h>
+#endif
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+/* I don't know what this was needed for, but it pollutes the namespace.
+ So I turned it off. rms, 2 May 1997. */
+/* #include <malloc.h> */
+ #pragma alloca
+#define YYSTACK_USE_ALLOCA
+#else /* not MSDOS, or __TURBOC__, or _AIX */
+#if 0
+#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
+ and on HPUX 10. Eventually we can turn this on. */
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#endif /* __hpux */
+#endif
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc */
+#endif /* not GNU C */
+#endif /* alloca not defined */
+#endif /* YYSTACK_USE_ALLOCA not defined */
+
+#ifdef YYSTACK_USE_ALLOCA
+#define YYSTACK_ALLOC alloca
+#else
+#define YYSTACK_ALLOC malloc
+#endif
+
+/* Note: there must be only one dollar sign in this file.
+ It is replaced by the list of actions, each action
+ as one case of the switch. */
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+ This remains here temporarily to ease the
+ transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. */
+#define YYFAIL goto yyerrlab
+#define YYRECOVERING() (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { yychar = (token), yylval = (value); \
+ yychar1 = YYTRANSLATE (yychar); \
+ YYPOPSTACK; \
+ goto yybackup; \
+ } \
+ else \
+ { yyerror ("syntax error: cannot back up"); YYERROR; } \
+while (0)
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+#ifndef YYPURE
+#define YYLEX yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int yychar; /* the lookahead symbol */
+YYSTYPE yylval; /* the semantic value of the */
+ /* lookahead symbol */
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc; /* location data for the lookahead */
+ /* symbol */
+#endif
+
+int yynerrs; /* number of parse errors so far */
+#endif /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug; /* nonzero means print parse trace */
+/* Since this is uninitialized, it does not stop multiple parsers
+ from coexisting. */
+#endif
+
+/* YYINITDEPTH indicates the initial size of the parser's stacks */
+
+#ifndef YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH is the maximum size the stacks can grow to
+ (effective only if the built-in stack extension method is used). */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* Define __yy_memcpy. Note that the size argument
+ should be passed with type unsigned int, because that is what the non-GCC
+ definitions require. With GCC, __builtin_memcpy takes an arg
+ of type size_t, but it can handle unsigned int. */
+
+#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
+#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
+#else /* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+static void
+__yy_memcpy (to, from, count)
+ char *to;
+ char *from;
+ unsigned int count;
+{
+ register char *f = from;
+ register char *t = to;
+ register int i = count;
+
+ while (i-- > 0)
+ *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+static void
+__yy_memcpy (char *to, char *from, unsigned int count)
+{
+ register char *t = to;
+ register char *f = from;
+ register int i = count;
+
+ while (i-- > 0)
+ *t++ = *f++;
+}
+
+#endif
+#endif
+
+#line 217 "/home/haible/gnu/arch/linuxlibc6/share/bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+ into yyparse. The argument should have type void *.
+ It should actually point to an object.
+ Grammar actions can access the variable by casting it
+ to the proper pointer type. */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes. */
+#ifdef __GNUC__
+#ifdef YYPARSE_PARAM
+int yyparse (void *);
+#else
+int yyparse (void);
+#endif
+#endif
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+ YYPARSE_PARAM_DECL
+{
+ register int yystate;
+ register int yyn;
+ register short *yyssp;
+ register YYSTYPE *yyvsp;
+ int yyerrstatus; /* number of tokens to shift before error messages enabled */
+ int yychar1 = 0; /* lookahead token as an internal (translated) token number */
+
+ short yyssa[YYINITDEPTH]; /* the state stack */
+ YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
+
+ short *yyss = yyssa; /* refer to the stacks thru separate pointers */
+ YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+ YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
+ YYLTYPE *yyls = yylsa;
+ YYLTYPE *yylsp;
+
+#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK (yyvsp--, yyssp--)
+#endif
+
+ int yystacksize = YYINITDEPTH;
+ int yyfree_stacks = 0;
+
+#ifdef YYPURE
+ int yychar;
+ YYSTYPE yylval;
+ int yynerrs;
+#ifdef YYLSP_NEEDED
+ YYLTYPE yylloc;
+#endif
+#endif
+
+ YYSTYPE yyval; /* the variable used to return */
+ /* semantic values from the action */
+ /* routines */
+
+ int yylen;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Starting parse\n");
+#endif
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss - 1;
+ yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+ yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in yystate . */
+/* In all cases, when you get here, the value and location stacks
+ have just been pushed. so pushing a state here evens the stacks. */
+yynewstate:
+
+ *++yyssp = yystate;
+
+ if (yyssp >= yyss + yystacksize - 1)
+ {
+ /* Give user a chance to reallocate the stack */
+ /* Use copies of these so that the &'s don't force the real ones into memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+ YYLTYPE *yyls1 = yyls;
+#endif
+
+ /* Get the current used size of the three stacks, in elements. */
+ int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ /* Each stack pointer address is followed by the size of
+ the data in use in that stack, in bytes. */
+#ifdef YYLSP_NEEDED
+ /* This used to be a conditional around just the two extra args,
+ but that might be undefined if yyoverflow is a macro. */
+ yyoverflow("parser stack overflow",
+ &yyss1, size * sizeof (*yyssp),
+ &yyvs1, size * sizeof (*yyvsp),
+ &yyls1, size * sizeof (*yylsp),
+ &yystacksize);
+#else
+ yyoverflow("parser stack overflow",
+ &yyss1, size * sizeof (*yyssp),
+ &yyvs1, size * sizeof (*yyvsp),
+ &yystacksize);
+#endif
+
+ yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+ yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+ /* Extend the stack our own way. */
+ if (yystacksize >= YYMAXDEPTH)
+ {
+ yyerror("parser stack overflow");
+ if (yyfree_stacks)
+ {
+ free (yyss);
+ free (yyvs);
+#ifdef YYLSP_NEEDED
+ free (yyls);
+#endif
+ }
+ return 2;
+ }
+ yystacksize *= 2;
+ if (yystacksize > YYMAXDEPTH)
+ yystacksize = YYMAXDEPTH;
+#ifndef YYSTACK_USE_ALLOCA
+ yyfree_stacks = 1;
+#endif
+ yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
+ __yy_memcpy ((char *)yyss, (char *)yyss1,
+ size * (unsigned int) sizeof (*yyssp));
+ yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
+ __yy_memcpy ((char *)yyvs, (char *)yyvs1,
+ size * (unsigned int) sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+ yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
+ __yy_memcpy ((char *)yyls, (char *)yyls1,
+ size * (unsigned int) sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + size - 1;
+ yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+ yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+ if (yyssp >= yyss + yystacksize - 1)
+ YYABORT;
+ }
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+ goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state. */
+/* Read a lookahead token if we need one and don't already have one. */
+/* yyresume: */
+
+ /* First try to decide what to do without reference to lookahead token. */
+
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* yychar is either YYEMPTY or YYEOF
+ or a valid token in external form. */
+
+ if (yychar == YYEMPTY)
+ {
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Reading a token: ");
+#endif
+ yychar = YYLEX;
+ }
+
+ /* Convert token to internal form (in yychar1) for indexing tables with */
+
+ if (yychar <= 0) /* This means end of input. */
+ {
+ yychar1 = 0;
+ yychar = YYEOF; /* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Now at end of input.\n");
+#endif
+ }
+ else
+ {
+ yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+ /* Give the individual parser a way to print the precise meaning
+ of a token, for further debugging info. */
+#ifdef YYPRINT
+ YYPRINT (stderr, yychar, yylval);
+#endif
+ fprintf (stderr, ")\n");
+ }
+#endif
+ }
+
+ yyn += yychar1;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+ goto yydefault;
+
+ yyn = yytable[yyn];
+
+ /* yyn is what to do for this token type in this state.
+ Negative => reduce, -yyn is rule number.
+ Positive => shift, yyn is new state.
+ New state is final state => don't bother to shift,
+ just return success.
+ 0, or most negative number => error. */
+
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrlab;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Shift the lookahead token. */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+ /* Discard the token being shifted unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ /* count tokens shifted since error; after three, turn off error status. */
+ if (yyerrstatus) yyerrstatus--;
+
+ yystate = yyn;
+ goto yynewstate;
+
+/* Do the default action for the current state. */
+yydefault:
+
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+
+/* Do a reduction. yyn is the number of a rule to reduce with. */
+yyreduce:
+ yylen = yyr2[yyn];
+ if (yylen > 0)
+ yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ int i;
+
+ fprintf (stderr, "Reducing via rule %d (line %d), ",
+ yyn, yyrline[yyn]);
+
+ /* Print the symbols being reduced, and their result. */
+ for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+ fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+ fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+ }
+#endif
+
+
+ switch (yyn) {
+
+case 1:
+#line 178 "plural.y"
+{
+ if (yyvsp[0].exp == NULL)
+ YYABORT;
+ ((struct parse_args *) arg)->res = yyvsp[0].exp;
+ ;
+ break;}
+case 2:
+#line 186 "plural.y"
+{
+ yyval.exp = new_exp_3 (qmop, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0].exp);
+ ;
+ break;}
+case 3:
+#line 190 "plural.y"
+{
+ yyval.exp = new_exp_2 (lor, yyvsp[-2].exp, yyvsp[0].exp);
+ ;
+ break;}
+case 4:
+#line 194 "plural.y"
+{
+ yyval.exp = new_exp_2 (land, yyvsp[-2].exp, yyvsp[0].exp);
+ ;
+ break;}
+case 5:
+#line 198 "plural.y"
+{
+ yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+ ;
+ break;}
+case 6:
+#line 202 "plural.y"
+{
+ yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+ ;
+ break;}
+case 7:
+#line 206 "plural.y"
+{
+ yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+ ;
+ break;}
+case 8:
+#line 210 "plural.y"
+{
+ yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+ ;
+ break;}
+case 9:
+#line 214 "plural.y"
+{
+ yyval.exp = new_exp_1 (lnot, yyvsp[0].exp);
+ ;
+ break;}
+case 10:
+#line 218 "plural.y"
+{
+ yyval.exp = new_exp_0 (var);
+ ;
+ break;}
+case 11:
+#line 222 "plural.y"
+{
+ if ((yyval.exp = new_exp_0 (num)) != NULL)
+ yyval.exp->val.num = yyvsp[0].num;
+ ;
+ break;}
+case 12:
+#line 227 "plural.y"
+{
+ yyval.exp = yyvsp[-1].exp;
+ ;
+ break;}
+}
+ /* the action file gets copied in in place of this dollarsign */
+#line 543 "/home/haible/gnu/arch/linuxlibc6/share/bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+ yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ short *ssp1 = yyss - 1;
+ fprintf (stderr, "state stack now");
+ while (ssp1 != yyssp)
+ fprintf (stderr, " %d", *++ssp1);
+ fprintf (stderr, "\n");
+ }
+#endif
+
+ *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+ yylsp++;
+ if (yylen == 0)
+ {
+ yylsp->first_line = yylloc.first_line;
+ yylsp->first_column = yylloc.first_column;
+ yylsp->last_line = (yylsp-1)->last_line;
+ yylsp->last_column = (yylsp-1)->last_column;
+ yylsp->text = 0;
+ }
+ else
+ {
+ yylsp->last_line = (yylsp+yylen-1)->last_line;
+ yylsp->last_column = (yylsp+yylen-1)->last_column;
+ }
+#endif
+
+ /* Now "shift" the result of the reduction.
+ Determine what state that goes to,
+ based on the state we popped back to
+ and the rule number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+ if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTBASE];
+
+ goto yynewstate;
+
+yyerrlab: /* here on detecting error */
+
+ if (! yyerrstatus)
+ /* If not already recovering from an error, report this error. */
+ {
+ ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+ yyn = yypact[yystate];
+
+ if (yyn > YYFLAG && yyn < YYLAST)
+ {
+ int size = 0;
+ char *msg;
+ int x, count;
+
+ count = 0;
+ /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
+ for (x = (yyn < 0 ? -yyn : 0);
+ x < (sizeof(yytname) / sizeof(char *)); x++)
+ if (yycheck[x + yyn] == x)
+ size += strlen(yytname[x]) + 15, count++;
+ msg = (char *) malloc(size + 15);
+ if (msg != 0)
+ {
+ strcpy(msg, "parse error");
+
+ if (count < 5)
+ {
+ count = 0;
+ for (x = (yyn < 0 ? -yyn : 0);
+ x < (sizeof(yytname) / sizeof(char *)); x++)
+ if (yycheck[x + yyn] == x)
+ {
+ strcat(msg, count == 0 ? ", expecting `" : " or `");
+ strcat(msg, yytname[x]);
+ strcat(msg, "'");
+ count++;
+ }
+ }
+ yyerror(msg);
+ free(msg);
+ }
+ else
+ yyerror ("parse error; also virtual memory exceeded");
+ }
+ else
+#endif /* YYERROR_VERBOSE */
+ yyerror("parse error");
+ }
+
+ goto yyerrlab1;
+yyerrlab1: /* here on error raised explicitly by an action */
+
+ if (yyerrstatus == 3)
+ {
+ /* if just tried and failed to reuse lookahead token after an error, discard it. */
+
+ /* return failure if at end of input */
+ if (yychar == YYEOF)
+ YYABORT;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+ yychar = YYEMPTY;
+ }
+
+ /* Else will try to reuse lookahead token
+ after shifting the error token. */
+
+ yyerrstatus = 3; /* Each real token shifted decrements this */
+
+ goto yyerrhandle;
+
+yyerrdefault: /* current state does not do anything special for the error token. */
+
+#if 0
+ /* This is wrong; only states that explicitly want error tokens
+ should shift them. */
+ yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
+ if (yyn) goto yydefault;
+#endif
+
+yyerrpop: /* pop the current state because it cannot handle the error token */
+
+ if (yyssp == yyss) YYABORT;
+ yyvsp--;
+ yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+ yylsp--;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ short *ssp1 = yyss - 1;
+ fprintf (stderr, "Error: state stack now");
+ while (ssp1 != yyssp)
+ fprintf (stderr, " %d", *++ssp1);
+ fprintf (stderr, "\n");
+ }
+#endif
+
+yyerrhandle:
+
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yyerrdefault;
+
+ yyn += YYTERROR;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+ goto yyerrdefault;
+
+ yyn = yytable[yyn];
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrpop;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrpop;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Shifting error token, ");
+#endif
+
+ *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ yystate = yyn;
+ goto yynewstate;
+
+ yyacceptlab:
+ /* YYACCEPT comes here. */
+ if (yyfree_stacks)
+ {
+ free (yyss);
+ free (yyvs);
+#ifdef YYLSP_NEEDED
+ free (yyls);
+#endif
+ }
+ return 0;
+
+ yyabortlab:
+ /* YYABORT comes here. */
+ if (yyfree_stacks)
+ {
+ free (yyss);
+ free (yyvs);
+#ifdef YYLSP_NEEDED
+ free (yyls);
+#endif
+ }
+ return 1;
+}
+#line 232 "plural.y"
+
+
+void
+internal_function
+FREE_EXPRESSION (exp)
+ struct expression *exp;
+{
+ if (exp == NULL)
+ return;
+
+ /* Handle the recursive case. */
+ switch (exp->nargs)
+ {
+ case 3:
+ FREE_EXPRESSION (exp->val.args[2]);
+ /* FALLTHROUGH */
+ case 2:
+ FREE_EXPRESSION (exp->val.args[1]);
+ /* FALLTHROUGH */
+ case 1:
+ FREE_EXPRESSION (exp->val.args[0]);
+ /* FALLTHROUGH */
+ default:
+ break;
+ }
+
+ free (exp);
+}
+
+
+static int
+yylex (lval, pexp)
+ YYSTYPE *lval;
+ const char **pexp;
+{
+ const char *exp = *pexp;
+ int result;
+
+ while (1)
+ {
+ if (exp[0] == '\0')
+ {
+ *pexp = exp;
+ return YYEOF;
+ }
+
+ if (exp[0] != ' ' && exp[0] != '\t')
+ break;
+
+ ++exp;
+ }
+
+ result = *exp++;
+ switch (result)
+ {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ {
+ unsigned long int n = result - '0';
+ while (exp[0] >= '0' && exp[0] <= '9')
+ {
+ n *= 10;
+ n += exp[0] - '0';
+ ++exp;
+ }
+ lval->num = n;
+ result = NUMBER;
+ }
+ break;
+
+ case '=':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = equal;
+ result = EQUOP2;
+ }
+ else
+ result = YYERRCODE;
+ break;
+
+ case '!':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = not_equal;
+ result = EQUOP2;
+ }
+ break;
+
+ case '&':
+ case '|':
+ if (exp[0] == result)
+ ++exp;
+ else
+ result = YYERRCODE;
+ break;
+
+ case '<':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = less_or_equal;
+ }
+ else
+ lval->op = less_than;
+ result = CMPOP2;
+ break;
+
+ case '>':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = greater_or_equal;
+ }
+ else
+ lval->op = greater_than;
+ result = CMPOP2;
+ break;
+
+ case '*':
+ lval->op = mult;
+ result = MULOP2;
+ break;
+
+ case '/':
+ lval->op = divide;
+ result = MULOP2;
+ break;
+
+ case '%':
+ lval->op = module;
+ result = MULOP2;
+ break;
+
+ case '+':
+ lval->op = plus;
+ result = ADDOP2;
+ break;
+
+ case '-':
+ lval->op = minus;
+ result = ADDOP2;
+ break;
+
+ case 'n':
+ case '?':
+ case ':':
+ case '(':
+ case ')':
+ /* Nothing, just return the character. */
+ break;
+
+ case ';':
+ case '\n':
+ case '\0':
+ /* Be safe and let the user call this function again. */
+ --exp;
+ result = YYEOF;
+ break;
+
+ default:
+ result = YYERRCODE;
+#if YYDEBUG != 0
+ --exp;
+#endif
+ break;
+ }
+
+ *pexp = exp;
+
+ return result;
+}
+
+
+static void
+yyerror (str)
+ const char *str;
+{
+ /* Do nothing. We don't print error messages here. */
+}
diff --git a/intl/plural.y b/intl/plural.y
new file mode 100644
index 000000000..42ffa0eb2
--- /dev/null
+++ b/intl/plural.y
@@ -0,0 +1,412 @@
+%{
+/* Expression parsing for plural form selection.
+ Copyright (C) 2000, 2001 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* The bison generated parser uses alloca. AIX 3 forces us to put this
+ declaration at the beginning of the file. The declaration in bison's
+ skeleton file comes too late. This must come before <config.h>
+ because <config.h> may include arbitrary system headers. */
+#if defined _AIX && !defined __GNUC__
+ #pragma alloca
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include "gettextP.h"
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define FREE_EXPRESSION __gettext_free_exp
+#else
+# define FREE_EXPRESSION gettext_free_exp__
+# define __gettextparse gettextparse__
+#endif
+
+#define YYLEX_PARAM &((struct parse_args *) arg)->cp
+#define YYPARSE_PARAM arg
+%}
+%pure_parser
+%expect 10
+
+%union {
+ unsigned long int num;
+ enum operator op;
+ struct expression *exp;
+}
+
+%{
+/* Prototypes for local functions. */
+static struct expression *new_exp PARAMS ((int nargs, enum operator op,
+ struct expression * const *args));
+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. */
+
+static struct expression *
+new_exp (nargs, op, args)
+ int nargs;
+ enum operator op;
+ struct expression * const *args;
+{
+ int i;
+ struct expression *newp;
+
+ /* If any of the argument could not be malloc'ed, just return NULL. */
+ for (i = nargs - 1; i >= 0; i--)
+ if (args[i] == NULL)
+ goto fail;
+
+ /* Allocate a new expression. */
+ newp = (struct expression *) malloc (sizeof (*newp));
+ if (newp != NULL)
+ {
+ newp->nargs = nargs;
+ newp->operation = op;
+ for (i = nargs - 1; i >= 0; i--)
+ newp->val.args[i] = args[i];
+ return newp;
+ }
+
+ fail:
+ for (i = nargs - 1; i >= 0; i--)
+ FREE_EXPRESSION (args[i]);
+
+ return NULL;
+}
+
+static inline struct expression *
+new_exp_0 (op)
+ enum operator op;
+{
+ return new_exp (0, op, NULL);
+}
+
+static inline struct expression *
+new_exp_1 (op, right)
+ enum operator op;
+ struct expression *right;
+{
+ struct expression *args[1];
+
+ args[0] = right;
+ return new_exp (1, op, args);
+}
+
+static struct expression *
+new_exp_2 (op, left, right)
+ enum operator op;
+ struct expression *left;
+ struct expression *right;
+{
+ struct expression *args[2];
+
+ args[0] = left;
+ args[1] = right;
+ return new_exp (2, op, args);
+}
+
+static inline struct expression *
+new_exp_3 (op, bexp, tbranch, fbranch)
+ enum operator op;
+ struct expression *bexp;
+ struct expression *tbranch;
+ struct expression *fbranch;
+{
+ struct expression *args[3];
+
+ args[0] = bexp;
+ args[1] = tbranch;
+ args[2] = fbranch;
+ return new_exp (3, op, args);
+}
+
+%}
+
+/* This declares that all operators have the same associativity and the
+ precedence order as in C. See [Harbison, Steele: C, A Reference Manual].
+ There is no unary minus and no bitwise operators.
+ Operators with the same syntactic behaviour have been merged into a single
+ token, to save space in the array generated by bison. */
+%right '?' /* ? */
+%left '|' /* || */
+%left '&' /* && */
+%left EQUOP2 /* == != */
+%left CMPOP2 /* < > <= >= */
+%left ADDOP2 /* + - */
+%left MULOP2 /* * / % */
+%right '!' /* ! */
+
+%token <op> EQUOP2 CMPOP2 ADDOP2 MULOP2
+%token <num> NUMBER
+%type <exp> exp
+
+%%
+
+start: exp
+ {
+ if ($1 == NULL)
+ YYABORT;
+ ((struct parse_args *) arg)->res = $1;
+ }
+ ;
+
+exp: exp '?' exp ':' exp
+ {
+ $$ = new_exp_3 (qmop, $1, $3, $5);
+ }
+ | exp '|' exp
+ {
+ $$ = new_exp_2 (lor, $1, $3);
+ }
+ | exp '&' exp
+ {
+ $$ = new_exp_2 (land, $1, $3);
+ }
+ | exp EQUOP2 exp
+ {
+ $$ = new_exp_2 ($2, $1, $3);
+ }
+ | exp CMPOP2 exp
+ {
+ $$ = new_exp_2 ($2, $1, $3);
+ }
+ | exp ADDOP2 exp
+ {
+ $$ = new_exp_2 ($2, $1, $3);
+ }
+ | exp MULOP2 exp
+ {
+ $$ = new_exp_2 ($2, $1, $3);
+ }
+ | '!' exp
+ {
+ $$ = new_exp_1 (lnot, $2);
+ }
+ | 'n'
+ {
+ $$ = new_exp_0 (var);
+ }
+ | NUMBER
+ {
+ if (($$ = new_exp_0 (num)) != NULL)
+ $$->val.num = $1;
+ }
+ | '(' exp ')'
+ {
+ $$ = $2;
+ }
+ ;
+
+%%
+
+void
+internal_function
+FREE_EXPRESSION (exp)
+ struct expression *exp;
+{
+ if (exp == NULL)
+ return;
+
+ /* Handle the recursive case. */
+ switch (exp->nargs)
+ {
+ case 3:
+ FREE_EXPRESSION (exp->val.args[2]);
+ /* FALLTHROUGH */
+ case 2:
+ FREE_EXPRESSION (exp->val.args[1]);
+ /* FALLTHROUGH */
+ case 1:
+ FREE_EXPRESSION (exp->val.args[0]);
+ /* FALLTHROUGH */
+ default:
+ break;
+ }
+
+ free (exp);
+}
+
+
+static int
+yylex (lval, pexp)
+ YYSTYPE *lval;
+ const char **pexp;
+{
+ const char *exp = *pexp;
+ int result;
+
+ while (1)
+ {
+ if (exp[0] == '\0')
+ {
+ *pexp = exp;
+ return YYEOF;
+ }
+
+ if (exp[0] != ' ' && exp[0] != '\t')
+ break;
+
+ ++exp;
+ }
+
+ result = *exp++;
+ switch (result)
+ {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ {
+ unsigned long int n = result - '0';
+ while (exp[0] >= '0' && exp[0] <= '9')
+ {
+ n *= 10;
+ n += exp[0] - '0';
+ ++exp;
+ }
+ lval->num = n;
+ result = NUMBER;
+ }
+ break;
+
+ case '=':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = equal;
+ result = EQUOP2;
+ }
+ else
+ result = YYERRCODE;
+ break;
+
+ case '!':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = not_equal;
+ result = EQUOP2;
+ }
+ break;
+
+ case '&':
+ case '|':
+ if (exp[0] == result)
+ ++exp;
+ else
+ result = YYERRCODE;
+ break;
+
+ case '<':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = less_or_equal;
+ }
+ else
+ lval->op = less_than;
+ result = CMPOP2;
+ break;
+
+ case '>':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = greater_or_equal;
+ }
+ else
+ lval->op = greater_than;
+ result = CMPOP2;
+ break;
+
+ case '*':
+ lval->op = mult;
+ result = MULOP2;
+ break;
+
+ case '/':
+ lval->op = divide;
+ result = MULOP2;
+ break;
+
+ case '%':
+ lval->op = module;
+ result = MULOP2;
+ break;
+
+ case '+':
+ lval->op = plus;
+ result = ADDOP2;
+ break;
+
+ case '-':
+ lval->op = minus;
+ result = ADDOP2;
+ break;
+
+ case 'n':
+ case '?':
+ case ':':
+ case '(':
+ case ')':
+ /* Nothing, just return the character. */
+ break;
+
+ case ';':
+ case '\n':
+ case '\0':
+ /* Be safe and let the user call this function again. */
+ --exp;
+ result = YYEOF;
+ break;
+
+ default:
+ result = YYERRCODE;
+#if YYDEBUG != 0
+ --exp;
+#endif
+ break;
+ }
+
+ *pexp = exp;
+
+ return result;
+}
+
+
+static void
+yyerror (str)
+ const char *str;
+{
+ /* Do nothing. We don't print error messages here. */
+}
diff --git a/intl/ref-add.sin b/intl/ref-add.sin
new file mode 100644
index 000000000..167374e3c
--- /dev/null
+++ b/intl/ref-add.sin
@@ -0,0 +1,31 @@
+# Add this package to a list of references stored in a text file.
+#
+# Copyright (C) 2000 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Library General Public License as published
+# by the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+#
+# Written by Bruno Haible <haible@clisp.cons.org>.
+#
+/^# Packages using this file: / {
+ s/# Packages using this file://
+ ta
+ :a
+ s/ @PACKAGE@ / @PACKAGE@ /
+ tb
+ s/ $/ @PACKAGE@ /
+ :b
+ s/^/# Packages using this file:/
+}
diff --git a/intl/ref-del.sin b/intl/ref-del.sin
new file mode 100644
index 000000000..613cf37f3
--- /dev/null
+++ b/intl/ref-del.sin
@@ -0,0 +1,26 @@
+# Remove this package from a list of references stored in a text file.
+#
+# Copyright (C) 2000 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Library General Public License as published
+# by the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+#
+# Written by Bruno Haible <haible@clisp.cons.org>.
+#
+/^# Packages using this file: / {
+ s/# Packages using this file://
+ s/ @PACKAGE@ / /
+ s/^/# Packages using this file:/
+}
diff --git a/intl/textdomain.c b/intl/textdomain.c
new file mode 100644
index 000000000..05c2fd76b
--- /dev/null
+++ b/intl/textdomain.c
@@ -0,0 +1,141 @@
+/* Implementation of the textdomain(3) function.
+ 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 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+#include "gettextP.h"
+
+#ifdef _LIBC
+/* We have to handle multi-threaded applications. */
+# include <bits/libc-lock.h>
+#else
+/* Provide dummy implementation if this is outside glibc. */
+# define __libc_rwlock_define(CLASS, NAME)
+# define __libc_rwlock_wrlock(NAME)
+# define __libc_rwlock_unlock(NAME)
+#endif
+
+/* The internal variables in the standalone libintl.a must have different
+ names than the internal variables in GNU libc, otherwise programs
+ using libintl.a cannot be linked statically. */
+#if !defined _LIBC
+# define _nl_default_default_domain _nl_default_default_domain__
+# define _nl_current_default_domain _nl_current_default_domain__
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Name of the default text domain. */
+extern const char _nl_default_default_domain[];
+
+/* Default text domain in which entries for gettext(3) are to be found. */
+extern const char *_nl_current_default_domain;
+
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define TEXTDOMAIN __textdomain
+# ifndef strdup
+# define strdup(str) __strdup (str)
+# endif
+#else
+# define TEXTDOMAIN textdomain__
+#endif
+
+/* Lock variable to protect the global data in the gettext implementation. */
+__libc_rwlock_define (extern, _nl_state_lock)
+
+/* Set the current default message catalog to DOMAINNAME.
+ If DOMAINNAME is null, return the current default.
+ If DOMAINNAME is "", reset to the default of "messages". */
+char *
+TEXTDOMAIN (domainname)
+ const char *domainname;
+{
+ char *new_domain;
+ char *old_domain;
+
+ /* A NULL pointer requests the current setting. */
+ if (domainname == NULL)
+ return (char *) _nl_current_default_domain;
+
+ __libc_rwlock_wrlock (_nl_state_lock);
+
+ old_domain = (char *) _nl_current_default_domain;
+
+ /* If domain name is the null string set to default domain "messages". */
+ if (domainname[0] == '\0'
+ || strcmp (domainname, _nl_default_default_domain) == 0)
+ {
+ _nl_current_default_domain = _nl_default_default_domain;
+ new_domain = (char *) _nl_current_default_domain;
+ }
+ else if (strcmp (domainname, old_domain) == 0)
+ /* This can happen and people will use it to signal that some
+ environment variable changed. */
+ new_domain = old_domain;
+ else
+ {
+ /* If the following malloc fails `_nl_current_default_domain'
+ will be NULL. This value will be returned and so signals we
+ are out of core. */
+#if defined _LIBC || defined HAVE_STRDUP
+ new_domain = strdup (domainname);
+#else
+ size_t len = strlen (domainname) + 1;
+ new_domain = (char *) malloc (len);
+ if (new_domain != NULL)
+ memcpy (new_domain, domainname, len);
+#endif
+
+ if (new_domain != NULL)
+ _nl_current_default_domain = new_domain;
+ }
+
+ /* We use this possibility to signal a change of the loaded catalogs
+ since this is most likely the case and there is no other easy we
+ to do it. Do it only when the call was successful. */
+ if (new_domain != NULL)
+ {
+ ++_nl_msg_cat_cntr;
+
+ if (old_domain != new_domain && old_domain != _nl_default_default_domain)
+ free (old_domain);
+ }
+
+ __libc_rwlock_unlock (_nl_state_lock);
+
+ return new_domain;
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__textdomain, textdomain);
+#endif
diff --git a/m4/Makefile.am b/m4/Makefile.am
index 71a3353cc..9a54c1279 100644
--- a/m4/Makefile.am
+++ b/m4/Makefile.am
@@ -6,7 +6,9 @@ m4datadir = @ACLOCAL_DIR@
m4data_DATA = xine.m4
endif
-EXTRA_DIST = _xine.m4 alsa.m4 arts.m4 esd.m4 xine.m4 aa.m4 irixal.m4 as.m4 ogg.m4 vorbis.m4
+EXTRA_DIST = _xine.m4 arts.m4 esd.m4 iconv.m4 lcmessage.m4 vorbis.m4 aa.m4 as.m4 \
+ gettext.m4 irixal.m4 ogg.m4 alsa.m4 codeset.m4 glibc21.m4 isc-posix.m4 progtest.m4
+
debug:
diff --git a/m4/codeset.m4 b/m4/codeset.m4
new file mode 100644
index 000000000..863c9cfa7
--- /dev/null
+++ b/m4/codeset.m4
@@ -0,0 +1,17 @@
+#serial AM1
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset,
+ [AC_TRY_LINK([#include <langinfo.h>],
+ [char* cs = nl_langinfo(CODESET);],
+ am_cv_langinfo_codeset=yes,
+ am_cv_langinfo_codeset=no)
+ ])
+ if test $am_cv_langinfo_codeset = yes; then
+ AC_DEFINE(HAVE_LANGINFO_CODESET, 1,
+ [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+ fi
+])
diff --git a/m4/gettext.m4 b/m4/gettext.m4
new file mode 100644
index 000000000..bbb0e9c71
--- /dev/null
+++ b/m4/gettext.m4
@@ -0,0 +1,368 @@
+# Macro to add for using GNU gettext.
+# Ulrich Drepper <drepper@cygnus.com>, 1995.
+#
+# This file can be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU General Public
+# License but which still want to provide support for the GNU gettext
+# functionality.
+# Please note that the actual code of GNU gettext is covered by the GNU
+# General Public License and is *not* in the public domain.
+
+# serial 10
+
+dnl Usage: AM_WITH_NLS([TOOLSYMBOL], [NEEDSYMBOL], [LIBDIR]).
+dnl If TOOLSYMBOL is specified and is 'use-libtool', then a libtool library
+dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl depending on --{enable,disable}-{shared,static} and on the presence of
+dnl AM-DISABLE-SHARED). Otherwise, a static library
+dnl $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl implementations (in libc or libintl) without the ngettext() function
+dnl will be ignored.
+dnl LIBDIR is used to find the intl libraries. If empty,
+dnl the value `$(top_builddir)/intl/' is used.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl and used.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl Catalog format: none
+dnl Catalog extension: none
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_WITH_NLS],
+ [AC_MSG_CHECKING([whether NLS is requested])
+ dnl Default is enabled NLS
+ AC_ARG_ENABLE(nls,
+ [ --disable-nls do not use Native Language Support],
+ USE_NLS=$enableval, USE_NLS=yes)
+ AC_MSG_RESULT($USE_NLS)
+ AC_SUBST(USE_NLS)
+
+ BUILD_INCLUDED_LIBINTL=no
+ USE_INCLUDED_LIBINTL=no
+ INTLLIBS=
+
+ dnl If we use NLS figure out what method
+ if test "$USE_NLS" = "yes"; then
+ AC_DEFINE(ENABLE_NLS, 1,
+ [Define to 1 if translation of program messages to the user's native language
+ is requested.])
+ AC_MSG_CHECKING([whether included gettext is requested])
+ AC_ARG_WITH(included-gettext,
+ [ --with-included-gettext use the GNU gettext library included here],
+ nls_cv_force_use_gnu_gettext=$withval,
+ nls_cv_force_use_gnu_gettext=no)
+ AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+ dnl User does not insist on using GNU NLS library. Figure out what
+ dnl to use. If GNU gettext is available we use this. Else we have
+ dnl to fall back to GNU NLS library.
+ CATOBJEXT=NONE
+
+ dnl Add a version number to the cache macros.
+ define(gt_cv_func_gnugettext_libc, [gt_cv_func_gnugettext]ifelse([$2], need-ngettext, 2, 1)[_libc])
+ define(gt_cv_func_gnugettext_libintl, [gt_cv_func_gnugettext]ifelse([$2], need-ngettext, 2, 1)[_libintl])
+
+ AC_CHECK_HEADER(libintl.h,
+ [AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,
+ [AC_TRY_LINK([#include <libintl.h>
+extern int _nl_msg_cat_cntr;],
+ [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], need-ngettext, [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr],
+ gt_cv_func_gnugettext_libc=yes,
+ gt_cv_func_gnugettext_libc=no)])
+
+ if test "$gt_cv_func_gnugettext_libc" != "yes"; then
+ AC_CACHE_CHECK([for GNU gettext in libintl],
+ gt_cv_func_gnugettext_libintl,
+ [gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -lintl $LIBICONV"
+ AC_TRY_LINK([#include <libintl.h>
+extern int _nl_msg_cat_cntr;],
+ [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], need-ngettext, [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr],
+ gt_cv_func_gnugettext_libintl=yes,
+ gt_cv_func_gnugettext_libintl=no)
+ LIBS="$gt_save_LIBS"])
+ fi
+
+ dnl If an already present or preinstalled GNU gettext() is found,
+ dnl use it. But if this macro is used in GNU gettext, and GNU
+ dnl gettext is already preinstalled in libintl, we update this
+ dnl libintl. (Cf. the install rule in intl/Makefile.in.)
+ if test "$gt_cv_func_gnugettext_libc" = "yes" \
+ || { test "$gt_cv_func_gnugettext_libintl" = "yes" \
+ && test "$PACKAGE" != gettext; }; then
+ AC_DEFINE(HAVE_GETTEXT, 1,
+ [Define if the GNU gettext() function is already present or preinstalled.])
+
+ if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
+ dnl If iconv() is in a separate libiconv library, then anyone
+ dnl linking with libintl{.a,.so} also needs to link with
+ dnl libiconv.
+ INTLLIBS="-lintl $LIBICONV"
+ fi
+
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $INTLLIBS"
+ AC_CHECK_FUNCS(dcgettext)
+ LIBS="$gt_save_LIBS"
+
+ dnl Search for GNU msgfmt in the PATH.
+ AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1], :)
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+
+ dnl Search for GNU xgettext in the PATH.
+ AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ [$ac_dir/$ac_word --omit-header /dev/null >/dev/null 2>&1], :)
+
+ CATOBJEXT=.gmo
+ fi
+ ])
+
+ if test "$CATOBJEXT" = "NONE"; then
+ dnl GNU gettext is not found in the C library.
+ dnl Fall back on GNU gettext library.
+ nls_cv_use_gnu_gettext=yes
+ fi
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions used to generate GNU NLS library.
+ INTLOBJS="\$(GETTOBJS)"
+ AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1], :)
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+ AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ [$ac_dir/$ac_word --omit-header /dev/null >/dev/null 2>&1], :)
+ AC_SUBST(MSGFMT)
+ BUILD_INCLUDED_LIBINTL=yes
+ USE_INCLUDED_LIBINTL=yes
+ CATOBJEXT=.gmo
+ INTLLIBS="ifelse([$3],[],\$(top_builddir)/intl,[$3])/libintl.ifelse([$1], use-libtool, [l], [])a $LIBICONV"
+ LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+ fi
+
+ 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; then
+ : ;
+ else
+ AC_MSG_RESULT(
+ [found msgfmt 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 /dev/null >/dev/null 2>&1; then
+ : ;
+ else
+ AC_MSG_RESULT(
+ [found xgettext program is not GNU xgettext; ignore it])
+ XGETTEXT=":"
+ fi
+ fi
+
+ dnl We need to process the po/ directory.
+ POSUB=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"
+ sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," -e "\$s/\(.*\) \\\\/\1/" < "$ac_given_srcdir/$ac_dir/POTFILES.in" > "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+ sed -e "/POTFILES =/r $ac_dir/POTFILES" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+ fi
+ ;;
+ esac
+ done])
+
+
+ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+ dnl to 'yes' because some of the testsuite requires it.
+ if test "$PACKAGE" = gettext; then
+ BUILD_INCLUDED_LIBINTL=yes
+ fi
+
+ dnl intl/plural.c is generated from intl/plural.y. It requires bison,
+ dnl because plural.y uses bison specific features. It requires at least
+ dnl bison-1.26 because earlier versions generate a plural.c that doesn't
+ dnl compile.
+ dnl bison is only needed for the maintainer (who touches plural.y). But in
+ dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
+ dnl the rule in general Makefile. Now, some people carelessly touch the
+ dnl files or have a broken "make" program, hence the plural.c rule will
+ dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
+ dnl present or too old.
+ AC_CHECK_PROGS([INTLBISON], [bison])
+ if test -z "$INTLBISON"; then
+ ac_verc_fail=yes
+ else
+ dnl Found it, now check the version.
+ AC_MSG_CHECKING([version of bison])
+changequote(<<,>>)dnl
+ ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison .* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+ case $ac_prog_version in
+ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+ 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+changequote([,])dnl
+ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ esac
+ AC_MSG_RESULT([$ac_prog_version])
+ fi
+ if test $ac_verc_fail = yes; then
+ INTLBISON=:
+ fi
+
+ dnl These rules are solely for the distribution goal. While doing this
+ dnl we only have to keep exactly one list of the available catalogs
+ dnl in configure.in.
+ for lang in $ALL_LINGUAS; do
+ GMOFILES="$GMOFILES $lang.gmo"
+ POFILES="$POFILES $lang.po"
+ done
+
+ dnl Make all variables we use known to autoconf.
+ AC_SUBST(BUILD_INCLUDED_LIBINTL)
+ AC_SUBST(USE_INCLUDED_LIBINTL)
+ AC_SUBST(CATALOGS)
+ AC_SUBST(CATOBJEXT)
+ AC_SUBST(GMOFILES)
+ AC_SUBST(INTLLIBS)
+ AC_SUBST(INTLOBJS)
+ AC_SUBST(POFILES)
+ AC_SUBST(POSUB)
+
+ dnl For backward compatibility. Some configure.ins may be using this.
+ nls_cv_header_intl=
+ nls_cv_header_libgt=
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ DATADIRNAME=share
+ AC_SUBST(DATADIRNAME)
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INSTOBJEXT=.mo
+ AC_SUBST(INSTOBJEXT)
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ GENCAT=gencat
+ AC_SUBST(GENCAT)
+ ])
+
+dnl Usage: Just like AM_WITH_NLS, which see.
+AC_DEFUN([AM_GNU_GETTEXT],
+ [AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+ AC_REQUIRE([AC_PROG_CC])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl
+ AC_REQUIRE([AC_PROG_RANLIB])dnl
+ AC_REQUIRE([AC_ISC_POSIX])dnl
+ AC_REQUIRE([AC_HEADER_STDC])dnl
+ AC_REQUIRE([AC_C_CONST])dnl
+ AC_REQUIRE([AC_C_INLINE])dnl
+ AC_REQUIRE([AC_TYPE_OFF_T])dnl
+ AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+ AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+ AC_REQUIRE([AC_FUNC_MMAP])dnl
+ AC_REQUIRE([jm_GLIBC21])dnl
+
+ AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h])
+ AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getcwd getegid geteuid \
+getgid getuid mempcpy munmap putenv setenv setlocale stpcpy strchr strcasecmp \
+strdup strtoul tsearch __argz_count __argz_stringify __argz_next])
+
+ AM_ICONV
+ AM_LANGINFO_CODESET
+ AM_LC_MESSAGES
+ AM_WITH_NLS([$1],[$2],[$3])
+
+ if test "x$CATOBJEXT" != "x"; then
+ if test "x$ALL_LINGUAS" = "x"; then
+ LINGUAS=
+ else
+ AC_MSG_CHECKING(for catalogs to be installed)
+ NEW_LINGUAS=
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ for desiredlang in ${LINGUAS-$ALL_LINGUAS}; 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
+ NEW_LINGUAS="$NEW_LINGUAS $presentlang"
+ fi
+ done
+ LINGUAS=$NEW_LINGUAS
+ AC_MSG_RESULT($LINGUAS)
+ fi
+
+ dnl Construct list of names of catalog files to be constructed.
+ if test -n "$LINGUAS"; then
+ for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+ fi
+ fi
+
+ dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
+ dnl find the mkinstalldirs script in another subdir but $(top_srcdir).
+ dnl Try to locate is.
+ MKINSTALLDIRS=
+ if test -n "$ac_aux_dir"; then
+ MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+ fi
+ if test -z "$MKINSTALLDIRS"; then
+ MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+ fi
+ AC_SUBST(MKINSTALLDIRS)
+
+ dnl Enable libtool support if the surrounding package wishes it.
+ INTL_LIBTOOL_SUFFIX_PREFIX=ifelse([$1], use-libtool, [l], [])
+ AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
+ ])
diff --git a/m4/glibc21.m4 b/m4/glibc21.m4
new file mode 100644
index 000000000..5b88ef231
--- /dev/null
+++ b/m4/glibc21.m4
@@ -0,0 +1,26 @@
+#serial 2
+
+# Test for the GNU C Library, version 2.1 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([jm_GLIBC21],
+ [
+ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer,
+ ac_cv_gnu_library_2_1,
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ ac_cv_gnu_library_2_1=yes,
+ ac_cv_gnu_library_2_1=no)
+ ]
+ )
+ AC_SUBST(GLIBC21)
+ GLIBC21="$ac_cv_gnu_library_2_1"
+ ]
+)
diff --git a/m4/iconv.m4 b/m4/iconv.m4
new file mode 100644
index 000000000..17237344a
--- /dev/null
+++ b/m4/iconv.m4
@@ -0,0 +1,69 @@
+#serial AM2
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV],
+[
+ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+ dnl those with the standalone portable GNU libiconv installed).
+
+ AC_ARG_WITH([libiconv-prefix],
+[ --with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib], [
+ for dir in `echo "$withval" | tr : ' '`; do
+ if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi
+ if test -d $dir/lib; then LDFLAGS="$LDFLAGS -L$dir/lib"; fi
+ done
+ ])
+
+ AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+ [iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);],
+ am_cv_func_iconv=yes)
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS -liconv"
+ AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+ [iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);],
+ am_cv_lib_iconv=yes
+ am_cv_func_iconv=yes)
+ LIBS="$am_save_LIBS"
+ fi
+ ])
+ if test "$am_cv_func_iconv" = yes; then
+ AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
+ AC_MSG_CHECKING([for iconv declaration])
+ AC_CACHE_VAL(am_cv_proto_iconv, [
+ AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
+ am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+ am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+ AC_MSG_RESULT([$]{ac_t:-
+ }[$]am_cv_proto_iconv)
+ AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
+ [Define as const if the declaration of iconv() needs const.])
+ fi
+ LIBICONV=
+ if test "$am_cv_lib_iconv" = yes; then
+ LIBICONV="-liconv"
+ fi
+ AC_SUBST(LIBICONV)
+])
diff --git a/m4/isc-posix.m4 b/m4/isc-posix.m4
new file mode 100644
index 000000000..99c899ce5
--- /dev/null
+++ b/m4/isc-posix.m4
@@ -0,0 +1,17 @@
+#serial 1
+# This test replaces the one in autoconf.
+# Currently this macro should have the same name as the autoconf macro
+# because gettext's gettext.m4 (distributed in the automake package)
+# still uses it. Otherwise, the use in gettext.m4 makes autoheader
+# give these diagnostics:
+# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX
+# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX
+
+undefine([AC_ISC_POSIX])
+
+AC_DEFUN([AC_ISC_POSIX],
+ [
+ dnl This test replaces the obsolescent AC_ISC_POSIX kludge.
+ AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"])
+ ]
+)
diff --git a/m4/lcmessage.m4 b/m4/lcmessage.m4
new file mode 100644
index 000000000..acfd3ace1
--- /dev/null
+++ b/m4/lcmessage.m4
@@ -0,0 +1,22 @@
+# Check whether LC_MESSAGES is available in <locale.h>.
+# Ulrich Drepper <drepper@cygnus.com>, 1995.
+#
+# This file can be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU General Public
+# License but which still want to provide support for the GNU gettext
+# functionality.
+# Please note that the actual code of GNU gettext is covered by the GNU
+# General Public License and is *not* in the public domain.
+
+# serial 2
+
+AC_DEFUN([AM_LC_MESSAGES],
+ [if test $ac_cv_header_locale_h = yes; then
+ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+ [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+ am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+ if test $am_cv_val_LC_MESSAGES = yes; then
+ AC_DEFINE(HAVE_LC_MESSAGES, 1,
+ [Define if your <locale.h> file defines LC_MESSAGES.])
+ fi
+ fi])
diff --git a/m4/progtest.m4 b/m4/progtest.m4
new file mode 100644
index 000000000..08840d5dd
--- /dev/null
+++ b/m4/progtest.m4
@@ -0,0 +1,49 @@
+# Search path for a program which passes the given test.
+# Ulrich Drepper <drepper@cygnus.com>, 1996.
+#
+# This file can be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU General Public
+# License but which still want to provide support for the GNU gettext
+# functionality.
+# Please note that the actual code of GNU gettext is covered by the GNU
+# General Public License and is *not* in the public domain.
+
+# serial 2
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+ /*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+ AC_MSG_RESULT([$]$1)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
diff --git a/m4/xine.m4 b/m4/xine.m4
index ac27a2c00..4594159f5 100644
--- a/m4/xine.m4
+++ b/m4/xine.m4
@@ -1,4 +1,4 @@
-dnl Configure paths for XINE
+nl Configure paths for XINE
dnl
dnl Copyright (C) 2001 Daniel Caujolle-Bert <segfault@club-internet.fr>
dnl
@@ -74,6 +74,7 @@ AC_ARG_ENABLE(xinetest,
xine_script_dir=`$XINE_CONFIG $xine_config_args --scriptdir`
xine_desktop_dir=`$XINE_CONFIG $xine_config_args --desktopdir`
xine_plugin_dir=`$XINE_CONFIG $xine_config_args --plugindir`
+ xine_locale_dir=`$XINE_CONFIG $xine_config_args --localedir`
dnl if test "x$enable_xinetest" = "xyes" ; then
ac_save_CFLAGS="$CFLAGS"
ac_save_LIBS="$LIBS"
diff --git a/misc/xine-config.in b/misc/xine-config.in
index 13de1a352..97c5afc6b 100644
--- a/misc/xine-config.in
+++ b/misc/xine-config.in
@@ -20,6 +20,7 @@ Options:
[--skindir]
[--scriptdir]
[--desktopdir]
+ [--localedir]
EOF
exit $1
}
@@ -72,6 +73,9 @@ while test $# -gt 0; do
--desktopdir)
echo_desktopdir=yes
;;
+ --localedir)
+ echo_localedir=yes
+ ;;
*)
usage 1 1>&2
;;
@@ -92,7 +96,7 @@ if test "$echo_cflags" = "yes"; then
fi
if test "$echo_libs" = "yes"; then
- echo -L@libdir@ -lxineutils -lxine @THREAD_LIBS@
+ echo -L@libdir@ -lxineutils -lxine @INTLLIBS@ @THREAD_LIBS@
fi
if test "$echo_plugindir" = "yes"; then
echo "@XINE_PLUGINPATH@"
@@ -106,3 +110,6 @@ fi
if test "$echo_desktopdir" = "yes"; then
echo "@XINE_DESKTOPPATH@"
fi
+if test "$echo_localedir" = "yes"; then
+ echo "@XINE_LOCALEPATH@"
+fi
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
new file mode 100644
index 000000000..186f7534a
--- /dev/null
+++ b/po/Makefile.in.in
@@ -0,0 +1,199 @@
+# Makefile for program source directory in GNU NLS utilities package.
+# Copyright (C) 1995-1997, 2000, 2001 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# This file file be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+# Please note that the actual code is *not* freely available.
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = @datadir@
+localedir = $(datadir)/locale
+gettextsrcdir = $(datadir)/gettext/po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac`
+
+CC = @CC@
+GMSGFMT = @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = @XGETTEXT@
+MSGMERGE = msgmerge
+
+DEFS = @DEFS@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I.. -I$(top_srcdir)/intl
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+DISTFILES = Makefile.in.in POTFILES.in $(PACKAGE).pot \
+$(POFILES) $(GMOFILES)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+
+.SUFFIXES:
+.SUFFIXES: .c .o .po .pox .gmo .mo
+
+.c.o:
+ $(COMPILE) $<
+
+.po.pox:
+ $(MAKE) $(PACKAGE).pot
+ $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox
+
+.po.mo:
+ $(MSGFMT) -o $@ $<
+
+.po.gmo:
+ file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \
+ && rm -f $$file && $(GMSGFMT) --statistics -o $$file $<
+
+
+all: all-@USE_NLS@
+
+all-yes: $(CATALOGS)
+all-no:
+
+# Note: Target 'all' must not depend on target '$(srcdir)/$(PACKAGE).pot',
+# otherwise packages like GCC can not be built if only parts of the source
+# have been downloaded.
+
+$(srcdir)/$(PACKAGE).pot: $(POTFILES) $(srcdir)/POTFILES.in
+ $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \
+ --add-comments --keyword=_ --keyword=N_ \
+ --files-from=$(srcdir)/POTFILES.in \
+ && test ! -f $(PACKAGE).po \
+ || ( rm -f $(srcdir)/$(PACKAGE).pot \
+ && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot )
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext"; then \
+ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
+ $(INSTALL_DATA) $(srcdir)/Makefile.in.in \
+ $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \
+ else \
+ : ; \
+ fi
+install-data-no: all
+install-data-yes: all
+ $(mkinstalldirs) $(DESTDIR)$(datadir)
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\.gmo$$//'`; \
+ dir=$(localedir)/$$lang/LC_MESSAGES; \
+ $(mkinstalldirs) $(DESTDIR)$$dir; \
+ if test -r $$cat; then \
+ $(INSTALL_DATA) $$cat $(DESTDIR)$$dir/$(PACKAGE).mo; \
+ echo "installing $$cat as $(DESTDIR)$$dir/$(PACKAGE).mo"; \
+ else \
+ $(INSTALL_DATA) $(srcdir)/$$cat $(DESTDIR)$$dir/$(PACKAGE).mo; \
+ echo "installing $(srcdir)/$$cat as" \
+ "$(DESTDIR)$$dir/$(PACKAGE).mo"; \
+ fi; \
+ done
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\.gmo$$//'`; \
+ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(PACKAGE).mo; \
+ done
+ if test "$(PACKAGE)" = "gettext"; then \
+ rm -f $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \
+ else \
+ : ; \
+ fi
+
+check: all
+
+dvi info tags TAGS ID:
+
+mostlyclean:
+ rm -f core core.* *.pox $(PACKAGE).po *.new.po
+ rm -fr *.o *~ \#* .*~ .\#*
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile Makefile.in POTFILES *.mo
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f $(GMOFILES)
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir:
+ $(MAKE) update-po
+ @$(MAKE) dist2
+# This is a separate target because 'update-po' must be executed before.
+dist2: $(DISTFILES)
+ dists="$(DISTFILES)"; \
+ for file in $$dists; do \
+ if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
+ cp -p $$dir/$$file $(distdir); \
+ done
+
+update-po: Makefile
+ $(MAKE) $(PACKAGE).pot
+ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; fi; \
+ 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
+
+update-gmo: Makefile $(GMOFILES)
+ @:
+
+Makefile: Makefile.in.in $(top_builddir)/config.status POTFILES.in
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
+ $(SHELL) ./config.status
+
+debug:
+install-debug: install
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644
index 000000000..a6fe787b5
--- /dev/null
+++ b/po/POTFILES.in
@@ -0,0 +1,26 @@
+# For updating this file, look at the result of:
+# head -3 po/POTFILES.in > /tmp/POTFILES.in && find src -name "*.[chy]" | xargs grep -l '[^A-Za-z_]_(' | grep -v src/xine-engine/xineintl.h >> /tmp/POTFILES.in && cp /tmp/POTFILES.in po/
+
+src/demuxers/demux_ts.c
+src/demuxers/demux_avi.c
+src/demuxers/demux_elem.c
+src/demuxers/demux_mpeg.c
+src/demuxers/demux_mpeg_block.c
+src/demuxers/demux_mpgaudio.c
+src/demuxers/demux_pes.c
+src/demuxers/demux_qt.c
+src/demuxers/demux_ogg.c
+src/demuxers/demux_asf.c
+src/demuxers/demux_cda.c
+src/input/input_net.c
+src/input/input_rtp.c
+src/input/input_stdin_fifo.c
+src/input/input_dvd.c
+src/input/input_file.c
+src/input/input_vcd.c
+src/input/input_http.c
+src/input/input_cda.c
+src/xine-engine/metronom.c
+src/xine-engine/video_out.c
+src/xine-engine/xine.c
+src/xine-engine/load_plugins.c
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 000000000..eeba4f9ce
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,1535 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2001-12-27 15:07+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/demuxers/demux_ts.c:237
+msgid "demux_ts: demux error! PAT without payload unit start\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:246
+msgid "demux_ts: demux error! PAT with invalid pointer\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:288
+msgid "demux_ts: demux error! PAT with invalid section length\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:292
+#, c-format
+msgid "demux_ts: demux error! PAT with invalid section %02x of %02x\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:302
+#, c-format
+msgid ""
+"demux_ts: demux error! PAT with invalid CRC32: packet_crc32=0x%08x "
+"calc_crc32=0x%08x\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:355
+#, c-format
+msgid "demux_ts: error %02x %02x %02x (should be 0x000001) \n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:491
+#, c-format
+msgid "fifo unavailable (%d)\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:503
+#, c-format
+msgid "demux_ts: dropped input packet cc = %d expected = %d\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:515
+msgid "PUS set but no PES header (corrupt stream?)\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:521
+msgid "demux_ts: broken pes encountered\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:624
+msgid "demux error! PMT without payload unit start\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:633
+msgid "demux error! PMT with invalid pointer\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:675
+msgid "demux error! PMT with invalid section length\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:679
+#, c-format
+msgid "demux error! PMT with invalid section %02x of %02x\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:689
+#, c-format
+msgid ""
+"demux_ts: demux error! PMT with invalid CRC32: packet_crc32=0x%08x "
+"calc_crc32=0x%08x\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:701
+msgid "demux error! PMT with inconsistent progInfo length\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:717
+msgid "demux error! PMT with inconsistent streamInfo length\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:822
+msgid "RE-Sync failed\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:970
+#, c-format
+msgid "demux error! invalid ts sync byte %02x\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:974
+msgid "demux error! transport error\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:998
+#, c-format
+msgid "demux_ts: demux error! invalid payload size %d\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:1141
+#, c-format
+msgid "demux %u ts_open!\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:1232
+#, c-format
+msgid "demux_ts: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:1243
+msgid "demux_ts: stop...\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:1290
+#, c-format
+msgid ""
+"demux_ts: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:509
+msgid "demux_avi: reconstructing index"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:540
+msgid "done\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:846
+msgid "demux_avi: demux loop finished.\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:860
+msgid "demux_avi: stop...ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:918
+#, c-format
+msgid "demux_avi: video format = %s, audio format = 0x%lx\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:925
+#, c-format
+msgid "demux_avi: unknown audio type 0x%lx\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:930
+#, c-format
+msgid "demux_avi: audio type %s (wFormatTag 0x%x)\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:948 src/demuxers/demux_avi.c:965
+msgid "demux_avi: video seek to start failed\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:982
+msgid "demux_avi: audio seek to start failed\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:1013
+#, c-format
+msgid "demux_avi: unknown avi format %.4s\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:1020
+#, c-format
+msgid "demux_avi: video codec >%s<\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:1057
+msgid "demux_avi: text subtitle file available\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:1063
+#, c-format
+msgid "demux_avi: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:1095
+#, c-format
+msgid "demux_avi: %ld frames\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:1101 src/demuxers/demux_avi.c:1138
+#, c-format
+msgid "demux_avi: AVI_init failed (AVI_errno: %d)\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:1183
+#, c-format
+msgid ""
+"demux_avi: this plugin doesn't support plugin API version %d.\n"
+"demux_avi: this means there's a version mismatch between xine and this "
+"demux_avi: demuxer plugin.\n"
+"Installing current demuxer plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_elem.c:250
+#, c-format
+msgid "demux_elem: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_elem.c:363
+#, c-format
+msgid ""
+"demux_elem: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg.c:130 src/demuxers/demux_pes.c:126
+#, c-format
+msgid "How how - something wrong in wonderland demux:read_bytes (%d)\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg.c:667 src/demuxers/demux_pes.c:349
+#, c-format
+msgid "demux loop finished (status: %d, buf:%x)\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg.c:681
+msgid "demux_mpeg: stop...\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg.c:784
+#, c-format
+msgid "demux_mpeg: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg.c:873
+msgid "You should specify mpeg(mpeg1/mpeg2) stream type.\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg.c:938 src/demuxers/demux_mpgaudio.c:466
+#, c-format
+msgid ""
+"demux_mpeg: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:116
+msgid "demux_mpeg_block: read_block failed\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:130
+#, c-format
+msgid "demux_mpeg_block: checking if we can branch to %s\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:135
+msgid "demux_mpeg_block: branching\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:265
+#, c-format
+msgid "demux_mpeg_block: error! %02x %02x %02x (should be 0x000001) \n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:271
+msgid ""
+"demux_mpeg_block: too many errors, stopping playback. Maybe this stream is "
+"scrambled?\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:366
+#, c-format
+msgid ""
+"demux_mpeg_block: warning: pes header indicates that this stream may be "
+"encrypted (encryption mode %d)\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:480
+#, c-format
+msgid "illegal lpcm sample format (%d), assume 16-bit samples\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:643
+#, c-format
+msgid "demux_mpeg_block: error %02x %02x %02x (should be 0x000001) \n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:744
+msgid "demux_mpeg_block: stop...ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:863
+#, c-format
+msgid "demux_mpeg_block: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:880
+#, c-format
+msgid "demux_mpeg_block: mrl %s is new, will estimated bitrate\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:884
+#, c-format
+msgid "demux_mpeg_block: mrl %s is known, estimated bitrate: %d\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:1040
+#, c-format
+msgid ""
+"demux_mpeg_block: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_mpgaudio.c:176
+#, c-format
+msgid "mpgaudio: bitrate = %.2fkbps\n"
+msgstr ""
+
+#: src/demuxers/demux_mpgaudio.c:263
+msgid "demux_mpgaudio_block: stop...ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_mpgaudio.c:367
+#, c-format
+msgid "demux_mpgaudio: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_pes.c:363
+msgid "demux_pes: stop...\n"
+msgstr ""
+
+#: src/demuxers/demux_pes.c:459
+#, c-format
+msgid "demux_pes: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_pes.c:590
+#, c-format
+msgid ""
+"demux_pes: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:3199
+msgid "Header not compressed with zlib\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:3220
+msgid "QT cmov: malloc err 0"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:3228
+#, c-format
+msgid "QT cmov: read err tlen %llu\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:3237
+#, c-format
+msgid "QT cmov: malloc err moov_sz %u\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:3251
+#, c-format
+msgid "QT cmov: inflateInit err %d\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:3256
+#, c-format
+msgid "QT cmov inflate: ERR %d\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:3965
+msgid "demux_qt: quicktime_open: error in header\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:4134
+msgid "demux_qt: stop...ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:4195
+#, c-format
+msgid "demux_qt: unknown video codec >%s<\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:4199
+#, c-format
+msgid "demux_qt: video codec >%s<\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:4220
+#, c-format
+msgid "demux_qt: unknown audio codec >%s<\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:4252
+#, c-format
+msgid "demux_qt: video codec %s (%f fps), audio codec %s (%ld Hz, %d bits)\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:4331
+#, c-format
+msgid "demux_qt: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:4420
+#, c-format
+msgid ""
+"demux_qt: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_ogg.c:127
+#, c-format
+msgid ""
+"demux_ogg: beginning of stream\n"
+"demux_ogg: serial number %d\n"
+msgstr ""
+
+#: src/demuxers/demux_ogg.c:143
+#, c-format
+msgid "demux_ogg: found a new stream, serialnumber %d\n"
+msgstr ""
+
+#: src/demuxers/demux_ogg.c:159
+#, c-format
+msgid "demux_ogg: unknown streamtype, signature: >%.8s<\n"
+msgstr ""
+
+#: src/demuxers/demux_ogg.c:258
+msgid "demux_ogg: stop...ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_ogg.c:360
+#, c-format
+msgid "demux_ogg: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_ogg.c:434
+#, c-format
+msgid ""
+"demux_ogg: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:238 src/demuxers/demux_asf.c:255
+#: src/demuxers/demux_asf.c:272 src/demuxers/demux_asf.c:287
+msgid "demux_asf: end of data\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:340
+#, c-format
+msgid "demux_asf: unknown audio type 0x%x\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:344
+#, c-format
+msgid "demux_asf: audio format : %s (wFormatTag 0x%x)\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:364
+#, c-format
+msgid "demux_asf: wavex header is %d bytes long\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:391
+#, c-format
+msgid "demux_asf: unknown video format %.4s\n"
+msgstr ""
+
+#.
+#. printf ("demux_asf: video format : %.4s\n", (char*)&bih->biCompression);
+#.
+#: src/demuxers/demux_asf.c:407
+#, c-format
+msgid "demux_asf: video format : %s\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:431
+msgid "demux_asf: file doesn't start with an asf header\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:464
+#, c-format
+msgid "demux_asf: stream length is %d sec, rate is %d bytes/sec\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:515
+#, c-format
+msgid "demux_asf: audio conceal interleave detected (%d x %d x %d)\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:612
+msgid "demux_asf: absolute size ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:809
+msgid "demux_asf: buffer overflow on defrag!\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:840
+msgid "demux_asf: get_packet failed\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:874
+#, c-format
+msgid "demux_asf: unknow segtype %x\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:1053
+msgid "demux_asf: stop...ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:1139
+#, c-format
+msgid "demux_asf: title : %s\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:1140
+#, c-format
+msgid "demux_asf: author : %s\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:1141
+#, c-format
+msgid "demux_asf: copyright : %s\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:1142
+#, c-format
+msgid "demux_asf: comment : %s\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:1170
+#, c-format
+msgid "demux_asf: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:1245
+#, c-format
+msgid ""
+"demux_asf: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_cda.c:156
+msgid "demux_cda: stop...ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_cda.c:231
+#, c-format
+msgid "demux_cda: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_cda.c:307
+#, c-format
+msgid ""
+"demux_cda: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/input/input_net.c:100
+#, c-format
+msgid "socket(): %s\n"
+msgstr ""
+
+#: src/input/input_net.c:106
+#, c-format
+msgid "fcntl(nonblocking): %s\n"
+msgstr ""
+
+#: src/input/input_net.c:117
+#, c-format
+msgid "connect(): %s\n"
+msgstr ""
+
+#. Ermm.. ??
+#: src/input/input_net.c:136
+#, c-format
+msgid "select(): %s\n"
+msgstr ""
+
+#: src/input/input_net.c:152 src/input/input_rtp.c:205
+#, c-format
+msgid "unable to resolve '%s'.\n"
+msgstr ""
+
+#: src/input/input_net.c:165 src/input/input_rtp.c:218
+#, c-format
+msgid "unable to connect to '%s'.\n"
+msgstr ""
+
+#: src/input/input_net.c:286
+#, fuzzy
+msgid "net input plugin as shipped with xine"
+msgstr "Plugin d'entrée pour lecteur de DVD fournis avec xine"
+
+#: src/input/input_net.c:324
+#, c-format
+msgid ""
+"net input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/input/input_rtp.c:157
+#, c-format
+msgid "socket(): %s.\n"
+msgstr ""
+
+#: src/input/input_rtp.c:167
+#, c-format
+msgid "bind(): %s.\n"
+msgstr ""
+
+#: src/input/input_rtp.c:185
+#, c-format
+msgid "setsockopt(IP_ADD_MEMBERSHIP) failed (multicast kernel?): %s.\n"
+msgstr ""
+
+#: src/input/input_rtp.c:241
+msgid "OUCH - ran out of buffers\n"
+msgstr ""
+
+#: src/input/input_rtp.c:271
+#, c-format
+msgid "OUCH - dropped input packet %d %d\n"
+msgstr ""
+
+#: src/input/input_rtp.c:311
+#, c-format
+msgid "Opening >%s<\n"
+msgstr ""
+
+#: src/input/input_rtp.c:339
+#, c-format
+msgid "input_rtp: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/input/input_rtp.c:450
+#, fuzzy
+msgid "rtp input plugin as shipped with xine"
+msgstr "Plugin d'entrée pour lecteur de DVD fournis avec xine"
+
+#: src/input/input_rtp.c:490
+#, c-format
+msgid ""
+"rtp input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/input/input_rtp.c:506 src/input/input_rtp.c:511
+msgid "unable to allocate input buffer.\n"
+msgstr ""
+
+#: src/input/input_stdin_fifo.c:252
+#, fuzzy
+msgid "stdin/fifo input plugin as shipped with xine"
+msgstr "Plugin d'entrée pour lecteur de DVD fournis avec xine"
+
+#: src/input/input_stdin_fifo.c:281
+#, c-format
+msgid ""
+"stdin/fifo input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/input/input_dvd.c:145 src/input/input_dvd.c:692
+#: src/input/input_dvd.c:752
+#, c-format
+msgid "input_dvd: unable to open dvd drive (%s): %s\n"
+msgstr ""
+
+#: src/input/input_dvd.c:242
+#, c-format
+msgid "USCSICMD dvd_read_copyright: %s"
+msgstr ""
+
+#: src/input/input_dvd.c:246
+msgid "bad status: READ DVD STRUCTURE (copyright)\n"
+msgstr ""
+
+#: src/input/input_dvd.c:300
+#, c-format
+msgid "input_dvd: cannot open dvd drive >%s<\n"
+msgstr ""
+
+#: src/input/input_dvd.c:311 src/input/input_dvd.c:324
+msgid "input_dvd: Could not read Copyright Structure\n"
+msgstr ""
+
+#: src/input/input_dvd.c:337
+msgid ""
+"input_dvd: Could not read Copyright Structure.\n"
+" Assuming disk is not encrypted.\n"
+msgstr ""
+
+#: src/input/input_dvd.c:346
+msgid ""
+"\n"
+"input_dvd: Sorry, xine doesn't play encrypted DVDs. The legal status of CSS\n"
+" decryption is unclear and we will not provide such code.\n"
+"\n"
+msgstr ""
+"\n"
+"input_dvd: Désolé, xine ne peux pas jouer des DVDs encryptés. Le status légal du\n"
+" decryptage CSS n'est pas clair et nous ne fournirons pas un tel "
+"code.\n"
+"\n"
+
+#: src/input/input_dvd.c:354
+#, c-format
+msgid "input_dvd: cannot open file >%s<\n"
+msgstr ""
+
+#: src/input/input_dvd.c:399
+#, c-format
+msgid "input_dvd: Unable to find >%s< on dvd.\n"
+msgstr ""
+
+#: src/input/input_dvd.c:434
+#, c-format
+msgid "input_dvd: error read: %Ld bytes is not a sector!\n"
+msgstr ""
+
+#: src/input/input_dvd.c:451
+#, c-format
+msgid "input_dvd: read error in input_dvd plugin (%s)\n"
+msgstr ""
+
+#: src/input/input_dvd.c:455
+#, c-format
+msgid "input_dvd: short read in input_dvd (%d != %d)\n"
+msgstr ""
+
+#: src/input/input_dvd.c:474
+#, c-format
+msgid "input_dvd: error in input_dvd plugin read: %Ld bytes is not a sector!\n"
+msgstr ""
+
+#: src/input/input_dvd.c:486
+msgid "input_dvd: read error in input_dvd plugin\n"
+msgstr ""
+
+#: src/input/input_dvd.c:519
+#, c-format
+msgid "input_dvd: seek: %d is an unknown origin\n"
+msgstr ""
+
+#: src/input/input_dvd.c:560
+#, c-format
+msgid "input_dvd: CDROMCLOSETRAY failed: %s\n"
+msgstr ""
+
+#: src/input/input_dvd.c:566 src/input/input_dvd.c:583
+#, c-format
+msgid "input_dvd: CDROMEJECT failed: %s\n"
+msgstr ""
+
+#: src/input/input_dvd.c:572
+#, c-format
+msgid "input_dvd: CDROM_DRIVE_STATUS failed: %s\n"
+msgstr ""
+
+#: src/input/input_dvd.c:588
+#, c-format
+msgid "ioctl(cdromallow): %s"
+msgstr ""
+
+#: src/input/input_dvd.c:591
+#, c-format
+msgid "ioctl(cdromeject): %s"
+msgstr ""
+
+#: src/input/input_dvd.c:618
+msgid "dvd device input plugin as shipped with xine"
+msgstr "Plugin d'entrée pour lecteur de DVD fournis avec xine"
+
+#: src/input/input_dvd.c:798
+#, c-format
+msgid ""
+"dvd input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/input/input_file.c:209
+#, c-format
+msgid "lstat failed for %s{%s}\n"
+msgstr ""
+
+#: src/input/input_file.c:292
+#, c-format
+msgid "input_file: trying to open subtitle file '%s'\n"
+msgstr ""
+
+#: src/input/input_file.c:350
+#, c-format
+msgid "input_file: read error (%s)\n"
+msgstr ""
+
+#: src/input/input_file.c:506 src/input/input_file.c:545
+#: src/input/input_file.c:581
+#, c-format
+msgid "%s(%d): readlink() failed: %s\n"
+msgstr ""
+
+#: src/input/input_file.c:769 src/input/input_vcd.c:963
+#, fuzzy
+msgid "plain file input plugin as shipped with xine"
+msgstr "Plugin d'entrée pour lecteur de DVD fournis avec xine"
+
+#: src/input/input_file.c:787
+#, c-format
+msgid "input_file: get optional data, type %08x, sub %p\n"
+msgstr ""
+
+#: src/input/input_file.c:817
+#, c-format
+msgid ""
+"file input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/input/input_vcd.c:157 src/input/input_vcd.c:194
+msgid "input_vcd : error in ioctl CDROMREADTOCHDR\n"
+msgstr ""
+
+#: src/input/input_vcd.c:167
+#, c-format
+msgid "input_vcd: error in ioctl CDROMREADTOCENTRY for track %d\n"
+msgstr ""
+
+#: src/input/input_vcd.c:178
+msgid "input_vcd: error in ioctl CDROMREADTOCENTRY for lead-out\n"
+msgstr ""
+
+#: src/input/input_vcd.c:209
+msgid "input_vcd: error in ioctl CDROMREADTOCENTRY\n"
+msgstr ""
+
+#: src/input/input_vcd.c:327
+#, c-format
+msgid "scsi command failed with status %d\n"
+msgstr ""
+
+#: src/input/input_vcd.c:368
+msgid "input_vcd: malformed MRL. Use vcd://<track #>\n"
+msgstr ""
+
+#: src/input/input_vcd.c:375
+#, c-format
+msgid "input_vcd: invalid track %d (valid range: 0 .. %d)\n"
+msgstr ""
+
+#: src/input/input_vcd.c:390
+#, c-format
+msgid "input_vcd: error in CDRIOCSETBLOCKSIZE %d\n"
+msgstr ""
+
+#: src/input/input_vcd.c:440 src/input/input_vcd.c:577
+msgid "input_vcd: error in CDROMREADRAW\n"
+msgstr ""
+
+#: src/input/input_vcd.c:475 src/input/input_vcd.c:617
+#, c-format
+msgid "input_vcd: seek error %d\n"
+msgstr ""
+
+#: src/input/input_vcd.c:479 src/input/input_vcd.c:621
+#, c-format
+msgid "input_vcd: read error %d\n"
+msgstr ""
+
+#: src/input/input_vcd.c:516 src/input/input_vcd.c:663
+msgid "input_vcd: read data failed\n"
+msgstr ""
+
+#: src/input/input_vcd.c:734 src/input/input_vcd.c:785
+msgid "input_vcd: SEEK_CUR not implemented for offset != 0\n"
+msgstr ""
+
+#: src/input/input_vcd.c:752 src/input/input_vcd.c:793
+#, c-format
+msgid "input_vcd: error seek to origin %d not implemented!\n"
+msgstr ""
+
+#: src/input/input_vcd.c:886
+#, c-format
+msgid "input_vcd: CDROMCLOSETRAY failed: %s\n"
+msgstr ""
+
+#: src/input/input_vcd.c:891 src/input/input_vcd.c:933
+#, c-format
+msgid "input_vcd: CDROMEJECT failed: %s\n"
+msgstr ""
+
+#: src/input/input_vcd.c:897
+#, c-format
+msgid "input_vcd: CDROM_DRIVE_STATUS failed: %s\n"
+msgstr ""
+
+#: src/input/input_vcd.c:991
+#, c-format
+msgid "unable to open %s: %s.\n"
+msgstr ""
+
+#: src/input/input_vcd.c:999 src/input/input_vcd.c:1079
+msgid "vcd_read_toc failed\n"
+msgstr ""
+
+#: src/input/input_vcd.c:1071
+#, c-format
+msgid "unable to open %s: %s."
+msgstr ""
+
+#: src/input/input_vcd.c:1135
+#, c-format
+msgid ""
+"vcd input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/input/input_http.c:109
+msgid "input_http: failed to open socket\n"
+msgstr ""
+
+#: src/input/input_http.c:118
+msgid "input_http: cannot connect to host\n"
+msgstr ""
+
+#: src/input/input_http.c:133
+#, c-format
+msgid "input_http: unable to resolve >%s<\n"
+msgstr ""
+
+#: src/input/input_http.c:145
+#, c-format
+msgid "http: unable to connect to >%s<\n"
+msgstr ""
+
+#: src/input/input_http.c:342
+#, c-format
+msgid "input_http: opening >/%s< on host >%s<"
+msgstr ""
+
+#: src/input/input_http.c:345
+#, c-format
+msgid "%s via proxy >%s<"
+msgstr ""
+
+#: src/input/input_http.c:417 src/input/input_http.c:506
+msgid "input_http: EAGAIN\n"
+msgstr ""
+
+#: src/input/input_http.c:420 src/input/input_http.c:509
+msgid "input_http: read error\n"
+msgstr ""
+
+#: src/input/input_http.c:437
+#, c-format
+msgid "input_http: answer: >%s<\n"
+msgstr ""
+
+#: src/input/input_http.c:447
+msgid "input_http: invalid http answer\n"
+msgstr ""
+
+#: src/input/input_http.c:452
+#, c-format
+msgid "input_http: 3xx redirection not implemented: >%d %s<\n"
+msgstr ""
+
+#: src/input/input_http.c:457
+#, c-format
+msgid "input_http: http status not 2xx: >%d %s<\n"
+msgstr ""
+
+#: src/input/input_http.c:466
+#, c-format
+msgid "input_http: content length = %Ld bytes\n"
+msgstr ""
+
+#: src/input/input_http.c:473
+msgid "input_http: Location redirection not implemented\n"
+msgstr ""
+
+#: src/input/input_http.c:486
+msgid "input_http: end of headers\n"
+msgstr ""
+
+#: src/input/input_http.c:547
+#, c-format
+msgid "input_http: read error (%s)\n"
+msgstr ""
+
+#: src/input/input_http.c:604
+msgid "http network stream input plugin"
+msgstr ""
+
+#: src/input/input_http.c:630
+#, c-format
+msgid ""
+"http input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/input/input_cda.c:461 src/input/input_cda.c:519
+#, c-format
+msgid "input_cda: fopen(%s) failed: %s\n"
+msgstr ""
+
+#: src/input/input_cda.c:609
+#, c-format
+msgid "input_cda: server '%s:%d' successfuly connected.\n"
+msgstr ""
+
+#: src/input/input_cda.c:614
+#, c-format
+msgid "input_cda: opening server '%s:%d' failed: %s\n"
+msgstr ""
+
+#: src/input/input_cda.c:783
+#, c-format
+msgid "input_cda: ioctl(CDROM_MEDIA_CHANGED) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:850
+#, c-format
+msgid "input_cda: ioctl(CDROMSUBCHNL) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:985
+#, c-format
+msgid "input_cda: ioctl(CDIOCSTART) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:991
+#, c-format
+msgid "input_cda: ioctl(CDROMSTART) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:997
+#, c-format
+msgid "input_cda: ioctl(CDIOCPLAYMSF) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1003
+#, c-format
+msgid "input_cda: ioctl(CDROMPLAYMSF) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1024
+#, c-format
+msgid "input_cda: No rights to open %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1027
+#, c-format
+msgid "input_cda: open(%s) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1121
+#, c-format
+msgid "input_cda: ioctl(CDROMCLOSETRAY) failed: %s\n"
+msgstr ""
+
+#: src/input/input_cda.c:1126 src/input/input_cda.c:1142
+#: src/input/input_cda.c:1147
+#, c-format
+msgid "input_cda: ioctl(CDROMEJECT) failed: %s\n"
+msgstr ""
+
+#: src/input/input_cda.c:1132
+#, c-format
+msgid "input_cda: ioctl(CDROM_DRIVE_STATUS) failed: %s\n"
+msgstr ""
+
+#: src/input/input_cda.c:1138
+#, c-format
+msgid "input_cda: ioctl(CDROMALLOW) failed: %s\n"
+msgstr ""
+
+#: src/input/input_cda.c:1178
+#, c-format
+msgid "input_cda: ioctl(CDIOREADTOCHEADER) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1186
+#, c-format
+msgid "input_cda: ioctl(CDROMREADTOCHDR) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1223
+#, c-format
+msgid "input_cda: ioctl(CDIOREADTOCENTRYS) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1246
+#, c-format
+msgid "input_cda: ioctl(CDROMREADTOCENTRY) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1428
+msgid "input_cda: malformed MRL. Use cda://<track #>\n"
+msgstr ""
+
+#: src/input/input_cda.c:1434
+#, c-format
+msgid "input_cda: invalid track %d (valid range: 1 .. %d)\n"
+msgstr ""
+
+#: src/input/input_cda.c:1517
+#, c-format
+msgid "input_cda: error seek to origin %d not implemented!\n"
+msgstr ""
+
+#: src/input/input_cda.c:1630
+#, fuzzy
+msgid "cd audio plugin as shipped with xine"
+msgstr "Plugin d'entrée pour lecteur de DVD fournis avec xine"
+
+#: src/input/input_cda.c:1805
+#, c-format
+msgid ""
+"cda input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:256
+msgid "metronom: video stream start...\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:259
+msgid "metronom: video stream start ignored\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:285
+msgid "metronom: waiting for audio to start...\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:301
+msgid "metronom: video stream end\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:304
+msgid "metronom: video stream end ignored\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:314
+msgid "metronom: waiting for audio to end...\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:328
+msgid "metronom: audio stream start...\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:331
+msgid "metronom: audio stream start ignored\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:355
+msgid "metronom: waiting for video to start...\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:363
+msgid "metronom: audio stream start...done\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:372
+msgid "metronom: audio stream end\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:374
+msgid "metronom: audio stream end ignored\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:383
+msgid "metronom: waiting for video to end...\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:466
+#, c-format
+msgid "metronom: video discontinuity #%d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:473
+#, c-format
+msgid "metronom: waiting for audio discontinuity #%d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:481
+#, c-format
+msgid "metronom: video vpts adjusted to %d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:536
+#, c-format
+msgid ""
+"metronom: video pts discontinuity/start, pts is %d, wrap_offset is %d, vpts "
+"is %d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:551 src/xine-engine/metronom.c:741
+#, c-format
+msgid "metronom: forcing video_wrap (%d) and audio wrap (%d)"
+msgstr ""
+
+#: src/xine-engine/metronom.c:559
+#, c-format
+msgid " to %d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:623
+#, c-format
+msgid "metronom: delta too big, setting vpts to %d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:666
+#, c-format
+msgid "metronom: audio discontinuity #%d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:672
+#, c-format
+msgid "metronom: waiting for video_discontinuity #%d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:681
+#, c-format
+msgid "metronom: audio vpts adjusted to %d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:724
+#, c-format
+msgid ""
+"metronom: audio pts discontinuity/start, pts is %d, wrap_offset is %d, vpts "
+"is %d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:749
+#, c-format
+msgid "to %d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:799
+#, c-format
+msgid "metronom: av_offset=%d pts\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:819
+msgid "metronom: panic - no scr provider found!\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:904
+#, c-format
+msgid "metronom: cannot create sync thread (%s)\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:209
+msgid "video_out: sigprocmask failed.\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:271
+#, c-format
+msgid ""
+"video_out : throwing away image with pts %d because it's too old (diff : %d "
+"> %d).\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:410
+msgid "video_out : overwriting frame backup\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:514
+#, c-format
+msgid "video_out : can't create thread (%s)\n"
+msgstr ""
+
+#. FIXME: how does this happen ?
+#: src/xine-engine/video_out.c:516
+msgid "video_out : sorry, this should not happen. please restart xine.\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:520
+msgid "video_out : thread created\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:522
+msgid "video_out : vo_open : warning! video thread already running\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:711
+msgid "video_out : ALERT! frame is already locked for displaying\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:724
+#, c-format
+msgid "vo_frame_draw: rejected, %d frames to skip\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:772
+#, c-format
+msgid "%d frames delivered, %d frames skipped, %d frames discarded\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:107
+#, c-format
+msgid "xine_notify_stream_finished: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:149
+msgid "xine_stop\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:154
+msgid "xine_stop ignored\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:167
+msgid "xine_stop: stopping demuxer\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:184
+msgid "xine_stop: done\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:215
+#, c-format
+msgid "%s(%d) wrong first stage = %d !!\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:278
+#, c-format
+msgid "xine_play: xine open %s, start pos = %d, start time = %d (sec)\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:323
+msgid "xine: cannot find input plugin for this MRL\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:331
+#, c-format
+msgid "xine: using input plugin >%s< for this MRL (%s).\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:339
+#, c-format
+msgid "xine: couldn't find demuxer for >%s<\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:345
+#, c-format
+msgid "xine: using demuxer plugin >%s< for this MRL.\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:365
+msgid "xine_play: demuxer failed to start\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:414
+msgid "xine_exit: shutdown audio\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:418
+msgid "xine_exit: shutdown video\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:424
+msgid "xine_exit: bye!\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:447
+msgid "xine_init entered\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:520
+msgid "xine_init returning\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:561
+msgid "xine: xine_get_current_position: no input source\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:682
+#, c-format
+msgid "xine: set_speed %d\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:842
+msgid "messages"
+msgstr "messages"
+
+#. XINE_LOG_MSG
+#: src/xine-engine/xine.c:843
+#, fuzzy
+msgid "inputs"
+msgstr "entrée"
+
+#. XINE_LOG_INPUT
+#: src/xine-engine/xine.c:844
+msgid "demuxers"
+msgstr ""
+
+#. XINE_LOG_DEMUX
+#: src/xine-engine/xine.c:845
+msgid "codecs"
+msgstr "codec"
+
+#. XINE_LOG_CODEC
+#: src/xine-engine/xine.c:846
+msgid "video"
+msgstr ""
+
+#. XINE_LOG_VIDEO
+#: src/xine-engine/xine.c:847
+msgid "metronom"
+msgstr ""
+
+#. XINE_LOG_METRONOM
+#: src/xine-engine/xine.c:848
+msgid "plugin"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:121 src/xine-engine/load_plugins.c:469
+#, c-format
+msgid "%s(%s@%d): parameter should be non null, exiting\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:156
+#, c-format
+msgid ""
+"load_plugins: cannot open demux plugin %s:\n"
+"%s\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:170
+#, c-format
+msgid "load_plugins: demux plugin found : %s\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:178
+msgid "load_plugins: too many demux plugins installed, exiting.\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:314
+#, c-format
+msgid ""
+"load_plugins: cannot open input plugin %s:\n"
+"%s\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:326
+#, c-format
+msgid "load_plugins: input plugin found : %s\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:333
+#, c-format
+msgid ""
+"load_plugins: %s is no valid input plugin (lacks init_input_plugin() "
+"function)\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:337
+#, c-format
+msgid "%s(%d): too many input plugins installed, exiting.\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:350
+#, c-format
+msgid ""
+"load_plugins: no input plugins found in %s! - Did you install xine "
+"correctly??\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:529
+#, c-format
+msgid ""
+"load_plugins: failed to load plugin %s:\n"
+"%s\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:557
+#, c-format
+msgid "spu decoder plugin found : %s\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:585
+#, c-format
+msgid "video decoder plugin found : %s\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:609
+#, c-format
+msgid "audio decoder plugin found : %s\n"
+msgstr ""
diff --git a/po/xine-lib.pot b/po/xine-lib.pot
new file mode 100644
index 000000000..b41c93aa1
--- /dev/null
+++ b/po/xine-lib.pot
@@ -0,0 +1,1524 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2001-12-27 15:07+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/demuxers/demux_ts.c:237
+msgid "demux_ts: demux error! PAT without payload unit start\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:246
+msgid "demux_ts: demux error! PAT with invalid pointer\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:288
+msgid "demux_ts: demux error! PAT with invalid section length\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:292
+#, c-format
+msgid "demux_ts: demux error! PAT with invalid section %02x of %02x\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:302
+#, c-format
+msgid ""
+"demux_ts: demux error! PAT with invalid CRC32: packet_crc32=0x%08x "
+"calc_crc32=0x%08x\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:355
+#, c-format
+msgid "demux_ts: error %02x %02x %02x (should be 0x000001) \n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:491
+#, c-format
+msgid "fifo unavailable (%d)\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:503
+#, c-format
+msgid "demux_ts: dropped input packet cc = %d expected = %d\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:515
+msgid "PUS set but no PES header (corrupt stream?)\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:521
+msgid "demux_ts: broken pes encountered\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:624
+msgid "demux error! PMT without payload unit start\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:633
+msgid "demux error! PMT with invalid pointer\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:675
+msgid "demux error! PMT with invalid section length\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:679
+#, c-format
+msgid "demux error! PMT with invalid section %02x of %02x\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:689
+#, c-format
+msgid ""
+"demux_ts: demux error! PMT with invalid CRC32: packet_crc32=0x%08x "
+"calc_crc32=0x%08x\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:701
+msgid "demux error! PMT with inconsistent progInfo length\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:717
+msgid "demux error! PMT with inconsistent streamInfo length\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:822
+msgid "RE-Sync failed\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:970
+#, c-format
+msgid "demux error! invalid ts sync byte %02x\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:974
+msgid "demux error! transport error\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:998
+#, c-format
+msgid "demux_ts: demux error! invalid payload size %d\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:1141
+#, c-format
+msgid "demux %u ts_open!\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:1232
+#, c-format
+msgid "demux_ts: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:1243
+msgid "demux_ts: stop...\n"
+msgstr ""
+
+#: src/demuxers/demux_ts.c:1290
+#, c-format
+msgid ""
+"demux_ts: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:509
+msgid "demux_avi: reconstructing index"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:540
+msgid "done\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:846
+msgid "demux_avi: demux loop finished.\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:860
+msgid "demux_avi: stop...ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:918
+#, c-format
+msgid "demux_avi: video format = %s, audio format = 0x%lx\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:925
+#, c-format
+msgid "demux_avi: unknown audio type 0x%lx\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:930
+#, c-format
+msgid "demux_avi: audio type %s (wFormatTag 0x%x)\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:948 src/demuxers/demux_avi.c:965
+msgid "demux_avi: video seek to start failed\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:982
+msgid "demux_avi: audio seek to start failed\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:1013
+#, c-format
+msgid "demux_avi: unknown avi format %.4s\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:1020
+#, c-format
+msgid "demux_avi: video codec >%s<\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:1057
+msgid "demux_avi: text subtitle file available\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:1063
+#, c-format
+msgid "demux_avi: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:1095
+#, c-format
+msgid "demux_avi: %ld frames\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:1101 src/demuxers/demux_avi.c:1138
+#, c-format
+msgid "demux_avi: AVI_init failed (AVI_errno: %d)\n"
+msgstr ""
+
+#: src/demuxers/demux_avi.c:1183
+#, c-format
+msgid ""
+"demux_avi: this plugin doesn't support plugin API version %d.\n"
+"demux_avi: this means there's a version mismatch between xine and this "
+"demux_avi: demuxer plugin.\n"
+"Installing current demuxer plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_elem.c:250
+#, c-format
+msgid "demux_elem: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_elem.c:363
+#, c-format
+msgid ""
+"demux_elem: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg.c:130 src/demuxers/demux_pes.c:126
+#, c-format
+msgid "How how - something wrong in wonderland demux:read_bytes (%d)\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg.c:667 src/demuxers/demux_pes.c:349
+#, c-format
+msgid "demux loop finished (status: %d, buf:%x)\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg.c:681
+msgid "demux_mpeg: stop...\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg.c:784
+#, c-format
+msgid "demux_mpeg: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg.c:873
+msgid "You should specify mpeg(mpeg1/mpeg2) stream type.\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg.c:938 src/demuxers/demux_mpgaudio.c:466
+#, c-format
+msgid ""
+"demux_mpeg: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:116
+msgid "demux_mpeg_block: read_block failed\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:130
+#, c-format
+msgid "demux_mpeg_block: checking if we can branch to %s\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:135
+msgid "demux_mpeg_block: branching\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:265
+#, c-format
+msgid "demux_mpeg_block: error! %02x %02x %02x (should be 0x000001) \n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:271
+msgid ""
+"demux_mpeg_block: too many errors, stopping playback. Maybe this stream is "
+"scrambled?\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:366
+#, c-format
+msgid ""
+"demux_mpeg_block: warning: pes header indicates that this stream may be "
+"encrypted (encryption mode %d)\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:480
+#, c-format
+msgid "illegal lpcm sample format (%d), assume 16-bit samples\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:643
+#, c-format
+msgid "demux_mpeg_block: error %02x %02x %02x (should be 0x000001) \n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:744
+msgid "demux_mpeg_block: stop...ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:863
+#, c-format
+msgid "demux_mpeg_block: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:880
+#, c-format
+msgid "demux_mpeg_block: mrl %s is new, will estimated bitrate\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:884
+#, c-format
+msgid "demux_mpeg_block: mrl %s is known, estimated bitrate: %d\n"
+msgstr ""
+
+#: src/demuxers/demux_mpeg_block.c:1040
+#, c-format
+msgid ""
+"demux_mpeg_block: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_mpgaudio.c:176
+#, c-format
+msgid "mpgaudio: bitrate = %.2fkbps\n"
+msgstr ""
+
+#: src/demuxers/demux_mpgaudio.c:263
+msgid "demux_mpgaudio_block: stop...ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_mpgaudio.c:367
+#, c-format
+msgid "demux_mpgaudio: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_pes.c:363
+msgid "demux_pes: stop...\n"
+msgstr ""
+
+#: src/demuxers/demux_pes.c:459
+#, c-format
+msgid "demux_pes: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_pes.c:590
+#, c-format
+msgid ""
+"demux_pes: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:3199
+msgid "Header not compressed with zlib\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:3220
+msgid "QT cmov: malloc err 0"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:3228
+#, c-format
+msgid "QT cmov: read err tlen %llu\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:3237
+#, c-format
+msgid "QT cmov: malloc err moov_sz %u\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:3251
+#, c-format
+msgid "QT cmov: inflateInit err %d\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:3256
+#, c-format
+msgid "QT cmov inflate: ERR %d\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:3965
+msgid "demux_qt: quicktime_open: error in header\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:4134
+msgid "demux_qt: stop...ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:4195
+#, c-format
+msgid "demux_qt: unknown video codec >%s<\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:4199
+#, c-format
+msgid "demux_qt: video codec >%s<\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:4220
+#, c-format
+msgid "demux_qt: unknown audio codec >%s<\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:4252
+#, c-format
+msgid "demux_qt: video codec %s (%f fps), audio codec %s (%ld Hz, %d bits)\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:4331
+#, c-format
+msgid "demux_qt: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_qt.c:4420
+#, c-format
+msgid ""
+"demux_qt: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_ogg.c:127
+#, c-format
+msgid ""
+"demux_ogg: beginning of stream\n"
+"demux_ogg: serial number %d\n"
+msgstr ""
+
+#: src/demuxers/demux_ogg.c:143
+#, c-format
+msgid "demux_ogg: found a new stream, serialnumber %d\n"
+msgstr ""
+
+#: src/demuxers/demux_ogg.c:159
+#, c-format
+msgid "demux_ogg: unknown streamtype, signature: >%.8s<\n"
+msgstr ""
+
+#: src/demuxers/demux_ogg.c:258
+msgid "demux_ogg: stop...ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_ogg.c:360
+#, c-format
+msgid "demux_ogg: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_ogg.c:434
+#, c-format
+msgid ""
+"demux_ogg: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:238 src/demuxers/demux_asf.c:255
+#: src/demuxers/demux_asf.c:272 src/demuxers/demux_asf.c:287
+msgid "demux_asf: end of data\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:340
+#, c-format
+msgid "demux_asf: unknown audio type 0x%x\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:344
+#, c-format
+msgid "demux_asf: audio format : %s (wFormatTag 0x%x)\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:364
+#, c-format
+msgid "demux_asf: wavex header is %d bytes long\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:391
+#, c-format
+msgid "demux_asf: unknown video format %.4s\n"
+msgstr ""
+
+#.
+#. printf ("demux_asf: video format : %.4s\n", (char*)&bih->biCompression);
+#.
+#: src/demuxers/demux_asf.c:407
+#, c-format
+msgid "demux_asf: video format : %s\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:431
+msgid "demux_asf: file doesn't start with an asf header\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:464
+#, c-format
+msgid "demux_asf: stream length is %d sec, rate is %d bytes/sec\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:515
+#, c-format
+msgid "demux_asf: audio conceal interleave detected (%d x %d x %d)\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:612
+msgid "demux_asf: absolute size ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:809
+msgid "demux_asf: buffer overflow on defrag!\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:840
+msgid "demux_asf: get_packet failed\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:874
+#, c-format
+msgid "demux_asf: unknow segtype %x\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:1053
+msgid "demux_asf: stop...ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:1139
+#, c-format
+msgid "demux_asf: title : %s\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:1140
+#, c-format
+msgid "demux_asf: author : %s\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:1141
+#, c-format
+msgid "demux_asf: copyright : %s\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:1142
+#, c-format
+msgid "demux_asf: comment : %s\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:1170
+#, c-format
+msgid "demux_asf: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_asf.c:1245
+#, c-format
+msgid ""
+"demux_asf: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/demuxers/demux_cda.c:156
+msgid "demux_cda: stop...ignored\n"
+msgstr ""
+
+#: src/demuxers/demux_cda.c:231
+#, c-format
+msgid "demux_cda: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/demuxers/demux_cda.c:307
+#, c-format
+msgid ""
+"demux_cda: plugin doesn't support plugin API version %d.\n"
+" this means there's a version mismatch between xine and "
+"this demuxer plugin.\n"
+"Installing current demux plugins should help.\n"
+msgstr ""
+
+#: src/input/input_net.c:100
+#, c-format
+msgid "socket(): %s\n"
+msgstr ""
+
+#: src/input/input_net.c:106
+#, c-format
+msgid "fcntl(nonblocking): %s\n"
+msgstr ""
+
+#: src/input/input_net.c:117
+#, c-format
+msgid "connect(): %s\n"
+msgstr ""
+
+#. Ermm.. ??
+#: src/input/input_net.c:136
+#, c-format
+msgid "select(): %s\n"
+msgstr ""
+
+#: src/input/input_net.c:152 src/input/input_rtp.c:205
+#, c-format
+msgid "unable to resolve '%s'.\n"
+msgstr ""
+
+#: src/input/input_net.c:165 src/input/input_rtp.c:218
+#, c-format
+msgid "unable to connect to '%s'.\n"
+msgstr ""
+
+#: src/input/input_net.c:286
+msgid "net input plugin as shipped with xine"
+msgstr ""
+
+#: src/input/input_net.c:324
+#, c-format
+msgid ""
+"net input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/input/input_rtp.c:157
+#, c-format
+msgid "socket(): %s.\n"
+msgstr ""
+
+#: src/input/input_rtp.c:167
+#, c-format
+msgid "bind(): %s.\n"
+msgstr ""
+
+#: src/input/input_rtp.c:185
+#, c-format
+msgid "setsockopt(IP_ADD_MEMBERSHIP) failed (multicast kernel?): %s.\n"
+msgstr ""
+
+#: src/input/input_rtp.c:241
+msgid "OUCH - ran out of buffers\n"
+msgstr ""
+
+#: src/input/input_rtp.c:271
+#, c-format
+msgid "OUCH - dropped input packet %d %d\n"
+msgstr ""
+
+#: src/input/input_rtp.c:311
+#, c-format
+msgid "Opening >%s<\n"
+msgstr ""
+
+#: src/input/input_rtp.c:339
+#, c-format
+msgid "input_rtp: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/input/input_rtp.c:450
+msgid "rtp input plugin as shipped with xine"
+msgstr ""
+
+#: src/input/input_rtp.c:490
+#, c-format
+msgid ""
+"rtp input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/input/input_rtp.c:506 src/input/input_rtp.c:511
+msgid "unable to allocate input buffer.\n"
+msgstr ""
+
+#: src/input/input_stdin_fifo.c:252
+msgid "stdin/fifo input plugin as shipped with xine"
+msgstr ""
+
+#: src/input/input_stdin_fifo.c:281
+#, c-format
+msgid ""
+"stdin/fifo input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/input/input_dvd.c:145 src/input/input_dvd.c:692
+#: src/input/input_dvd.c:752
+#, c-format
+msgid "input_dvd: unable to open dvd drive (%s): %s\n"
+msgstr ""
+
+#: src/input/input_dvd.c:242
+#, c-format
+msgid "USCSICMD dvd_read_copyright: %s"
+msgstr ""
+
+#: src/input/input_dvd.c:246
+msgid "bad status: READ DVD STRUCTURE (copyright)\n"
+msgstr ""
+
+#: src/input/input_dvd.c:300
+#, c-format
+msgid "input_dvd: cannot open dvd drive >%s<\n"
+msgstr ""
+
+#: src/input/input_dvd.c:311 src/input/input_dvd.c:324
+msgid "input_dvd: Could not read Copyright Structure\n"
+msgstr ""
+
+#: src/input/input_dvd.c:337
+msgid ""
+"input_dvd: Could not read Copyright Structure.\n"
+" Assuming disk is not encrypted.\n"
+msgstr ""
+
+#: src/input/input_dvd.c:346
+msgid ""
+"\n"
+"input_dvd: Sorry, xine doesn't play encrypted DVDs. The legal status of CSS\n"
+" decryption is unclear and we will not provide such code.\n"
+"\n"
+msgstr ""
+
+#: src/input/input_dvd.c:354
+#, c-format
+msgid "input_dvd: cannot open file >%s<\n"
+msgstr ""
+
+#: src/input/input_dvd.c:399
+#, c-format
+msgid "input_dvd: Unable to find >%s< on dvd.\n"
+msgstr ""
+
+#: src/input/input_dvd.c:434
+#, c-format
+msgid "input_dvd: error read: %Ld bytes is not a sector!\n"
+msgstr ""
+
+#: src/input/input_dvd.c:451
+#, c-format
+msgid "input_dvd: read error in input_dvd plugin (%s)\n"
+msgstr ""
+
+#: src/input/input_dvd.c:455
+#, c-format
+msgid "input_dvd: short read in input_dvd (%d != %d)\n"
+msgstr ""
+
+#: src/input/input_dvd.c:474
+#, c-format
+msgid "input_dvd: error in input_dvd plugin read: %Ld bytes is not a sector!\n"
+msgstr ""
+
+#: src/input/input_dvd.c:486
+msgid "input_dvd: read error in input_dvd plugin\n"
+msgstr ""
+
+#: src/input/input_dvd.c:519
+#, c-format
+msgid "input_dvd: seek: %d is an unknown origin\n"
+msgstr ""
+
+#: src/input/input_dvd.c:560
+#, c-format
+msgid "input_dvd: CDROMCLOSETRAY failed: %s\n"
+msgstr ""
+
+#: src/input/input_dvd.c:566 src/input/input_dvd.c:583
+#, c-format
+msgid "input_dvd: CDROMEJECT failed: %s\n"
+msgstr ""
+
+#: src/input/input_dvd.c:572
+#, c-format
+msgid "input_dvd: CDROM_DRIVE_STATUS failed: %s\n"
+msgstr ""
+
+#: src/input/input_dvd.c:588
+#, c-format
+msgid "ioctl(cdromallow): %s"
+msgstr ""
+
+#: src/input/input_dvd.c:591
+#, c-format
+msgid "ioctl(cdromeject): %s"
+msgstr ""
+
+#: src/input/input_dvd.c:618
+msgid "dvd device input plugin as shipped with xine"
+msgstr ""
+
+#: src/input/input_dvd.c:798
+#, c-format
+msgid ""
+"dvd input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/input/input_file.c:209
+#, c-format
+msgid "lstat failed for %s{%s}\n"
+msgstr ""
+
+#: src/input/input_file.c:292
+#, c-format
+msgid "input_file: trying to open subtitle file '%s'\n"
+msgstr ""
+
+#: src/input/input_file.c:350
+#, c-format
+msgid "input_file: read error (%s)\n"
+msgstr ""
+
+#: src/input/input_file.c:506 src/input/input_file.c:545
+#: src/input/input_file.c:581
+#, c-format
+msgid "%s(%d): readlink() failed: %s\n"
+msgstr ""
+
+#: src/input/input_file.c:769 src/input/input_vcd.c:963
+msgid "plain file input plugin as shipped with xine"
+msgstr ""
+
+#: src/input/input_file.c:787
+#, c-format
+msgid "input_file: get optional data, type %08x, sub %p\n"
+msgstr ""
+
+#: src/input/input_file.c:817
+#, c-format
+msgid ""
+"file input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/input/input_vcd.c:157 src/input/input_vcd.c:194
+msgid "input_vcd : error in ioctl CDROMREADTOCHDR\n"
+msgstr ""
+
+#: src/input/input_vcd.c:167
+#, c-format
+msgid "input_vcd: error in ioctl CDROMREADTOCENTRY for track %d\n"
+msgstr ""
+
+#: src/input/input_vcd.c:178
+msgid "input_vcd: error in ioctl CDROMREADTOCENTRY for lead-out\n"
+msgstr ""
+
+#: src/input/input_vcd.c:209
+msgid "input_vcd: error in ioctl CDROMREADTOCENTRY\n"
+msgstr ""
+
+#: src/input/input_vcd.c:327
+#, c-format
+msgid "scsi command failed with status %d\n"
+msgstr ""
+
+#: src/input/input_vcd.c:368
+msgid "input_vcd: malformed MRL. Use vcd://<track #>\n"
+msgstr ""
+
+#: src/input/input_vcd.c:375
+#, c-format
+msgid "input_vcd: invalid track %d (valid range: 0 .. %d)\n"
+msgstr ""
+
+#: src/input/input_vcd.c:390
+#, c-format
+msgid "input_vcd: error in CDRIOCSETBLOCKSIZE %d\n"
+msgstr ""
+
+#: src/input/input_vcd.c:440 src/input/input_vcd.c:577
+msgid "input_vcd: error in CDROMREADRAW\n"
+msgstr ""
+
+#: src/input/input_vcd.c:475 src/input/input_vcd.c:617
+#, c-format
+msgid "input_vcd: seek error %d\n"
+msgstr ""
+
+#: src/input/input_vcd.c:479 src/input/input_vcd.c:621
+#, c-format
+msgid "input_vcd: read error %d\n"
+msgstr ""
+
+#: src/input/input_vcd.c:516 src/input/input_vcd.c:663
+msgid "input_vcd: read data failed\n"
+msgstr ""
+
+#: src/input/input_vcd.c:734 src/input/input_vcd.c:785
+msgid "input_vcd: SEEK_CUR not implemented for offset != 0\n"
+msgstr ""
+
+#: src/input/input_vcd.c:752 src/input/input_vcd.c:793
+#, c-format
+msgid "input_vcd: error seek to origin %d not implemented!\n"
+msgstr ""
+
+#: src/input/input_vcd.c:886
+#, c-format
+msgid "input_vcd: CDROMCLOSETRAY failed: %s\n"
+msgstr ""
+
+#: src/input/input_vcd.c:891 src/input/input_vcd.c:933
+#, c-format
+msgid "input_vcd: CDROMEJECT failed: %s\n"
+msgstr ""
+
+#: src/input/input_vcd.c:897
+#, c-format
+msgid "input_vcd: CDROM_DRIVE_STATUS failed: %s\n"
+msgstr ""
+
+#: src/input/input_vcd.c:991
+#, c-format
+msgid "unable to open %s: %s.\n"
+msgstr ""
+
+#: src/input/input_vcd.c:999 src/input/input_vcd.c:1079
+msgid "vcd_read_toc failed\n"
+msgstr ""
+
+#: src/input/input_vcd.c:1071
+#, c-format
+msgid "unable to open %s: %s."
+msgstr ""
+
+#: src/input/input_vcd.c:1135
+#, c-format
+msgid ""
+"vcd input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/input/input_http.c:109
+msgid "input_http: failed to open socket\n"
+msgstr ""
+
+#: src/input/input_http.c:118
+msgid "input_http: cannot connect to host\n"
+msgstr ""
+
+#: src/input/input_http.c:133
+#, c-format
+msgid "input_http: unable to resolve >%s<\n"
+msgstr ""
+
+#: src/input/input_http.c:145
+#, c-format
+msgid "http: unable to connect to >%s<\n"
+msgstr ""
+
+#: src/input/input_http.c:342
+#, c-format
+msgid "input_http: opening >/%s< on host >%s<"
+msgstr ""
+
+#: src/input/input_http.c:345
+#, c-format
+msgid "%s via proxy >%s<"
+msgstr ""
+
+#: src/input/input_http.c:417 src/input/input_http.c:506
+msgid "input_http: EAGAIN\n"
+msgstr ""
+
+#: src/input/input_http.c:420 src/input/input_http.c:509
+msgid "input_http: read error\n"
+msgstr ""
+
+#: src/input/input_http.c:437
+#, c-format
+msgid "input_http: answer: >%s<\n"
+msgstr ""
+
+#: src/input/input_http.c:447
+msgid "input_http: invalid http answer\n"
+msgstr ""
+
+#: src/input/input_http.c:452
+#, c-format
+msgid "input_http: 3xx redirection not implemented: >%d %s<\n"
+msgstr ""
+
+#: src/input/input_http.c:457
+#, c-format
+msgid "input_http: http status not 2xx: >%d %s<\n"
+msgstr ""
+
+#: src/input/input_http.c:466
+#, c-format
+msgid "input_http: content length = %Ld bytes\n"
+msgstr ""
+
+#: src/input/input_http.c:473
+msgid "input_http: Location redirection not implemented\n"
+msgstr ""
+
+#: src/input/input_http.c:486
+msgid "input_http: end of headers\n"
+msgstr ""
+
+#: src/input/input_http.c:547
+#, c-format
+msgid "input_http: read error (%s)\n"
+msgstr ""
+
+#: src/input/input_http.c:604
+msgid "http network stream input plugin"
+msgstr ""
+
+#: src/input/input_http.c:630
+#, c-format
+msgid ""
+"http input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/input/input_cda.c:461 src/input/input_cda.c:519
+#, c-format
+msgid "input_cda: fopen(%s) failed: %s\n"
+msgstr ""
+
+#: src/input/input_cda.c:609
+#, c-format
+msgid "input_cda: server '%s:%d' successfuly connected.\n"
+msgstr ""
+
+#: src/input/input_cda.c:614
+#, c-format
+msgid "input_cda: opening server '%s:%d' failed: %s\n"
+msgstr ""
+
+#: src/input/input_cda.c:783
+#, c-format
+msgid "input_cda: ioctl(CDROM_MEDIA_CHANGED) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:850
+#, c-format
+msgid "input_cda: ioctl(CDROMSUBCHNL) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:985
+#, c-format
+msgid "input_cda: ioctl(CDIOCSTART) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:991
+#, c-format
+msgid "input_cda: ioctl(CDROMSTART) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:997
+#, c-format
+msgid "input_cda: ioctl(CDIOCPLAYMSF) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1003
+#, c-format
+msgid "input_cda: ioctl(CDROMPLAYMSF) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1024
+#, c-format
+msgid "input_cda: No rights to open %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1027
+#, c-format
+msgid "input_cda: open(%s) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1121
+#, c-format
+msgid "input_cda: ioctl(CDROMCLOSETRAY) failed: %s\n"
+msgstr ""
+
+#: src/input/input_cda.c:1126 src/input/input_cda.c:1142
+#: src/input/input_cda.c:1147
+#, c-format
+msgid "input_cda: ioctl(CDROMEJECT) failed: %s\n"
+msgstr ""
+
+#: src/input/input_cda.c:1132
+#, c-format
+msgid "input_cda: ioctl(CDROM_DRIVE_STATUS) failed: %s\n"
+msgstr ""
+
+#: src/input/input_cda.c:1138
+#, c-format
+msgid "input_cda: ioctl(CDROMALLOW) failed: %s\n"
+msgstr ""
+
+#: src/input/input_cda.c:1178
+#, c-format
+msgid "input_cda: ioctl(CDIOREADTOCHEADER) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1186
+#, c-format
+msgid "input_cda: ioctl(CDROMREADTOCHDR) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1223
+#, c-format
+msgid "input_cda: ioctl(CDIOREADTOCENTRYS) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1246
+#, c-format
+msgid "input_cda: ioctl(CDROMREADTOCENTRY) failed: %s.\n"
+msgstr ""
+
+#: src/input/input_cda.c:1428
+msgid "input_cda: malformed MRL. Use cda://<track #>\n"
+msgstr ""
+
+#: src/input/input_cda.c:1434
+#, c-format
+msgid "input_cda: invalid track %d (valid range: 1 .. %d)\n"
+msgstr ""
+
+#: src/input/input_cda.c:1517
+#, c-format
+msgid "input_cda: error seek to origin %d not implemented!\n"
+msgstr ""
+
+#: src/input/input_cda.c:1630
+msgid "cd audio plugin as shipped with xine"
+msgstr ""
+
+#: src/input/input_cda.c:1805
+#, c-format
+msgid ""
+"cda input plugin doesn't support plugin API version %d.\n"
+"PLUGIN DISABLED.\n"
+"This means there's a version mismatch between xine and this inputplugin.\n"
+"Installing current input plugins should help.\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:256
+msgid "metronom: video stream start...\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:259
+msgid "metronom: video stream start ignored\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:285
+msgid "metronom: waiting for audio to start...\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:301
+msgid "metronom: video stream end\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:304
+msgid "metronom: video stream end ignored\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:314
+msgid "metronom: waiting for audio to end...\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:328
+msgid "metronom: audio stream start...\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:331
+msgid "metronom: audio stream start ignored\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:355
+msgid "metronom: waiting for video to start...\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:363
+msgid "metronom: audio stream start...done\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:372
+msgid "metronom: audio stream end\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:374
+msgid "metronom: audio stream end ignored\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:383
+msgid "metronom: waiting for video to end...\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:466
+#, c-format
+msgid "metronom: video discontinuity #%d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:473
+#, c-format
+msgid "metronom: waiting for audio discontinuity #%d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:481
+#, c-format
+msgid "metronom: video vpts adjusted to %d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:536
+#, c-format
+msgid ""
+"metronom: video pts discontinuity/start, pts is %d, wrap_offset is %d, vpts "
+"is %d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:551 src/xine-engine/metronom.c:741
+#, c-format
+msgid "metronom: forcing video_wrap (%d) and audio wrap (%d)"
+msgstr ""
+
+#: src/xine-engine/metronom.c:559
+#, c-format
+msgid " to %d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:623
+#, c-format
+msgid "metronom: delta too big, setting vpts to %d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:666
+#, c-format
+msgid "metronom: audio discontinuity #%d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:672
+#, c-format
+msgid "metronom: waiting for video_discontinuity #%d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:681
+#, c-format
+msgid "metronom: audio vpts adjusted to %d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:724
+#, c-format
+msgid ""
+"metronom: audio pts discontinuity/start, pts is %d, wrap_offset is %d, vpts "
+"is %d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:749
+#, c-format
+msgid "to %d\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:799
+#, c-format
+msgid "metronom: av_offset=%d pts\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:819
+msgid "metronom: panic - no scr provider found!\n"
+msgstr ""
+
+#: src/xine-engine/metronom.c:904
+#, c-format
+msgid "metronom: cannot create sync thread (%s)\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:209
+msgid "video_out: sigprocmask failed.\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:271
+#, c-format
+msgid ""
+"video_out : throwing away image with pts %d because it's too old (diff : %d "
+"> %d).\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:410
+msgid "video_out : overwriting frame backup\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:514
+#, c-format
+msgid "video_out : can't create thread (%s)\n"
+msgstr ""
+
+#. FIXME: how does this happen ?
+#: src/xine-engine/video_out.c:516
+msgid "video_out : sorry, this should not happen. please restart xine.\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:520
+msgid "video_out : thread created\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:522
+msgid "video_out : vo_open : warning! video thread already running\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:711
+msgid "video_out : ALERT! frame is already locked for displaying\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:724
+#, c-format
+msgid "vo_frame_draw: rejected, %d frames to skip\n"
+msgstr ""
+
+#: src/xine-engine/video_out.c:772
+#, c-format
+msgid "%d frames delivered, %d frames skipped, %d frames discarded\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:107
+#, c-format
+msgid "xine_notify_stream_finished: can't create new thread (%s)\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:149
+msgid "xine_stop\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:154
+msgid "xine_stop ignored\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:167
+msgid "xine_stop: stopping demuxer\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:184
+msgid "xine_stop: done\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:215
+#, c-format
+msgid "%s(%d) wrong first stage = %d !!\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:278
+#, c-format
+msgid "xine_play: xine open %s, start pos = %d, start time = %d (sec)\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:323
+msgid "xine: cannot find input plugin for this MRL\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:331
+#, c-format
+msgid "xine: using input plugin >%s< for this MRL (%s).\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:339
+#, c-format
+msgid "xine: couldn't find demuxer for >%s<\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:345
+#, c-format
+msgid "xine: using demuxer plugin >%s< for this MRL.\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:365
+msgid "xine_play: demuxer failed to start\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:414
+msgid "xine_exit: shutdown audio\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:418
+msgid "xine_exit: shutdown video\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:424
+msgid "xine_exit: bye!\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:447
+msgid "xine_init entered\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:520
+msgid "xine_init returning\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:561
+msgid "xine: xine_get_current_position: no input source\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:682
+#, c-format
+msgid "xine: set_speed %d\n"
+msgstr ""
+
+#: src/xine-engine/xine.c:842
+msgid "messages"
+msgstr ""
+
+#. XINE_LOG_MSG
+#: src/xine-engine/xine.c:843
+msgid "inputs"
+msgstr ""
+
+#. XINE_LOG_INPUT
+#: src/xine-engine/xine.c:844
+msgid "demuxers"
+msgstr ""
+
+#. XINE_LOG_DEMUX
+#: src/xine-engine/xine.c:845
+msgid "codecs"
+msgstr ""
+
+#. XINE_LOG_CODEC
+#: src/xine-engine/xine.c:846
+msgid "video"
+msgstr ""
+
+#. XINE_LOG_VIDEO
+#: src/xine-engine/xine.c:847
+msgid "metronom"
+msgstr ""
+
+#. XINE_LOG_METRONOM
+#: src/xine-engine/xine.c:848
+msgid "plugin"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:121 src/xine-engine/load_plugins.c:469
+#, c-format
+msgid "%s(%s@%d): parameter should be non null, exiting\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:156
+#, c-format
+msgid ""
+"load_plugins: cannot open demux plugin %s:\n"
+"%s\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:170
+#, c-format
+msgid "load_plugins: demux plugin found : %s\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:178
+msgid "load_plugins: too many demux plugins installed, exiting.\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:314
+#, c-format
+msgid ""
+"load_plugins: cannot open input plugin %s:\n"
+"%s\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:326
+#, c-format
+msgid "load_plugins: input plugin found : %s\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:333
+#, c-format
+msgid ""
+"load_plugins: %s is no valid input plugin (lacks init_input_plugin() "
+"function)\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:337
+#, c-format
+msgid "%s(%d): too many input plugins installed, exiting.\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:350
+#, c-format
+msgid ""
+"load_plugins: no input plugins found in %s! - Did you install xine "
+"correctly??\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:529
+#, c-format
+msgid ""
+"load_plugins: failed to load plugin %s:\n"
+"%s\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:557
+#, c-format
+msgid "spu decoder plugin found : %s\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:585
+#, c-format
+msgid "video decoder plugin found : %s\n"
+msgstr ""
+
+#: src/xine-engine/load_plugins.c:609
+#, c-format
+msgid "audio decoder plugin found : %s\n"
+msgstr ""
diff --git a/src/demuxers/demux_asf.c b/src/demuxers/demux_asf.c
index 29d3ec0f5..e4e7cca48 100644
--- a/src/demuxers/demux_asf.c
+++ b/src/demuxers/demux_asf.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: demux_asf.c,v 1.16 2001/11/30 00:53:51 f1rmb Exp $
+ * $Id: demux_asf.c,v 1.17 2001/12/27 14:30:29 f1rmb Exp $
*
* demultiplexer for asf streams
*
@@ -58,6 +58,26 @@
#define VALID_ENDS "asf,wmv"
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
typedef struct {
int num;
int seq;
@@ -77,6 +97,8 @@ typedef struct {
typedef struct demux_asf_s {
demux_plugin_t demux_plugin;
+ xine_t *xine;
+
config_values_t *config;
fifo_buffer_t *audio_fifo;
@@ -213,7 +235,7 @@ static uint8_t get_byte (demux_asf_t *this) {
/* printf ("%02x ", buf); */
if (i != 1) {
- printf ("demux_asf: end of data\n");
+ LOG_MSG(this->xine, _("demux_asf: end of data\n"));
this->status = DEMUX_FINISHED;
}
@@ -230,7 +252,7 @@ static uint16_t get_le16 (demux_asf_t *this) {
/* printf (" [%02x %02x] ", buf[0], buf[1]); */
if (i != 2) {
- printf ("demux_asf: end of data\n");
+ LOG_MSG(this->xine, _("demux_asf: end of data\n"));
this->status = DEMUX_FINISHED;
}
@@ -247,7 +269,7 @@ static uint32_t get_le32 (demux_asf_t *this) {
/* printf ("%02x %02x %02x %02x ", buf[0], buf[1], buf[2], buf[3]); */
if (i != 4) {
- printf ("demux_asf: end of data\n");
+ LOG_MSG(this->xine, _("demux_asf: end of data\n"));
this->status = DEMUX_FINISHED;
}
@@ -262,7 +284,7 @@ static uint64_t get_le64 (demux_asf_t *this) {
i = this->input->read (this->input, buf, 8);
if (i != 8) {
- printf ("demux_asf: end of data\n");
+ LOG_MSG(this->xine, _("demux_asf: end of data\n"));
this->status = DEMUX_FINISHED;
}
@@ -315,11 +337,11 @@ static void asf_send_audio_header (demux_asf_t *this, int stream_id) {
formattag_to_buf_audio ( wavex->wFormatTag );
if ( !this->streams[this->num_streams].buf_type ) {
- printf ("demux_asf: unknown audio type 0x%x\n", wavex->wFormatTag);
+ LOG_MSG(this->xine, _("demux_asf: unknown audio type 0x%x\n"), wavex->wFormatTag);
this->streams[this->num_streams].buf_type = BUF_CONTROL_NOP;
}
else
- printf ("demux_asf: audio format : %s (wFormatTag 0x%x)\n",
+ LOG_MSG(this->xine, _("demux_asf: audio format : %s (wFormatTag 0x%x)\n"),
buf_audio_name(this->streams[this->num_streams].buf_type),
wavex->wFormatTag);
@@ -339,7 +361,7 @@ static void asf_send_audio_header (demux_asf_t *this, int stream_id) {
buf->content = buf->mem;
memcpy (buf->content, this->wavex, this->wavex_size);
- printf ("demux_asf: wavex header is %d bytes long\n", this->wavex_size);
+ LOG_MSG(this->xine, _("demux_asf: wavex header is %d bytes long\n"), this->wavex_size);
buf->size = this->wavex_size;
buf->type = this->streams[this->num_streams].buf_type;
@@ -366,7 +388,7 @@ static void asf_send_video_header (demux_asf_t *this, int stream_id) {
fourcc_to_buf_video((void*)&bih->biCompression);
if( !this->streams[this->num_streams].buf_type ) {
- printf ("demux_asf: unknown video format %.4s\n",
+ LOG_MSG(this->xine, _("demux_asf: unknown video format %.4s\n"),
(char*)&bih->biCompression);
this->status = DEMUX_FINISHED;
@@ -382,8 +404,8 @@ static void asf_send_video_header (demux_asf_t *this, int stream_id) {
/*
printf ("demux_asf: video format : %.4s\n", (char*)&bih->biCompression);
*/
- printf ("demux_asf: video format : %s\n",
- buf_video_name(this->streams[this->num_streams].buf_type));
+ LOG_MSG(this->xine, _("demux_asf: video format : %s\n"),
+ buf_video_name(this->streams[this->num_streams].buf_type));
buf = this->video_fifo->buffer_pool_alloc (this->video_fifo);
buf->content = buf->mem;
@@ -406,7 +428,7 @@ static int asf_read_header (demux_asf_t *this) {
get_guid(this, &g);
if (memcmp(&g, &asf_header, sizeof(GUID))) {
- printf ("demux_asf: file doesn't start with an asf header\n");
+ LOG_MSG(this->xine, _("demux_asf: file doesn't start with an asf header\n"));
return 0;
}
get_le64(this);
@@ -439,7 +461,7 @@ static int asf_read_header (demux_asf_t *this) {
} else
this->rate = 0;
- printf ("demux_asf: stream length is %d sec, rate is %d bytes/sec\n",
+ LOG_MSG(this->xine, _("demux_asf: stream length is %d sec, rate is %d bytes/sec\n"),
this->length, this->rate);
start_time = get_le32(this); /* start timestamp in 1/1000 s*/
@@ -490,8 +512,8 @@ static int asf_read_header (demux_asf_t *this) {
this->reorder_w=(buffer[2]<<8)|buffer[1];
this->reorder_b=(buffer[4]<<8)|buffer[3];
this->reorder_w/=this->reorder_b;
- printf("demux_asf: audio conceal interleave detected (%d x %d x %d)\n",
- this->reorder_w, this->reorder_h, this->reorder_b );
+ LOG_MSG(this->xine, _("demux_asf: audio conceal interleave detected (%d x %d x %d)\n"),
+ this->reorder_w, this->reorder_h, this->reorder_b );
} else {
this->reorder_b=this->reorder_h=this->reorder_w=1;
}
@@ -587,7 +609,7 @@ static int asf_get_packet(demux_asf_t *this) {
if (this->packet_flags & 0x40) {
get_le16(this);
- printf("demux_asf: absolute size ignored\n");
+ LOG_MSG(this->xine, _("demux_asf: absolute size ignored\n"));
hdr_size += 2;
}
@@ -618,12 +640,12 @@ static int asf_get_packet(demux_asf_t *this) {
return 1;
}
-static void hexdump (unsigned char *data, int len) {
+static void hexdump (unsigned char *data, int len, xine_t *xine) {
int i;
for (i=0; i<len; i++)
- printf ("%02x ", data[i]);
- printf ("\n");
+ LOG_MSG(xine, "%02x ", data[i]);
+ LOG_MSG(xine, "\n");
}
@@ -783,8 +805,9 @@ static void asf_send_buffer_defrag (demux_asf_t *this, asf_stream_t *stream,
stream->timestamp = timestamp;
}
- if( stream->frag_offset + frag_len > DEFRAG_BUFSIZE )
- printf("demux_asf: buffer overflow on defrag!\n");
+ if( stream->frag_offset + frag_len > DEFRAG_BUFSIZE ) {
+ LOG_MSG(this->xine, _("demux_asf: buffer overflow on defrag!\n"));
+ }
else {
this->input->read (this->input, &stream->buffer[stream->frag_offset], frag_len);
stream->frag_offset += frag_len;
@@ -792,7 +815,7 @@ static void asf_send_buffer_defrag (demux_asf_t *this, asf_stream_t *stream,
/*
printf ("demux_asf: read %d bytes :", frag_len);
- hexdump (buf->content, frag_len);
+ hexdump (buf->content, frag_len, this->xine);
*/
}
@@ -814,7 +837,7 @@ static void asf_read_packet(demux_asf_t *this) {
this->input->seek (this->input, this->packet_size_left, SEEK_CUR);
if (!asf_get_packet(this)) {
- printf ("demux_asf: get_packet failed\n");
+ LOG_MSG(this->xine, _("demux_asf: get_packet failed\n"));
this->status = DEMUX_FINISHED;
return ;
}
@@ -848,7 +871,7 @@ static void asf_read_packet(demux_asf_t *this) {
this->packet_size_left -= 4;
break;
default:
- printf("demux_asf: unknow segtype %x\n",this->segtype);
+ LOG_MSG(this->xine, _("demux_asf: unknow segtype %x\n"), this->segtype);
frag_offset = get_le32(this);
this->packet_size_left -= 4;
break;
@@ -1027,7 +1050,7 @@ static void demux_asf_stop (demux_plugin_t *this_gen) {
void *p;
if (this->status != DEMUX_OK) {
- printf ("demux_asf: stop...ignored\n");
+ LOG_MSG(this->xine, _("demux_asf: stop...ignored\n"));
return;
}
@@ -1113,10 +1136,10 @@ static void demux_asf_start (demux_plugin_t *this_gen,
return;
}
- printf ("demux_asf: title : %s\n", this->title);
- printf ("demux_asf: author : %s\n", this->author);
- printf ("demux_asf: copyright : %s\n", this->copyright);
- printf ("demux_asf: comment : %s\n", this->comment);
+ LOG_MSG(this->xine, _("demux_asf: title : %s\n"), this->title);
+ LOG_MSG(this->xine, _("demux_asf: author : %s\n"), this->author);
+ LOG_MSG(this->xine, _("demux_asf: copyright : %s\n"), this->copyright);
+ LOG_MSG(this->xine, _("demux_asf: comment : %s\n"), this->comment);
/*
* seek to start position
@@ -1144,7 +1167,7 @@ static void demux_asf_start (demux_plugin_t *this_gen,
if ((err = pthread_create (&this->thread,
NULL, demux_asf_loop, this)) != 0) {
- fprintf (stderr, "demux_asf: can't create new thread (%s)\n",
+ LOG_MSG_STDERR(this->xine, _("demux_asf: can't create new thread (%s)\n"),
strerror(err));
exit (1);
}
@@ -1218,15 +1241,17 @@ demux_plugin_t *init_demuxer_plugin(int iface, xine_t *xine) {
demux_asf_t *this;
if (iface != 6) {
- printf( "demux_asf: plugin doesn't support plugin API version %d.\n"
- "demux_asf: this means there's a version mismatch between xine and this "
- "demux_asf: demuxer plugin.\nInstalling current demux plugins should help.\n",
+ LOG_MSG(xine,
+ _("demux_asf: plugin doesn't support plugin API version %d.\n"
+ " this means there's a version mismatch between xine and this "
+ " demuxer plugin.\nInstalling current demux plugins should help.\n"),
iface);
return NULL;
}
this = xine_xmalloc (sizeof (demux_asf_t));
this->config = xine->config;
+ this->xine = xine;
(void*) this->config->register_string(this->config,
"mrl.ends_asf", VALID_ENDS,
diff --git a/src/demuxers/demux_avi.c b/src/demuxers/demux_avi.c
index 6203a81b3..bde7f9809 100644
--- a/src/demuxers/demux_avi.c
+++ b/src/demuxers/demux_avi.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: demux_avi.c,v 1.58 2001/12/09 19:32:11 guenter Exp $
+ * $Id: demux_avi.c,v 1.59 2001/12/27 14:30:29 f1rmb Exp $
*
* demultiplexer for avi streams
*
@@ -48,6 +48,26 @@
#define VALID_ENDS "avi"
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
/* The following variable indicates the kind of error */
typedef struct
@@ -109,6 +129,8 @@ typedef struct
typedef struct demux_avi_s {
demux_plugin_t demux_plugin;
+ xine_t *xine;
+
config_values_t *config;
fifo_buffer_t *audio_fifo;
@@ -484,7 +506,7 @@ static avi_t *AVI_init(demux_avi_t *this) {
AVI->n_idx = 0;
i=0;
- printf ("demux_avi: reconstructing index");
+ LOG_MSG(this->xine, _("demux_avi: reconstructing index"));
while(1) {
if( this->input->read(this->input, data,8) != 8 )
@@ -493,7 +515,7 @@ static avi_t *AVI_init(demux_avi_t *this) {
i++;
if (i>1000) {
- printf (".");
+ LOG_MSG(this->xine, ".");
i = 0; fflush (stdout);
}
@@ -515,7 +537,7 @@ static avi_t *AVI_init(demux_avi_t *this) {
this->input->seek(this->input, PAD_EVEN(n), SEEK_CUR);
}
- printf ("done\n");
+ LOG_MSG(this->xine, _("done\n"));
idx_type = 1;
}
@@ -821,7 +843,7 @@ static void *demux_avi_loop (void *this_gen) {
}
}
- printf ("demux_avi: demux loop finished.\n");
+ LOG_MSG(this->xine, _("demux_avi: demux loop finished.\n"));
pthread_exit(NULL);
@@ -835,7 +857,7 @@ static void demux_avi_stop (demux_plugin_t *this_gen) {
void *p;
if (this->status != DEMUX_OK) {
- printf ("demux_avi: stop...ignored\n");
+ LOG_MSG(this->xine, _("demux_avi: stop...ignored\n"));
return;
}
@@ -893,19 +915,19 @@ static void demux_avi_start (demux_plugin_t *this_gen,
this->status = DEMUX_OK;
- printf ("demux_avi: video format = %s, audio format = 0x%lx\n",
+ LOG_MSG(this->xine, _("demux_avi: video format = %s, audio format = 0x%lx\n"),
this->avi->compressor, this->avi->a_fmt);
this->no_audio = 0;
this->avi->audio_type = formattag_to_buf_audio (this->avi->a_fmt);
if( !this->avi->audio_type ) {
- printf ("demux_avi: unknown audio type 0x%lx\n", this->avi->a_fmt);
+ LOG_MSG(this->xine, _("demux_avi: unknown audio type 0x%lx\n"), this->avi->a_fmt);
this->no_audio = 1;
this->avi->audio_type = BUF_CONTROL_NOP;
}
else
- printf ("demux_avi: audio type %s (wFormatTag 0x%x)\n",
+ LOG_MSG(this->xine, _("demux_avi: audio type %s (wFormatTag 0x%x)\n"),
buf_audio_name(this->avi->audio_type),
(int)this->avi->a_fmt);
@@ -923,7 +945,7 @@ static void demux_avi_start (demux_plugin_t *this_gen,
if (this->avi->video_posf>this->avi->video_frames) {
this->status = DEMUX_FINISHED;
- printf ("demux_avi: video seek to start failed\n");
+ LOG_MSG(this->xine, _("demux_avi: video seek to start failed\n"));
return;
}
}
@@ -940,7 +962,7 @@ static void demux_avi_start (demux_plugin_t *this_gen,
if (this->avi->video_posf>this->avi->video_frames) {
this->status = DEMUX_FINISHED;
- printf ("demux_avi: video seek to start failed\n");
+ LOG_MSG(this->xine, _("demux_avi: video seek to start failed\n"));
return;
}
}
@@ -957,7 +979,7 @@ static void demux_avi_start (demux_plugin_t *this_gen,
if (this->avi->audio_posc>this->avi->audio_chunks) {
this->status = DEMUX_FINISHED;
- printf ("demux_avi: audio seek to start failed\n");
+ LOG_MSG(this->xine, _("demux_avi: audio seek to start failed\n"));
return;
}
}
@@ -988,14 +1010,14 @@ static void demux_avi_start (demux_plugin_t *this_gen,
this->avi->video_type = fourcc_to_buf_video((void*)&this->avi->bih.biCompression);
if ( !this->avi->video_type ) {
- printf ("demux_avi: unknown avi format %.4s\n",
+ LOG_MSG(this->xine, _("demux_avi: unknown avi format %.4s\n"),
(char*)&this->avi->bih.biCompression);
this->status = DEMUX_FINISHED;
return;
}
buf->type = this->avi->video_type;
- printf ("demux_avi: video codec >%s<\n",buf_video_name(buf->type));
+ LOG_MSG(this->xine, _("demux_avi: video codec >%s<\n"), buf_video_name(buf->type));
this->video_fifo->put (this->video_fifo, buf);
@@ -1032,14 +1054,14 @@ static void demux_avi_start (demux_plugin_t *this_gen,
this->have_spu = 1;
- printf ("demux_avi: text subtitle file available\n");
+ LOG_MSG(this->xine, _("demux_avi: text subtitle file available\n"));
} else
this->have_spu = 0;
if ((err = pthread_create (&this->thread, NULL, demux_avi_loop, this)) != 0) {
- fprintf (stderr, "demux_avi: can't create new thread (%s)\n",
- strerror(err));
+ LOG_MSG_STDERR(this->xine, _("demux_avi: can't create new thread (%s)\n"),
+ strerror(err));
exit (1);
}
}
@@ -1070,13 +1092,13 @@ static int demux_avi_open(demux_plugin_t *this_gen,
if (this->avi) {
- printf ("demux_avi: %ld frames\n", this->avi->video_frames);
+ LOG_MSG(this->xine, _("demux_avi: %ld frames\n"), this->avi->video_frames);
strncpy(this->last_mrl, input->get_mrl (input), 1024);
return DEMUX_CAN_HANDLE;
} else
- printf ("demux_avi: AVI_init failed (AVI_errno: %d)\n",this->AVI_errno);
+ LOG_MSG(this->xine, _("demux_avi: AVI_init failed (AVI_errno: %d)\n"), this->AVI_errno);
return DEMUX_CANNOT_HANDLE;
}
@@ -1113,7 +1135,8 @@ static int demux_avi_open(demux_plugin_t *this_gen,
strncpy(this->last_mrl, input->get_mrl (input), 1024);
return DEMUX_CAN_HANDLE;
} else {
- printf ("demux_avi: AVI_init failed (AVI_errno: %d)\n",this->AVI_errno);
+ LOG_MSG(this->xine, _("demux_avi: AVI_init failed (AVI_errno: %d)\n"),
+ this->AVI_errno);
return DEMUX_CANNOT_HANDLE;
}
}
@@ -1156,15 +1179,17 @@ demux_plugin_t *init_demuxer_plugin(int iface, xine_t *xine) {
demux_avi_t *this;
if (iface != 6) {
- printf( "demux_avi: this plugin doesn't support plugin API version %d.\n"
- "demux_avi: this means there's a version mismatch between xine and this "
- "demux_avi: demuxer plugin.\nInstalling current demuxer plugins should help.\n",
+ LOG_MSG(xine,
+ _("demux_avi: this plugin doesn't support plugin API version %d.\n"
+ "demux_avi: this means there's a version mismatch between xine and this "
+ "demux_avi: demuxer plugin.\nInstalling current demuxer plugins should help.\n"),
iface);
return NULL;
}
this = xine_xmalloc (sizeof (demux_avi_t));
this->config = xine->config;
+ this->xine = xine;
(void*) this->config->register_string(this->config,
"mrl.ends_avi", VALID_ENDS,
diff --git a/src/demuxers/demux_cda.c b/src/demuxers/demux_cda.c
index cf6589a6a..1f3438460 100644
--- a/src/demuxers/demux_cda.c
+++ b/src/demuxers/demux_cda.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: demux_cda.c,v 1.3 2001/12/10 23:40:29 f1rmb Exp $
+ * $Id: demux_cda.c,v 1.4 2001/12/27 14:30:29 f1rmb Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -36,12 +36,34 @@
#include "compat.h"
#include "demux.h"
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
#define DEMUX_CDA_IFACE_VERSION 3
typedef struct {
demux_plugin_t demux_plugin;
+ xine_t *xine;
+
config_values_t *config;
fifo_buffer_t *video_fifo;
@@ -131,7 +153,7 @@ static void demux_cda_stop (demux_plugin_t *this_gen) {
void *p;
if (this->status != DEMUX_OK) {
- printf ("demux_cda: stop...ignored\n");
+ LOG_MSG(this->xine, _("demux_cda: stop...ignored\n"));
return;
}
@@ -206,7 +228,7 @@ static void demux_cda_start (demux_plugin_t *this_gen,
if ((err = pthread_create (&this->thread,
NULL, demux_cda_loop, this)) != 0) {
- fprintf (stderr, "demux_cda: can't create new thread (%s)\n", strerror(err));
+ LOG_MSG_STDERR(this->xine, _("demux_cda: can't create new thread (%s)\n"), strerror(err));
exit(1);
}
}
@@ -281,15 +303,17 @@ demux_plugin_t *init_demuxer_plugin(int iface, xine_t *xine) {
demux_cda_t *this;
if (iface != 6) {
- printf( "demux_cda: plugin doesn't support plugin API version %d.\n"
- "demux_cda: this means there's a version mismatch between xine and this "
- "demux_cda: demuxer plugin.\nInstalling current demux plugins should help.\n",
+ LOG_MSG(xine,
+ _("demux_cda: plugin doesn't support plugin API version %d.\n"
+ " this means there's a version mismatch between xine and this "
+ " demuxer plugin.\nInstalling current demux plugins should help.\n"),
iface);
return NULL;
}
this = (demux_cda_t *) xine_xmalloc(sizeof(demux_cda_t));
this->config = xine->config;
+ this->xine = xine;
this->demux_plugin.interface_version = DEMUX_CDA_IFACE_VERSION;
this->demux_plugin.open = demux_cda_open;
diff --git a/src/demuxers/demux_elem.c b/src/demuxers/demux_elem.c
index eb3bccec7..572c2ca15 100644
--- a/src/demuxers/demux_elem.c
+++ b/src/demuxers/demux_elem.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: demux_elem.c,v 1.30 2001/11/30 00:53:51 f1rmb Exp $
+ * $Id: demux_elem.c,v 1.31 2001/12/27 14:30:29 f1rmb Exp $
*
* demultiplexer for elementary mpeg streams
*
@@ -45,10 +45,32 @@
#define VALID_ENDS ".mpv"
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
typedef struct {
demux_plugin_t demux_plugin;
+ xine_t *xine;
+
config_values_t *config;
fifo_buffer_t *video_fifo;
@@ -225,8 +247,8 @@ static void demux_mpeg_elem_start (demux_plugin_t *this_gen,
if ((err = pthread_create (&this->thread,
NULL, demux_mpeg_elem_loop, this)) != 0) {
- fprintf (stderr, "demux_elem: can't create new thread (%s)\n",
- strerror(err));
+ LOG_MSG_STDERR(this->xine, _("demux_elem: can't create new thread (%s)\n"),
+ strerror(err));
exit (1);
}
}
@@ -337,15 +359,17 @@ demux_plugin_t *init_demuxer_plugin(int iface, xine_t *xine) {
demux_mpeg_elem_t *this;
if (iface != 6) {
- printf( "demux_elem: plugin doesn't support plugin API version %d.\n"
- "demux_elem: this means there's a version mismatch between xine and this "
- "demux_elem: demuxer plugin.\nInstalling current demux plugins should help.\n",
+ LOG_MSG(xine,
+ _("demux_elem: plugin doesn't support plugin API version %d.\n"
+ " this means there's a version mismatch between xine and this "
+ " demuxer plugin.\nInstalling current demux plugins should help.\n"),
iface);
return NULL;
}
-
+
this = malloc (sizeof (demux_mpeg_elem_t));
this->config = xine->config;
+ this->xine = xine;
(void*) this->config->register_string(this->config,
"mrl.ends_elem", VALID_ENDS,
diff --git a/src/demuxers/demux_mpeg.c b/src/demuxers/demux_mpeg.c
index 61e2176dc..4a9859621 100644
--- a/src/demuxers/demux_mpeg.c
+++ b/src/demuxers/demux_mpeg.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: demux_mpeg.c,v 1.46 2001/11/30 00:53:51 f1rmb Exp $
+ * $Id: demux_mpeg.c,v 1.47 2001/12/27 14:30:29 f1rmb Exp $
*
* demultiplexer for mpeg 1/2 program streams
* reads streams of variable blocksizes
@@ -45,11 +45,33 @@
#define VALID_MRLS "stdin,fifo"
#define VALID_ENDS "mpg,mpeg,mpe"
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
#define NUM_PREVIEW_BUFFERS 150
typedef struct demux_mpeg_s {
demux_plugin_t demux_plugin;
+
+ xine_t *xine;
config_values_t *config;
@@ -104,9 +126,8 @@ static uint32_t read_bytes (demux_mpeg_t *this, int n) {
res = (buf[2]<<8) | buf[3] | (buf[1]<<16) | (buf[0] << 24);
break;
default:
- fprintf (stderr,
- "How how - something wrong in wonderland demux:read_bytes (%d)\n",
- n);
+ LOG_MSG_STDERR(this->xine,
+ _("How how - something wrong in wonderland demux:read_bytes (%d)\n"), n);
exit (1);
}
@@ -643,7 +664,7 @@ static void *demux_mpeg_loop (void *this_gen) {
}
}
- printf ("demux loop finished (status: %d, buf:%x)\n",
+ LOG_MSG(this->xine, _("demux loop finished (status: %d, buf:%x)\n"),
this->status, w);
pthread_exit(NULL);
@@ -657,7 +678,7 @@ static void demux_mpeg_stop (demux_plugin_t *this_gen) {
buf_element_t *buf;
void *p;
- printf ("demux_mpeg: stop...\n");
+ LOG_MSG(this->xine, _("demux_mpeg: stop...\n"));
if (this->status != DEMUX_OK) {
@@ -760,8 +781,8 @@ static void demux_mpeg_start (demux_plugin_t *this_gen,
if ((err = pthread_create (&this->thread,
NULL, demux_mpeg_loop, this)) != 0) {
- fprintf (stderr, "demux_mpeg: can't create new thread (%s)\n",
- strerror(err));
+ LOG_MSG_STDERR(this->xine, _("demux_mpeg: can't create new thread (%s)\n"),
+ strerror(err));
exit (1);
}
}
@@ -849,7 +870,7 @@ static int demux_mpeg_open(demux_plugin_t *this_gen,
return DEMUX_CANNOT_HANDLE;
}
- fprintf(stderr, "You should specify mpeg(mpeg1/mpeg2) stream type.\n");
+ LOG_MSG_STDERR(this->xine, _("You should specify mpeg(mpeg1/mpeg2) stream type.\n"));
return DEMUX_CANNOT_HANDLE;
}
}
@@ -913,15 +934,17 @@ demux_plugin_t *init_demuxer_plugin(int iface, xine_t *xine) {
demux_mpeg_t *this;
if (iface != 6) {
- printf( "demux_mpeg: plugin doesn't support plugin API version %d.\n"
- "demux_mpeg: this means there's a version mismatch between xine and this "
- "demux_mpeg: demuxer plugin.\nInstalling current demux plugins should help.\n",
+ LOG_MSG(xine,
+ _("demux_mpeg: plugin doesn't support plugin API version %d.\n"
+ " this means there's a version mismatch between xine and this "
+ " demuxer plugin.\nInstalling current demux plugins should help.\n"),
iface);
return NULL;
}
-
- this = xine_xmalloc (sizeof (demux_mpeg_t));
+
+ this = xine_xmalloc (sizeof (demux_mpeg_t));
this->config = xine->config;
+ this->xine = xine;
/* Calling register_string() configure valid mrls in configfile */
(void*) this->config->register_string(this->config, "mrl.mrls_mpeg", VALID_MRLS,
diff --git a/src/demuxers/demux_mpeg_block.c b/src/demuxers/demux_mpeg_block.c
index 61993bf28..39611f8d3 100644
--- a/src/demuxers/demux_mpeg_block.c
+++ b/src/demuxers/demux_mpeg_block.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: demux_mpeg_block.c,v 1.68 2001/12/24 00:45:03 guenter Exp $
+ * $Id: demux_mpeg_block.c,v 1.69 2001/12/27 14:30:30 f1rmb Exp $
*
* demultiplexer for mpeg 1/2 program streams
*
@@ -45,12 +45,33 @@
#define VALID_MRLS "dvd,stdin,fifo"
#define VALID_ENDS "vob"
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
#define NUM_PREVIEW_BUFFERS 250
typedef struct demux_mpeg_block_s {
demux_plugin_t demux_plugin;
xine_t *xine;
+
config_values_t *config;
fifo_buffer_t *audio_fifo;
@@ -92,7 +113,7 @@ static void demux_mpeg_block_parse_pack (demux_mpeg_block_t *this, int preview_m
if (buf==NULL) {
xine_next_mrl_event_t event;
- printf ("demux_mpeg_block: read_block failed\n");
+ LOG_MSG(this->xine, _("demux_mpeg_block: read_block failed\n"));
/*
* check if seamless branching is possible
@@ -106,12 +127,12 @@ static void demux_mpeg_block_parse_pack (demux_mpeg_block_t *this, int preview_m
char *next_mrl = event.mrl;
- printf ("demux_mpeg_block: checking if we can branch to %s\n", next_mrl);
+ LOG_MSG(this->xine, _("demux_mpeg_block: checking if we can branch to %s\n"), next_mrl);
if (next_mrl && this->input->is_branch_possible
&& this->input->is_branch_possible (this->input, next_mrl)) {
- printf ("demux_mpeg_block: branching\n");
+ LOG_MSG(this->xine, _("demux_mpeg_block: branching\n"));
this->input->close (this->input);
this->input->open (this->input, next_mrl);
@@ -241,13 +262,13 @@ static void demux_mpeg_block_parse_pack (demux_mpeg_block_t *this, int preview_m
/* we should now have a PES packet here */
if (p[0] || p[1] || (p[2] != 1)) {
- printf ("demux_mpeg_block: error! %02x %02x %02x (should be 0x000001) \n",
+ LOG_MSG(this->xine, _("demux_mpeg_block: error! %02x %02x %02x (should be 0x000001) \n"),
p[0], p[1], p[2]);
buf->free_buffer (buf);
this->warned++;
if (this->warned > 5) {
- printf ("demux_mpeg_block: too many errors, stopping playback. Maybe this stream is scrambled?\n");
+ LOG_MSG(this->xine, _("demux_mpeg_block: too many errors, stopping playback. Maybe this stream is scrambled?\n"));
this->status = DEMUX_FINISHED;
}
@@ -342,7 +363,7 @@ static void demux_mpeg_block_parse_pack (demux_mpeg_block_t *this, int preview_m
} else { /* mpeg 2 */
/* check PES scrambling_control */
if (((p[6] & 0x30) != 0) && !this->warned) {
- printf("demux_mpeg_block: warning: pes header indicates that this stream may be encrypted (encryption mode %d)\n", (p[6] & 0x30) >> 4);
+ LOG_MSG(this->xine, _("demux_mpeg_block: warning: pes header indicates that this stream may be encrypted (encryption mode %d)\n"), (p[6] & 0x30) >> 4);
this->warned = 1;
}
@@ -456,8 +477,8 @@ static void demux_mpeg_block_parse_pack (demux_mpeg_block_t *this, int preview_m
switch ((p[5]>>6) & 3) {
case 3: /* illegal, use 16-bits? */
default:
- printf("illegal lpcm sample format (%d), assume 16-bit samples\n",
- (p[5]>>6) & 3 );
+ LOG_MSG(this->xine, _("illegal lpcm sample format (%d), assume 16-bit samples\n"),
+ (p[5]>>6) & 3 );
case 0: bits_per_sample = 16; break;
case 1: bits_per_sample = 20; break;
case 2: bits_per_sample = 24; break;
@@ -619,7 +640,8 @@ static int demux_mpeg_block_estimate_rate (demux_mpeg_block_t *this) {
/* we should now have a PES packet here */
if (p[0] || p[1] || (p[2] != 1)) {
- printf ("demux_mpeg_block: error %02x %02x %02x (should be 0x000001) \n",p[0],p[1],p[2]);
+ LOG_MSG(this->xine, _("demux_mpeg_block: error %02x %02x %02x (should be 0x000001) \n"),
+ p[0], p[1], p[2]);
buf->free_buffer (buf);
return rate;
}
@@ -719,7 +741,7 @@ static void demux_mpeg_block_stop (demux_plugin_t *this_gen) {
void *p;
if (this->status != DEMUX_OK) {
- printf ("demux_mpeg_block: stop...ignored\n");
+ LOG_MSG(this->xine, _("demux_mpeg_block: stop...ignored\n"));
return;
}
@@ -838,8 +860,8 @@ static void demux_mpeg_block_start (demux_plugin_t *this_gen,
if ((err = pthread_create (&this->thread,
NULL, demux_mpeg_block_loop, this)) != 0) {
- fprintf (stderr, "demux_mpeg_block: can't create new thread (%s)\n",
- strerror(err));
+ LOG_MSG_STDERR(this->xine, _("demux_mpeg_block: can't create new thread (%s)\n"),
+ strerror(err));
exit (1);
}
}
@@ -855,11 +877,11 @@ static void demux_mpeg_block_accept_input (demux_mpeg_block_t *this,
strncpy (this->cur_mrl, input->get_mrl(input), 256);
- printf ("demux_mpeg_block: mrl %s is new, will estimated bitrate\n",
+ LOG_MSG(this->xine, _("demux_mpeg_block: mrl %s is new, will estimated bitrate\n"),
this->cur_mrl);
} else
- printf ("demux_mpeg_block: mrl %s is known, estimated bitrate: %d\n",
+ LOG_MSG(this->xine, _("demux_mpeg_block: mrl %s is known, estimated bitrate: %d\n"),
this->cur_mrl, this->rate * 50 * 8);
}
@@ -1014,16 +1036,17 @@ demux_plugin_t *init_demuxer_plugin(int iface, xine_t *xine) {
demux_mpeg_block_t *this;
if (iface != 6) {
- printf( "demux_mpeg_block: plugin doesn't support plugin API version %d.\n"
- "demux_mpeg_block: this means there's a version mismatch between xine and this "
- "demux_mpeg_block: demuxer plugin.\nInstalling current demux plugins should help.\n",
+ LOG_MSG(xine,
+ _("demux_mpeg_block: plugin doesn't support plugin API version %d.\n"
+ " this means there's a version mismatch between xine and this "
+ " demuxer plugin.\nInstalling current demux plugins should help.\n"),
iface);
return NULL;
}
this = xine_xmalloc (sizeof (demux_mpeg_block_t));
- this->xine = xine;
this->config = xine->config;
+ this->xine = xine;
/* Calling register_string() configure valid mrls in configfile */
(void*) this->config->register_string(this->config, "mrl.mrls_mpeg_block", VALID_MRLS,
diff --git a/src/demuxers/demux_mpgaudio.c b/src/demuxers/demux_mpgaudio.c
index 7e0546358..c6199d19e 100644
--- a/src/demuxers/demux_mpgaudio.c
+++ b/src/demuxers/demux_mpgaudio.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: demux_mpgaudio.c,v 1.30 2001/11/30 00:53:51 f1rmb Exp $
+ * $Id: demux_mpgaudio.c,v 1.31 2001/12/27 14:30:30 f1rmb Exp $
*
* demultiplexer for mpeg audio (i.e. mp3) streams
*
@@ -43,10 +43,32 @@
#define VALID_ENDS "mp3,mp2,mpa,mpega"
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
typedef struct {
demux_plugin_t demux_plugin;
+ xine_t *xine;
+
config_values_t *config;
fifo_buffer_t *audio_fifo;
@@ -151,7 +173,7 @@ static void mpg123_decode_header(demux_mpgaudio_t *this,unsigned long newhead)
tpf /= freqs[sampling_frequency] << lsf;
bitrate = (double) framesize / tpf;
- printf("mpgaudio: bitrate = %.2fkbps\n", bitrate/1024.0*8.0 );
+ LOG_MSG(this->xine, _("mpgaudio: bitrate = %.2fkbps\n"), bitrate/1024.0*8.0 );
this->stream_length = (int)(this->input->get_length(this->input) / bitrate);
}
@@ -238,7 +260,7 @@ static void demux_mpgaudio_stop (demux_plugin_t *this_gen) {
void *p;
if (this->status != DEMUX_OK) {
- printf ("demux_mpgaudio_block: stop...ignored\n");
+ LOG_MSG(this->xine, _("demux_mpgaudio_block: stop...ignored\n"));
return;
}
@@ -342,8 +364,8 @@ static void demux_mpgaudio_start (demux_plugin_t *this_gen,
if ((err = pthread_create (&this->thread,
NULL, demux_mpgaudio_loop, this)) != 0) {
- fprintf (stderr, "demux_mpgaudio: can't create new thread (%s)\n",
- strerror(err));
+ LOG_MSG_STDERR(this->xine, _("demux_mpgaudio: can't create new thread (%s)\n"),
+ strerror(err));
exit (1);
}
}
@@ -440,15 +462,17 @@ demux_plugin_t *init_demuxer_plugin(int iface, xine_t *xine) {
demux_mpgaudio_t *this;
if (iface != 6) {
- printf( "demux_mpeg: plugin doesn't support plugin API version %d.\n"
- "demux_mpeg: this means there's a version mismatch between xine and this "
- "demux_mpeg: demuxer plugin.\nInstalling current demux plugins should help.\n",
+ LOG_MSG(xine,
+ _("demux_mpeg: plugin doesn't support plugin API version %d.\n"
+ " this means there's a version mismatch between xine and this "
+ " demuxer plugin.\nInstalling current demux plugins should help.\n"),
iface);
return NULL;
}
-
+
this = malloc (sizeof (demux_mpgaudio_t));
this->config = xine->config;
+ this->xine = xine;
(void*) this->config->register_string(this->config,
"mrl.ends_mgaudio", VALID_ENDS,
@@ -467,4 +491,3 @@ demux_plugin_t *init_demuxer_plugin(int iface, xine_t *xine) {
return &this->demux_plugin;
}
-
diff --git a/src/demuxers/demux_ogg.c b/src/demuxers/demux_ogg.c
index 250cace76..4338c127e 100644
--- a/src/demuxers/demux_ogg.c
+++ b/src/demuxers/demux_ogg.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: demux_ogg.c,v 1.11 2001/11/30 00:53:51 f1rmb Exp $
+ * $Id: demux_ogg.c,v 1.12 2001/12/27 14:30:30 f1rmb Exp $
*
* demultiplexer for ogg streams
*
@@ -46,9 +46,31 @@
#define VALID_ENDS "ogg"
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
typedef struct demux_ogg_s {
demux_plugin_t demux_plugin;
+ xine_t *xine;
+
config_values_t *config;
fifo_buffer_t *audio_fifo;
@@ -102,9 +124,8 @@ static void demux_ogg_send_package (demux_ogg_t *this, int is_content) {
cur_serno = ogg_page_serialno (&this->og);
if (ogg_page_bos(&this->og)) {
- printf("demux_ogg: beginning of stream\n");
- printf("demux_ogg: serial number %d\n",
- ogg_page_serialno (&this->og));
+ LOG_MSG(this->xine, _("demux_ogg: beginning of stream\ndemux_ogg: serial number %d\n"),
+ ogg_page_serialno (&this->og));
}
for (i = 0; i<this->num_streams; i++) {
@@ -119,7 +140,7 @@ static void demux_ogg_send_package (demux_ogg_t *this, int is_content) {
stream_num = this->num_streams;
this->buf_types[stream_num] = 0;
- printf("demux_ogg: found a new stream, serialnumber %d\n", cur_serno);
+ LOG_MSG(this->xine, _("demux_ogg: found a new stream, serialnumber %d\n"), cur_serno);
this->num_streams++;
}
@@ -135,7 +156,7 @@ static void demux_ogg_send_package (demux_ogg_t *this, int is_content) {
if (!strncmp (&op.packet[1], "vorbis", 6)) {
this->buf_types[stream_num] = BUF_AUDIO_VORBIS;
} else {
- printf ("demux_ogg: unknown streamtype, signature: >%.8s<\n",
+ LOG_MSG(this->xine, _("demux_ogg: unknown streamtype, signature: >%.8s<\n"),
op.packet);
this->buf_types[stream_num] = BUF_CONTROL_NOP;
}
@@ -234,7 +255,7 @@ static void demux_ogg_stop (demux_plugin_t *this_gen) {
void *p;
if (this->status != DEMUX_OK) {
- printf ("demux_ogg: stop...ignored\n");
+ LOG_MSG(this->xine, _("demux_ogg: stop...ignored\n"));
return;
}
@@ -336,8 +357,8 @@ static void demux_ogg_start (demux_plugin_t *this_gen,
if ((err = pthread_create (&this->thread,
NULL, demux_ogg_loop, this)) != 0) {
- fprintf (stderr, "demux_ogg: can't create new thread (%s)\n",
- strerror(err));
+ LOG_MSG_STDERR(this->xine, _("demux_ogg: can't create new thread (%s)\n"),
+ strerror(err));
exit (1);
}
}
@@ -409,15 +430,17 @@ demux_plugin_t *init_demuxer_plugin(int iface, xine_t *xine) {
demux_ogg_t *this;
if (iface != 6) {
- printf( "demux_ogg: plugin doesn't support plugin API version %d.\n"
- "demux_ogg: this means there's a version mismatch between xine and this "
- "demux_ogg: demuxer plugin.\nInstalling current demux plugins should help.\n",
+ LOG_MSG(xine,
+ _("demux_ogg: plugin doesn't support plugin API version %d.\n"
+ " this means there's a version mismatch between xine and this "
+ " demuxer plugin.\nInstalling current demux plugins should help.\n"),
iface);
return NULL;
}
-
+
this = xine_xmalloc (sizeof (demux_ogg_t));
this->config = xine->config;
+ this->xine = xine;
(void*) this->config->register_string(this->config,
"mrl.ends_ogg", VALID_ENDS,
diff --git a/src/demuxers/demux_pes.c b/src/demuxers/demux_pes.c
index 88065aa0a..d65f10fd3 100644
--- a/src/demuxers/demux_pes.c
+++ b/src/demuxers/demux_pes.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: demux_pes.c,v 1.15 2001/11/30 00:53:51 f1rmb Exp $
+ * $Id: demux_pes.c,v 1.16 2001/12/27 14:30:30 f1rmb Exp $
*
* demultiplexer for mpeg 2 PES (Packetized Elementary Streams)
* reads streams of variable blocksizes
@@ -46,10 +46,32 @@
#define VALID_MRLS "fifo,stdin"
#define VALID_ENDS "vdr"
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
typedef struct demux_pes_s {
demux_plugin_t demux_plugin;
+ xine_t *xine;
+
config_values_t *config;
fifo_buffer_t *audio_fifo;
@@ -100,9 +122,8 @@ static uint32_t read_bytes (demux_pes_t *this, int n) {
res = (buf[2]<<8) | buf[3] | (buf[1]<<16) | (buf[0] << 24);
break;
default:
- fprintf (stderr,
- "How how - something wrong in wonderland demux:read_bytes (%d)\n",
- n);
+ LOG_MSG_STDERR(this->xine,
+ _("How how - something wrong in wonderland demux:read_bytes (%d)\n"), n);
exit (1);
}
@@ -325,7 +346,7 @@ static void *demux_pes_loop (void *this_gen) {
}
}
- printf ("demux loop finished (status: %d, buf:%x)\n",
+ LOG_MSG(this->xine, _("demux loop finished (status: %d, buf:%x)\n"),
this->status, w);
pthread_exit(NULL);
@@ -339,7 +360,7 @@ static void demux_pes_stop (demux_plugin_t *this_gen) {
buf_element_t *buf;
void *p;
- printf ("demux_pes: stop...\n");
+ LOG_MSG(this->xine, _("demux_pes: stop...\n"));
if (this->status != DEMUX_OK) {
@@ -435,8 +456,8 @@ static void demux_pes_start (demux_plugin_t *this_gen,
if ((err = pthread_create (&this->thread,
NULL, demux_pes_loop, this)) != 0) {
- fprintf (stderr, "demux_pes: can't create new thread (%s)\n",
- strerror(err));
+ LOG_MSG_STDERR(this->xine, _("demux_pes: can't create new thread (%s)\n"),
+ strerror(err));
exit (1);
}
}
@@ -565,15 +586,17 @@ demux_plugin_t *init_demuxer_plugin(int iface, xine_t *xine) {
demux_pes_t *this;
if (iface != 6) {
- printf( "demux_pes: plugin doesn't support plugin API version %d.\n"
- "demux_pes: this means there's a version mismatch between xine and this "
- "demux_pes: demuxer plugin.\nInstalling current demux plugins should help.\n",
+ LOG_MSG(xine,
+ _("demux_pes: plugin doesn't support plugin API version %d.\n"
+ " this means there's a version mismatch between xine and this "
+ " demuxer plugin.\nInstalling current demux plugins should help.\n"),
iface);
return NULL;
}
this = xine_xmalloc (sizeof (demux_pes_t));
this->config = xine->config;
+ this->xine = xine;
(void*) this->config->register_string(this->config, "mrl.mrls_pes", VALID_MRLS,
"valid mrls for pes demuxer",
diff --git a/src/demuxers/demux_qt.c b/src/demuxers/demux_qt.c
index 769dfad3d..0dadf936b 100644
--- a/src/demuxers/demux_qt.c
+++ b/src/demuxers/demux_qt.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: demux_qt.c,v 1.16 2001/11/30 00:53:51 f1rmb Exp $
+ * $Id: demux_qt.c,v 1.17 2001/12/27 14:30:30 f1rmb Exp $
*
* demultiplexer for quicktime streams, based on:
*
@@ -56,6 +56,26 @@
#define VALID_ENDS "mov"
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
/* OpenQuicktime Codec Parameter Types */
#define QUICKTIME_UNKNOWN_PARAMETER -1
#define QUICKTIME_STRING_PARAMETER 0
@@ -516,6 +536,8 @@ typedef struct quicktime_struc {
typedef struct demux_qt_s {
demux_plugin_t demux_plugin;
+ xine_t *xine;
+
config_values_t *config;
fifo_buffer_t *audio_fifo;
@@ -3138,7 +3160,7 @@ static int quicktime_moov_delete(quicktime_moov_t *moov)
#define QT_zlib 0x7A6C6962
static int quicktime_read_moov(quicktime_t *file, quicktime_moov_t *moov,
- quicktime_atom_t *parent_atom) {
+ quicktime_atom_t *parent_atom, xine_t *xine) {
/* mandatory mvhd */
quicktime_atom_t leaf_atom;
@@ -3174,7 +3196,7 @@ static int quicktime_read_moov(quicktime_t *file, quicktime_moov_t *moov,
zlibfourcc = quicktime_atom_read_size((char *)&zlibfourcc);
if(zlibfourcc != QT_zlib)
- printf("Header not compressed with zlib\n");
+ LOG_MSG(xine, _("Header not compressed with zlib\n"));
if(compressed_atom.size - 4 > 0) {
offset = file->ftell_position + compressed_atom.size - 4;
@@ -3195,7 +3217,7 @@ static int quicktime_read_moov(quicktime_t *file, quicktime_moov_t *moov,
/* Allocate buffer for compressed header */
cmov_buf = (unsigned char *)malloc( cmov_sz );
if (cmov_buf == 0) {
- fprintf(stderr, "QT cmov: malloc err 0");
+ LOG_MSG_STDERR(xine, _("QT cmov: malloc err 0"));
exit(1);
}
/* Read in compressed header */
@@ -3203,7 +3225,7 @@ static int quicktime_read_moov(quicktime_t *file, quicktime_moov_t *moov,
tlen = file->quicktime_read_data(file, (char*)cmov_buf, cmov_sz);
if (tlen != 1) {
- fprintf(stderr,"QT cmov: read err tlen %llu\n", tlen);
+ LOG_MSG_STDERR(xine, _("QT cmov: read err tlen %llu\n"), tlen);
free(cmov_buf);
return 0;
}
@@ -3212,7 +3234,7 @@ static int quicktime_read_moov(quicktime_t *file, quicktime_moov_t *moov,
moov_sz += 16; /* slop?? */
moov_buf = (unsigned char *)malloc( moov_sz );
if (moov_buf == 0) {
- fprintf(stderr,"QT cmov: malloc err moov_sz %u\n", moov_sz);
+ LOG_MSG_STDERR(xine, _("QT cmov: malloc err moov_sz %u\n"), moov_sz);
exit(1);
}
@@ -3226,12 +3248,12 @@ static int quicktime_read_moov(quicktime_t *file, quicktime_moov_t *moov,
zret = inflateInit(&zstrm);
if (zret != Z_OK) {
- fprintf(stderr,"QT cmov: inflateInit err %d\n",zret);
+ LOG_MSG_STDERR(xine, _("QT cmov: inflateInit err %d\n"), zret);
break;
}
zret = inflate(&zstrm, Z_NO_FLUSH);
if ((zret != Z_OK) && (zret != Z_STREAM_END)) {
- fprintf(stderr,"QT cmov inflate: ERR %d\n",zret);
+ LOG_MSG_STDERR(xine, _("QT cmov inflate: ERR %d\n"), zret);
break;
} else {
FILE *DecOut;
@@ -3750,14 +3772,14 @@ static void quicktime_mdat_delete(quicktime_mdat_t *mdat)
{
}
-static void quicktime_read_mdat(quicktime_t *file, quicktime_mdat_t *mdat, quicktime_atom_t *parent_atom)
+static void quicktime_read_mdat(quicktime_t *file, quicktime_mdat_t *mdat, quicktime_atom_t *parent_atom, xine_t *xine)
{
mdat->atom.size = parent_atom->size;
mdat->atom.start = parent_atom->start;
quicktime_atom_skip(file, parent_atom);
}
-static int quicktime_read_info(quicktime_t *file) {
+static int quicktime_read_info(quicktime_t *file, xine_t *xine) {
int result = 0, found_moov = 0;
int i, track;
@@ -3777,10 +3799,10 @@ static int quicktime_read_info(quicktime_t *file) {
if(!result) {
if(quicktime_atom_is(&leaf_atom, "mdat")) {
- quicktime_read_mdat(file, &(file->mdat), &leaf_atom);
+ quicktime_read_mdat(file, &(file->mdat), &leaf_atom, xine);
found_mdat = 1;
} else if(quicktime_atom_is(&leaf_atom, "moov")) {
- quicktime_read_moov(file, &(file->moov), &leaf_atom);
+ quicktime_read_moov(file, &(file->moov), &leaf_atom, xine);
found_moov = 1;
} else {
quicktime_atom_skip(file, &leaf_atom);
@@ -3917,7 +3939,7 @@ static void quicktime_close(quicktime_t *file)
free(file);
}
-static quicktime_t* quicktime_open(input_plugin_t *input)
+static quicktime_t* quicktime_open(input_plugin_t *input, xine_t *xine)
{
quicktime_t *new_file = calloc(1, sizeof(quicktime_t));
@@ -3938,9 +3960,9 @@ static quicktime_t* quicktime_open(input_plugin_t *input)
/* Get length. */
new_file->total_length = get_file_length(new_file);
- if(quicktime_read_info(new_file)) {
+ if(quicktime_read_info(new_file, xine)) {
quicktime_close(new_file);
- printf("demux_qt: quicktime_open: error in header\n");
+ LOG_MSG(xine, _("demux_qt: quicktime_open: error in header\n"));
new_file = 0;
}
@@ -4109,7 +4131,7 @@ static void demux_qt_stop (demux_plugin_t *this_gen) {
void *p;
if (this->status != DEMUX_OK) {
- printf ("demux_qt: stop...ignored\n");
+ LOG_MSG(this->xine, _("demux_qt: stop...ignored\n"));
return;
}
@@ -4170,11 +4192,11 @@ static int demux_qt_detect_compressors (demux_qt_t *this) {
}
if (!this->video_type ) {
- printf ("demux_qt: unknown video codec >%s<\n",video);
+ LOG_MSG(this->xine, _("demux_qt: unknown video codec >%s<\n"), video);
return 0;
}
- printf ("demux_qt: video codec >%s<\n",buf_video_name(this->video_type));
+ LOG_MSG(this->xine, _("demux_qt: video codec >%s<\n"), buf_video_name(this->video_type));
this->wavex.nChannels = quicktime_track_channels (this->qt, 0);
@@ -4195,7 +4217,7 @@ static int demux_qt_detect_compressors (demux_qt_t *this) {
} else if (!strncasecmp (audio, ".mp3", 4)) {
this->audio_type = BUF_AUDIO_MPEG;
} else {
- printf ("demux_qt: unknown audio codec >%s<\n",
+ LOG_MSG(this->xine, _("demux_qt: unknown audio codec >%s<\n"),
audio);
this->audio_type = BUF_CONTROL_NOP;
}
@@ -4220,14 +4242,14 @@ static void demux_qt_start (demux_plugin_t *this_gen,
* init quicktime parser
*/
- this->qt = quicktime_open (this->input);
+ this->qt = quicktime_open (this->input, this->xine);
if (!this->qt) {
this->status = DEMUX_FINISHED;
return;
}
- printf ("demux_qt: video codec %s (%f fps), audio codec %s (%ld Hz, %d bits)\n",
+ LOG_MSG(this->xine, _("demux_qt: video codec %s (%f fps), audio codec %s (%ld Hz, %d bits)\n"),
quicktime_video_compressor (this->qt,0),
quicktime_frame_rate (this->qt,0),
quicktime_audio_compressor (this->qt,0),
@@ -4306,7 +4328,7 @@ static void demux_qt_start (demux_plugin_t *this_gen,
this->status = DEMUX_OK ;
if ((err = pthread_create (&this->thread, NULL, demux_qt_loop, this)) != 0) {
- fprintf (stderr, "demux_qt: can't create new thread (%s)\n", strerror(err));
+ LOG_MSG_STDERR(this->xine, _("demux_qt: can't create new thread (%s)\n"), strerror(err));
exit (1);
}
}
@@ -4394,15 +4416,17 @@ demux_plugin_t *init_demuxer_plugin(int iface, xine_t *xine) {
demux_qt_t *this;
if (iface != 6) {
- printf( "demux_qt: plugin doesn't support plugin API version %d.\n"
- "demux_qt: this means there's a version mismatch between xine and this "
- "demux_qt: demuxer plugin.\nInstalling current demux plugins should help.\n",
+ LOG_MSG(xine,
+ _("demux_qt: plugin doesn't support plugin API version %d.\n"
+ " this means there's a version mismatch between xine and this "
+ " demuxer plugin.\nInstalling current demux plugins should help.\n"),
iface);
return NULL;
}
this = xine_xmalloc (sizeof (demux_qt_t));
this->config = xine->config;
+ this->xine = xine;
(void*) this->config->register_string(this->config,
"mrl.ends_qt", VALID_ENDS,
diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c
index f27049d7b..9ae4f1525 100644
--- a/src/demuxers/demux_ts.c
+++ b/src/demuxers/demux_ts.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: demux_ts.c,v 1.31 2001/12/09 00:59:23 guenter Exp $
+ * $Id: demux_ts.c,v 1.32 2001/12/27 14:30:30 f1rmb Exp $
*
* Demultiplexer for MPEG2 Transport Streams.
*
@@ -71,6 +71,26 @@
#define VALID_MRLS "fifo,stdin"
#define VALID_ENDS "m2t,ts,trp"
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_DEMUX, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_DEMUX, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
/*
#define TS_LOG
*/
@@ -122,6 +142,8 @@ typedef struct {
* The first field must be the "base class" for the plugin!
*/
demux_plugin_t plugin;
+
+ xine_t *xine;
config_values_t *config;
@@ -212,7 +234,7 @@ static void demux_ts_parse_pat (demux_ts *this, unsigned char *original_pkt,
* indicator set.
*/
if (!pus) {
- printf ("demux_ts: demux error! PAT without payload unit start\n");
+ LOG_MSG(this->xine, _("demux_ts: demux error! PAT without payload unit start\n"));
return;
}
@@ -221,7 +243,7 @@ static void demux_ts_parse_pat (demux_ts *this, unsigned char *original_pkt,
*/
pkt += pkt[4];
if (pkt - original_pkt > PKT_SIZE) {
- printf ("demux_ts: demux error! PAT with invalid pointer\n");
+ LOG_MSG(this->xine, _("demux_ts: demux error! PAT with invalid pointer\n"));
return;
}
table_id = (unsigned int)pkt[5] ;
@@ -238,22 +260,22 @@ static void demux_ts_parse_pat (demux_ts *this, unsigned char *original_pkt,
crc32 |= (uint32_t)pkt[7+section_length] ;
#ifdef TS_LOG
- xprintf (VERBOSE|DEMUX,"PAT table_id=%d\n",
- table_id);
- xprintf (VERBOSE|DEMUX,"\tsection_syntax=%d\n",
- section_syntax_indicator);
- xprintf (VERBOSE|DEMUX,"\tsection_length=%d\n",
- section_length);
- xprintf (VERBOSE|DEMUX,"\ttransport_stream_id=0x%04x\n",
- transport_stream_id);
- xprintf (VERBOSE|DEMUX,"\tversion_number=%d\n",
- version_number);
- xprintf (VERBOSE|DEMUX,"\tcurrent_next_indicator=%d\n",
- current_next_indicator);
- xprintf (VERBOSE|DEMUX,"\tsection_number=%d\n",
- section_number);
- xprintf (VERBOSE|DEMUX,"\tlast_section_number=%d\n",
- last_section_number);
+ printf ("PAT table_id=%d\n",
+ table_id);
+ printf ("\tsection_syntax=%d\n",
+ section_syntax_indicator);
+ printf ("\tsection_length=%d\n",
+ section_length);
+ printf ("\ttransport_stream_id=0x%04x\n",
+ transport_stream_id);
+ printf ("\tversion_number=%d\n",
+ version_number);
+ printf ("\tcurrent_next_indicator=%d\n",
+ current_next_indicator);
+ printf ("\tsection_number=%d\n",
+ section_number);
+ printf ("\tlast_section_number=%d\n",
+ last_section_number);
#endif
if (!(current_next_indicator)) {
@@ -263,12 +285,12 @@ static void demux_ts_parse_pat (demux_ts *this, unsigned char *original_pkt,
return;
}
if (pkt - original_pkt > BODY_SIZE - 1 - 3 - (int)section_length) {
- printf ("demux_ts: demux error! PAT with invalid section length\n");
+ LOG_MSG(this->xine, _("demux_ts: demux error! PAT with invalid section length\n"));
return;
}
if ((section_number) || (last_section_number)) {
- printf ("demux_ts: demux error! PAT with invalid section %02x of %02x\n",
- section_number, last_section_number);
+ LOG_MSG(this->xine, _("demux_ts: demux error! PAT with invalid section %02x of %02x\n"),
+ section_number, last_section_number);
return;
}
@@ -277,8 +299,7 @@ static void demux_ts_parse_pat (demux_ts *this, unsigned char *original_pkt,
*/
calc_crc32 = demux_ts_compute_crc32(this, pkt+5, section_length+3-4, 0xffffffff);
if (crc32 != calc_crc32) {
- printf("demux_ts: demux error! PAT with invalid CRC32: packet_crc32=0x%08x calc_crc32=0x%08x\n",
- crc32,calc_crc32);
+ LOG_MSG(this->xine, _("demux_ts: demux error! PAT with invalid CRC32: packet_crc32=0x%08x calc_crc32=0x%08x\n"), crc32,calc_crc32);
return;
}
@@ -308,7 +329,7 @@ static void demux_ts_parse_pat (demux_ts *this, unsigned char *original_pkt,
program_count = 0;
while ((this->program_number[program_count] != INVALID_PROGRAM) ) {
#ifdef TS_LOG
- xprintf(VERBOSE|DEMUX, "PAT acquiring count=%d programNumber=0x%04x pmtPid=0x%04x\n",
+ printf("PAT acquiring count=%d programNumber=0x%04x pmtPid=0x%04x\n",
program_count,
this->program_number[program_count],
this->pmt_pid[program_count]);
@@ -318,7 +339,8 @@ static void demux_ts_parse_pat (demux_ts *this, unsigned char *original_pkt,
}
}
-static int demux_ts_parse_pes_header (demux_ts_media *m, uint8_t *buf, int packet_len) {
+static int demux_ts_parse_pes_header (demux_ts_media *m,
+ uint8_t *buf, int packet_len, xine_t *xine) {
unsigned char *p;
uint32_t header_len;
@@ -330,7 +352,7 @@ static int demux_ts_parse_pes_header (demux_ts_media *m, uint8_t *buf, int packe
/* we should have a PES packet here */
if (p[0] || p[1] || (p[2] != 1)) {
- printf ("demux_ts: error %02x %02x %02x (should be 0x000001) \n",p[0],p[1],p[2]);
+ LOG_MSG(xine, _("demux_ts: error %02x %02x %02x (should be 0x000001) \n"), p[0], p[1], p[2]);
return 0 ;
}
@@ -342,8 +364,8 @@ static int demux_ts_parse_pes_header (demux_ts_media *m, uint8_t *buf, int packe
return 0;
#ifdef TS_LOG
- xprintf(VERBOSE|DEMUX, "packet stream id = %02x len = %d\n",
- stream_id, packet_len);
+ printf("packet stream id = %02x len = %d\n",
+ stream_id, packet_len);
#endif
if (p[7] & 0x80) { /* PTS avail */
@@ -438,7 +460,7 @@ static int demux_ts_parse_pes_header (demux_ts_media *m, uint8_t *buf, int packe
} else {
#ifdef TS_LOG
- xprintf(VERBOSE | DEMUX, "unknown packet, id = %x\n",stream_id);
+ printf("unknown packet, id = %x\n",stream_id);
#endif
}
@@ -466,7 +488,7 @@ static void demux_ts_buffer_pes(demux_ts *this, unsigned char *ts,
demux_ts_media *m = &this->media[mediaIndex];
if (!m->fifo) {
- printf ("fifo unavailable (%d)\n", mediaIndex);
+ LOG_MSG(this->xine, _("fifo unavailable (%d)\n"), mediaIndex);
return; /* To avoid segfault if video out or audio out plugin not loaded */
@@ -478,7 +500,7 @@ static void demux_ts_buffer_pes(demux_ts *this, unsigned char *ts,
*/
if (m->counter != INVALID_CC) {
if ((m->counter & 0x0f) != cc) {
- printf("demux_ts: dropped input packet cc = %d expected = %d\n", cc, m->counter);
+ LOG_MSG(this->xine, _("demux_ts: dropped input packet cc = %d expected = %d\n"), cc, m->counter);
}
}
@@ -490,13 +512,13 @@ static void demux_ts_buffer_pes(demux_ts *this, unsigned char *ts,
/* new PES packet */
if (ts[0] || ts[1] || ts[2] != 1) {
- fprintf(stderr, "PUS set but no PES header (corrupt stream?)\n");
+ LOG_MSG_STDERR(this->xine, _("PUS set but no PES header (corrupt stream?)\n"));
return;
}
- if (!demux_ts_parse_pes_header(m, ts, len)) {
+ if (!demux_ts_parse_pes_header(m, ts, len, this->xine)) {
m->broken_pes = 1;
- printf ("demux_ts: broken pes encountered\n");
+ LOG_MSG(this->xine, _("demux_ts: broken pes encountered\n"));
} else {
m->broken_pes = 0;
buf = m->fifo->buffer_pool_alloc(m->fifo);
@@ -585,7 +607,9 @@ static void demux_ts_parse_pmt(demux_ts *this,
uint32_t last_section_number;
uint32_t crc32;
uint32_t calc_crc32;
+#ifdef TS_LOG
uint32_t i;
+#endif
unsigned int programInfoLength;
unsigned int codedLength;
unsigned int mediaIndex;
@@ -597,7 +621,7 @@ static void demux_ts_parse_pmt(demux_ts *this,
* indicator set.
*/
if (!pus) {
- fprintf (stderr, "demux error! PMT without payload unit start\n");
+ LOG_MSG_STDERR(this->xine, _("demux error! PMT without payload unit start\n"));
return;
}
@@ -606,7 +630,7 @@ static void demux_ts_parse_pmt(demux_ts *this,
*/
pkt += pkt[4];
if (pkt - originalPkt > PKT_SIZE) {
- fprintf (stderr, "demux error! PMT with invalid pointer\n");
+ LOG_MSG_STDERR(this->xine, _("demux error! PMT with invalid pointer\n"));
return;
}
table_id = (unsigned int)pkt[5] ;
@@ -623,22 +647,22 @@ static void demux_ts_parse_pmt(demux_ts *this,
crc32 |= (uint32_t)pkt[7+section_length] ;
#ifdef TS_LOG
- xprintf (VERBOSE|DEMUX,"PMT table_id=%d\n",
- table_id);
- xprintf (VERBOSE|DEMUX,"\tsection_syntax_indicator=%d\n",
- section_syntax_indicator);
- xprintf (VERBOSE|DEMUX,"\tsection_length=%d\n",
- section_length);
- xprintf (VERBOSE|DEMUX,"\tprogram_number=0x%04x\n",
- program_number);
- xprintf (VERBOSE|DEMUX,"\tversion_number=%d\n",
- version_number);
- xprintf (VERBOSE|DEMUX,"\tcurrent_next_indicator=%d\n",
- current_next_indicator);
- xprintf (VERBOSE|DEMUX,"\tsection_number=%d\n",
- section_number);
- xprintf (VERBOSE|DEMUX,"\tlast_section_number=%d\n",
- last_section_number);
+ printf ("PMT table_id=%d\n",
+ table_id);
+ printf ("\tsection_syntax_indicator=%d\n",
+ section_syntax_indicator);
+ printf ("\tsection_length=%d\n",
+ section_length);
+ printf ("\tprogram_number=0x%04x\n",
+ program_number);
+ printf ("\tversion_number=%d\n",
+ version_number);
+ printf ("\tcurrent_next_indicator=%d\n",
+ current_next_indicator);
+ printf ("\tsection_number=%d\n",
+ section_number);
+ printf ("\tlast_section_number=%d\n",
+ last_section_number);
#endif
if (!(current_next_indicator)) {
@@ -648,12 +672,12 @@ static void demux_ts_parse_pmt(demux_ts *this,
return;
}
if (pkt - originalPkt > BODY_SIZE - 1 - 3 - (int)section_length) {
- fprintf (stderr, "demux error! PMT with invalid section length\n");
+ LOG_MSG_STDERR(this->xine, _("demux error! PMT with invalid section length\n"));
return;
}
if ((section_number) || (last_section_number)) {
- fprintf (stderr, "demux error! PMT with invalid section %02x of %02x\n",
- section_number, last_section_number);
+ LOG_MSG_STDERR(this->xine, _("demux error! PMT with invalid section %02x of %02x\n"),
+ section_number, last_section_number);
return;
}
@@ -662,8 +686,7 @@ static void demux_ts_parse_pmt(demux_ts *this,
*/
calc_crc32 = demux_ts_compute_crc32(this, pkt+5, section_length+3-4, 0xffffffff);
if (crc32 != calc_crc32) {
- printf("demux_ts: demux error! PMT with invalid CRC32: packet_crc32=0x%08x calc_crc32=0x%08x\n",
- crc32,calc_crc32);
+ LOG_MSG(this->xine, _("demux_ts: demux error! PMT with invalid CRC32: packet_crc32=0x%08x calc_crc32=0x%08x\n"), crc32,calc_crc32);
return;
}
/*
@@ -675,7 +698,7 @@ static void demux_ts_parse_pmt(demux_ts *this,
stream = &pkt[17] + programInfoLength;
codedLength = 13 + programInfoLength;
if (codedLength > section_length) {
- fprintf (stderr, "demux error! PMT with inconsistent progInfo length\n");
+ LOG_MSG_STDERR(this->xine, _("demux error! PMT with inconsistent progInfo length\n"));
return;
}
section_length -= codedLength;
@@ -691,7 +714,7 @@ static void demux_ts_parse_pmt(demux_ts *this,
streamInfoLength = (((unsigned int)stream[3] & 0xf) << 8) | stream[4];
codedLength = 5 + streamInfoLength;
if (codedLength > section_length) {
- fprintf (stderr, "demux error! PMT with inconsistent streamInfo length\n");
+ LOG_MSG_STDERR(this->xine, _("demux error! PMT with inconsistent streamInfo length\n"));
return;
}
@@ -704,7 +727,7 @@ static void demux_ts_parse_pmt(demux_ts *this,
case ISO_13818_VIDEO:
if (this->videoPid == INVALID_PID) {
#ifdef TS_LOG
- xprintf(VERBOSE|DEMUX, "PMT video pid 0x%04x\n", pid);
+ printf("PMT video pid 0x%04x\n", pid);
#endif
demux_ts_pes_new(this, mediaIndex, pid, this->fifoVideo);
}
@@ -715,7 +738,7 @@ static void demux_ts_parse_pmt(demux_ts *this,
case ISO_13818_AUDIO:
if (this->audioPid == INVALID_PID) {
#ifdef TS_LOG
- xprintf(VERBOSE|DEMUX, "PMT audio pid 0x%04x\n", pid);
+ printf("PMT audio pid 0x%04x\n", pid);
#endif
demux_ts_pes_new(this, mediaIndex, pid, this->fifoAudio);
}
@@ -725,21 +748,21 @@ static void demux_ts_parse_pmt(demux_ts *this,
case ISO_13818_PRIVATE:
#ifdef TS_LOG
for(i=0;i<20;i++) {
- xprintf(VERBOSE|DEMUX, "%02x ", stream[i]);
+ printf("%02x ", stream[i]);
}
- xprintf(VERBOSE|DEMUX, "\n");
+ printf("\n");
#endif
break;
case PRIVATE_A52:
#ifdef TS_LOG
for(i=0;i<20;i++) {
- xprintf(VERBOSE|DEMUX, "%02x ", stream[i]);
+ printf("%02x ", stream[i]);
}
- xprintf(VERBOSE|DEMUX, "\n");
+ printf("\n");
#endif
if (this->audioPid == INVALID_PID) {
#ifdef TS_LOG
- xprintf(VERBOSE|DEMUX, "PMT audio pid 0x%04x\n", pid);
+ printf("PMT audio pid 0x%04x\n", pid);
#endif
demux_ts_pes_new(this, mediaIndex, pid, this->fifoAudio);
}
@@ -748,12 +771,12 @@ static void demux_ts_parse_pmt(demux_ts *this,
break;
default:
#ifdef TS_LOG
- xprintf(VERBOSE|DEMUX, "PMT stream_type unknown 0x%02x pid 0x%04x\n", stream[0], pid);
+ printf("PMT stream_type unknown 0x%02x pid 0x%04x\n", stream[0], pid);
for(i=0;i<20;i++) {
- xprintf(VERBOSE|DEMUX, "%02x ", stream[i]);
+ printf("%02x ", stream[i]);
}
- xprintf(VERBOSE|DEMUX, "\n");
+ printf("\n");
#endif
break;
@@ -772,16 +795,16 @@ static void demux_ts_parse_pmt(demux_ts *this,
#ifdef TS_LOG
if (this->pcrPid == INVALID_PID) {
- xprintf(VERBOSE|DEMUX, "PMT pcr pid 0x%04x\n", pid);
+ printf("PMT pcr pid 0x%04x\n", pid);
} else {
- xprintf(VERBOSE|DEMUX, "PMT pcr pid changed 0x%04x\n", pid);
+ printf("PMT pcr pid changed 0x%04x\n", pid);
}
#endif
this->pcrPid = pid;
}
}
-void correct_for_sync(demux_ts *this,uint8_t *buf) {
+void correct_for_sync(demux_ts *this, uint8_t *buf) {
int32_t n, read_length;
if((buf[0] == SYNC_BYTE) && (buf[PKT_SIZE] == SYNC_BYTE) &&
(buf[PKT_SIZE*2] == SYNC_BYTE) && (buf[PKT_SIZE*3] == SYNC_BYTE)) {
@@ -796,7 +819,7 @@ void correct_for_sync(demux_ts *this,uint8_t *buf) {
return;
}
}
- printf("RE-Sync failed\n"); /* Sync up here */
+ LOG_MSG(this->xine, _("RE-Sync failed\n")); /* Sync up here */
return;
}
@@ -852,19 +875,19 @@ static uint32_t demux_ts_adaptation_field_parse( uint8_t *data, uint32_t adaptat
adaptation_field_extension_flag = (data[0] & 0x01);
#ifdef TS_LOG
- xprintf(VERBOSE|DEMUX, "ADAPTATION FIELD length=%d\n",
- adaptation_field_length);
+ printf("ADAPTATION FIELD length=%d\n",
+ adaptation_field_length);
if(discontinuity_indicator) {
- xprintf(VERBOSE|DEMUX, "\tDiscontinuity indicator=%d\n",
- discontinuity_indicator);
+ printf("\tDiscontinuity indicator=%d\n",
+ discontinuity_indicator);
}
if(random_access_indicator) {
- xprintf(VERBOSE|DEMUX, "\tRandom_access indicator=%d\n",
- random_access_indicator);
+ printf("\tRandom_access indicator=%d\n",
+ random_access_indicator);
}
if(elementary_stream_priority_indicator) {
- xprintf(VERBOSE|DEMUX, "\tElementary_stream_priority_indicator=%d\n",
- elementary_stream_priority_indicator);
+ printf("\tElementary_stream_priority_indicator=%d\n",
+ elementary_stream_priority_indicator);
}
#endif
if(PCR_flag) {
@@ -875,8 +898,8 @@ static uint32_t demux_ts_adaptation_field_parse( uint8_t *data, uint32_t adaptat
PCR |= (data[offset+4] >> 7) & 0x01;
EPCR = ((data[offset+4] & 0x1) << 8) | data[offset+5];
#ifdef TS_LOG
- xprintf(VERBOSE|DEMUX, "\tPCR=%u, EPCR=%u\n",
- PCR,EPCR);
+ printf("\tPCR=%u, EPCR=%u\n",
+ PCR,EPCR);
#endif
offset+=6;
}
@@ -888,23 +911,23 @@ static uint32_t demux_ts_adaptation_field_parse( uint8_t *data, uint32_t adaptat
OPCR |= (data[offset+4] >> 7) & 0x01;
EOPCR = ((data[offset+4] & 0x1) << 8) | data[offset+5];
#ifdef TS_LOG
- xprintf(VERBOSE|DEMUX, "\tOPCR=%u,EOPCR=%u\n",
- OPCR,EOPCR);
+ printf("\tOPCR=%u,EOPCR=%u\n",
+ OPCR,EOPCR);
#endif
offset+=6;
}
#ifdef TS_LOG
if(slicing_point_flag) {
- xprintf(VERBOSE|DEMUX, "\tslicing_point_flag=%d\n",
- slicing_point_flag);
+ printf("\tslicing_point_flag=%d\n",
+ slicing_point_flag);
}
if(transport_private_data_flag) {
- xprintf(VERBOSE|DEMUX, "\ttransport_private_data_flag=%d\n",
- transport_private_data_flag);
+ printf("\ttransport_private_data_flag=%d\n",
+ transport_private_data_flag);
}
if(adaptation_field_extension_flag) {
- xprintf(VERBOSE|DEMUX, "\tadaptation_field_extension_flag=%d\n",
- adaptation_field_extension_flag);
+ printf("\tadaptation_field_extension_flag=%d\n",
+ adaptation_field_extension_flag);
}
#endif
return PCR;
@@ -944,11 +967,11 @@ static void demux_ts_parse_packet (demux_ts *this) {
* Discard packets that are obviously bad.
*/
if (sync_byte != 0x47) {
- fprintf (stderr, "demux error! invalid ts sync byte %02x\n",originalPkt[0]);
+ LOG_MSG_STDERR(this->xine, _("demux error! invalid ts sync byte %02x\n"), originalPkt[0]);
return;
}
if (transport_error_indicator) {
- fprintf (stderr, "demux error! transport error\n");
+ LOG_MSG_STDERR(this->xine, _("demux error! transport error\n"));
return;
}
@@ -972,7 +995,7 @@ static void demux_ts_parse_packet (demux_ts *this) {
if (data_len > PKT_SIZE) {
- printf ("demux_ts: demux error! invalid payload size %d\n",data_len);
+ LOG_MSG(this->xine, _("demux_ts: demux error! invalid payload size %d\n"), data_len);
} else {
@@ -981,14 +1004,14 @@ static void demux_ts_parse_packet (demux_ts *this) {
*/
if (pid == this->videoPid ) {
#ifdef TS_LOG
- xprintf(VERBOSE|DEMUX, "Video pid = 0x%04x\n",pid);
+ printf("Video pid = 0x%04x\n",pid);
#endif
demux_ts_buffer_pes (this, originalPkt+data_offset, this->videoMedia,
payload_unit_start_indicator, continuity_counter, data_len);
return;
} else if (pid == this->audioPid) {
#ifdef TS_LOG
- xprintf(VERBOSE|DEMUX, "Audio pid = 0x%04x\n",pid);
+ printf("Audio pid = 0x%04x\n",pid);
#endif
demux_ts_buffer_pes (this, originalPkt+data_offset, this->audioMedia,
payload_unit_start_indicator, continuity_counter, data_len);
@@ -998,7 +1021,7 @@ static void demux_ts_parse_packet (demux_ts *this) {
return;
} else if (pid == 0x1fff) {
#ifdef TS_LOG
- xprintf(VERBOSE|DEMUX,"Null Packet\n");
+ printf("Null Packet\n");
#endif
return;
}
@@ -1007,9 +1030,9 @@ static void demux_ts_parse_packet (demux_ts *this) {
while ((this->program_number[program_count] != INVALID_PROGRAM) ) {
if ( pid == this->pmt_pid[program_count] ) {
#ifdef TS_LOG
- xprintf(VERBOSE|DEMUX,"PMT prog 0x%04x pid 0x%04x\n",
- this->program_number[program_count],
- this->pmt_pid[program_count]);
+ printf("PMT prog 0x%04x pid 0x%04x\n",
+ this->program_number[program_count],
+ this->pmt_pid[program_count]);
#endif
demux_ts_parse_pmt (this, originalPkt, originalPkt+data_offset-4, payload_unit_start_indicator);
return;
@@ -1034,7 +1057,7 @@ static void *demux_ts_loop(void *gen_this) {
} while (this->status == DEMUX_OK) ;
#ifdef TS_LOG
- xprintf(VERBOSE|DEMUX, "demux loop finished (status: %d)\n", this->status);
+ printf("demux loop finished (status: %d)\n", this->status);
#endif
this->status = DEMUX_FINISHED;
@@ -1115,7 +1138,7 @@ static int demux_ts_open(demux_plugin_t *this_gen, input_plugin_t *input,
media = strstr(mrl, "://");
if (media) {
- fprintf (stderr, "demux %u ts_open! \n", __LINE__);
+ LOG_MSG_STDERR(this->xine, _("demux %u ts_open!\n"), __LINE__);
while((m = xine_strsep(&valid_mrls, ",")) != NULL) {
while(*m == ' ' || *m == '\t') m++;
@@ -1137,7 +1160,7 @@ static int demux_ts_open(demux_plugin_t *this_gen, input_plugin_t *input,
ending = strrchr(mrl, '.');
if (ending) {
#ifdef TS_LOG
- printf("demux_ts_open: ending %s of %s\n", ending, mrl);
+ LOG_MSG(this->xine, "demux_ts_open: ending %s of %s\n", ending, mrl);
#endif
xine_strdupa(valid_ends, (this->config->register_string(this->config,
@@ -1206,7 +1229,7 @@ static void demux_ts_start(demux_plugin_t *this_gen,
* Now start demuxing.
*/
if ((err = pthread_create(&this->thread, NULL, demux_ts_loop, this)) != 0) {
- fprintf(stderr, "demux_ts: can't create new thread (%s)\n", strerror(err));
+ LOG_MSG_STDERR(this->xine, _("demux_ts: can't create new thread (%s)\n"), strerror(err));
exit (1);
}
}
@@ -1217,7 +1240,7 @@ static void demux_ts_stop(demux_plugin_t *this_gen)
buf_element_t *buf;
void *p;
- printf ("demux_ts: stop...\n");
+ LOG_MSG(this->xine, _("demux_ts: stop...\n"));
if (this->status != DEMUX_OK) {
@@ -1263,18 +1286,20 @@ demux_plugin_t *init_demuxer_plugin(int iface, xine_t *xine) {
int i;
if (iface != 6) {
- printf("demux_ts: plugin doesn't support plugin API version %d.\n"
- "demux_ts: this means there's a version mismatch between xine and this "
- "demux_ts: demuxer plugin.\nInstalling current demux plugins should help.\n",
- iface);
+ LOG_MSG(xine,
+ _("demux_ts: plugin doesn't support plugin API version %d.\n"
+ " this means there's a version mismatch between xine and this "
+ " demuxer plugin.\nInstalling current demux plugins should help.\n"),
+ iface);
return NULL;
}
-
+
/*
* Initialise the generic plugin.
*/
this = xine_xmalloc(sizeof(*this));
this->config = xine->config;
+ this->xine = xine;
(void*) this->config->register_string(this->config, "mrl.mrls_ts", VALID_MRLS,
"valid mrls for ts demuxer",
diff --git a/src/input/input_cda.c b/src/input/input_cda.c
index e11413ea4..1ac7de2d4 100644
--- a/src/input/input_cda.c
+++ b/src/input/input_cda.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: input_cda.c,v 1.12 2001/12/14 21:03:03 f1rmb Exp $
+ * $Id: input_cda.c,v 1.13 2001/12/27 14:30:30 f1rmb Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -69,6 +69,8 @@
#include "xineutils.h"
#include "input_plugin.h"
+extern int errno;
+
/*
#define DEBUG_DISC
#define DEBUG_POS
@@ -83,6 +85,26 @@
#define _LEAVE_FUNC()
#endif
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
#if defined(__sun)
#define CDROM "/vol/dev/aliases/cdrom0"
#else
@@ -115,6 +137,7 @@ typedef struct {
} trackinfo_t;
typedef struct {
+ xine_t *xine;
int fd;
char *device_name;
int cur_track;
@@ -435,7 +458,7 @@ static int _cda_load_cached_cddb_infos(cda_input_plugin_t *this) {
sprintf(cdir, "%s/%s", cdir, discid);
if((fd = fopen(cdir, "r")) == NULL) {
- fprintf(stderr, "input_cda: fopen(%s) failed: %s\n", cdir, strerror(errno));
+ LOG_MSG_STDERR(this->xine, _("input_cda: fopen(%s) failed: %s\n"), cdir, strerror(errno));
closedir(dir);
return 0;
}
@@ -493,7 +516,7 @@ static void _cda_save_cached_cddb_infos(cda_input_plugin_t *this, char *filecont
sprintf(cfile, "%s/%08lx", this->cddb.cache_dir, this->cda->disc_id);
if((fd = fopen(cfile, "w")) == NULL) {
- fprintf(stderr, "input_cda: fopen(%s) failed: %s\n", cfile, strerror(errno));
+ LOG_MSG(this->xine, _("input_cda: fopen(%s) failed: %s\n"), cfile, strerror(errno));
return;
}
else {
@@ -583,12 +606,12 @@ static void _cda_cddb_retrieve(cda_input_plugin_t *this) {
this->cddb.fd = _cda_cddb_socket_open(this);
if(this->cddb.fd >= 0) {
- printf("input_cda: server '%s:%d' successfuly connected.\n",
+ LOG_MSG(this->xine, _("input_cda: server '%s:%d' successfuly connected.\n"),
this->cddb.server, this->cddb.port);
}
else {
- printf("input_cda: opening server '%s:%d' failed: %s\n",
+ LOG_MSG(this->xine, _("input_cda: opening server '%s:%d' failed: %s\n"),
this->cddb.server, this->cddb.port, strerror(errno));
this->cda->have_cddb_info = 0;
return;
@@ -757,7 +780,7 @@ static int _cda_is_cd_changed(cdainfo_t *cda) {
return -1;
if((err = ioctl(cda->fd, CDROM_MEDIA_CHANGED, cd_changed)) < 0) {
- fprintf(stderr, "input_cda: ioctl(CDROM_MEDIA_CHANGED) failed: %s.\n", strerror(errno));
+ LOG_MSG_STDERR(this->xine, _("input_cda: ioctl(CDROM_MEDIA_CHANGED) failed: %s.\n"), strerror(errno));
return -1;
}
@@ -824,7 +847,7 @@ static int _cda_get_status_cd(cdainfo_t *cda) {
if(ioctl(cda->fd, CDROMSUBCHNL, &sc) < 0) {
#endif
- fprintf(stderr, "input_cda: ioctl(CDROMSUBCHNL) failed: %s.\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDROMSUBCHNL) failed: %s.\n"), strerror(errno));
return 0;
}
@@ -959,25 +982,25 @@ static int _cda_play_chunk_cd(cdainfo_t *cda, int start, int end) {
#ifdef CDIOCSTART
if(ioctl(cda->fd, CDIOCSTART) < 0) {
- fprintf(stderr, "input_cda: ioctl(CDIOCSTART) failed: %s.\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDIOCSTART) failed: %s.\n"), strerror(errno));
return 0;
}
#endif
#ifdef CDROMSTART
if (ioctl(cda->fd, CDROMSTART)) {
- fprintf(stderr, "input_cda: ioctl(CDROMSTART) failed: %s.\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDROMSTART) failed: %s.\n"), strerror(errno));
return 0;
}
#endif
#ifdef CDIOCPLAYMSF
if(ioctl(cda->fd, CDIOCPLAYMSF, (char *)&cdmsf) < 0) {
- fprintf(stderr, "input_cda: ioctl(CDIOCPLAYMSF) failed: %s.\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDIOCPLAYMSF) failed: %s.\n"), strerror(errno));
return 0;
}
#endif
#ifdef CDROMPLAYMSF
if(ioctl(cda->fd, CDROMPLAYMSF, &msf)) {
- fprintf(stderr, "input_cda: ioctl(CDROMPLAYMSF) failed: %s.\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDROMPLAYMSF) failed: %s.\n"), strerror(errno));
return 0;
}
#endif
@@ -998,10 +1021,10 @@ static int _cda_open_cd(cdainfo_t *cda) {
if((cda->fd = open(cda->device_name, O_RDONLY)) < 0) {
#endif
if(errno == EACCES) {
- fprintf(stderr, "input_cda: No rights to open %s.\n", cda->device_name);
+ LOG_MSG_STDERR(cda->xine, _("input_cda: No rights to open %s.\n"), cda->device_name);
}
else if(errno != ENXIO) {
- fprintf(stderr, "input_cda: open(%s) failed: %s.\n", cda->device_name, strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: open(%s) failed: %s.\n"), cda->device_name, strerror(errno));
}
return 0;
@@ -1095,33 +1118,33 @@ static int _cda_eject_cd(cdainfo_t *cda) {
switch(status) {
case CDS_TRAY_OPEN:
if((err = ioctl(cda->fd, CDROMCLOSETRAY)) != 0) {
- fprintf(stderr, "input_cda: ioctl(CDROMCLOSETRAY) failed: %s\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDROMCLOSETRAY) failed: %s\n"), strerror(errno));
}
break;
case CDS_DISC_OK:
if((err = ioctl(cda->fd, CDROMEJECT)) != 0) {
- fprintf(stderr, "input_cda: ioctl(CDROMEJECT) failed: %s\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDROMEJECT) failed: %s\n"), strerror(errno));
}
break;
}
}
else {
- fprintf(stderr, "input_cda: ioctl(CDROM_DRIVE_STATUS) failed: %s\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDROM_DRIVE_STATUS) failed: %s\n"), strerror(errno));
_cda_close_cd(cda);
return 0;
}
#elif defined (__FreeBSD__)
if(ioctl(cda->fd, CDIOCALLOW) == -1) {
- fprintf(stderr, "input_cda: ioctl(CDROMALLOW) failed: %s\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDROMALLOW) failed: %s\n"), strerror(errno));
}
else {
if(ioctl(cda->fd, CDIOCEJECT) == -1) {
- fprintf(stderr, "input_cda: ioctl(CDROMEJECT) failed: %s\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDROMEJECT) failed: %s\n"), strerror(errno));
}
}
#elif defined (__sun)
if((err = ioctl(cda->fd, CDROMEJECT)) != 0) {
- fprintf(stderr, "input_cda: ioctl(CDROMEJECT) failed: %s\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDROMEJECT) failed: %s\n"), strerror(errno));
}
#endif
@@ -1152,7 +1175,7 @@ static int _cda_read_toc_cd(cdainfo_t *cda) {
#ifdef CDIOREADTOCHEADER
if(ioctl(cda->fd, CDIOREADTOCHEADER, (char *)&cdth) < 0) {
- fprintf(stderr, "input_cda: ioctl(CDIOREADTOCHEADER) failed: %s.\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDIOREADTOCHEADER) failed: %s.\n"), strerror(errno));
return 0;
}
@@ -1160,7 +1183,7 @@ static int _cda_read_toc_cd(cdainfo_t *cda) {
#endif
#ifdef CDROMREADTOCHDR
if(ioctl(cda->fd, CDROMREADTOCHDR, &hdr) < 0) {
- fprintf(stderr, "input_cda: ioctl(CDROMREADTOCHDR) failed: %s.\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDROMREADTOCHDR) failed: %s.\n"), strerror(errno));
return 0;
}
@@ -1197,7 +1220,7 @@ static int _cda_read_toc_cd(cdainfo_t *cda) {
cdte.data_len = sizeof(toc_buffer);
if(ioctl(cda->fd, CDIOREADTOCENTRYS, (char *)&cdte) < 0) {
- fprintf(stderr, "input_cda: ioctl(CDIOREADTOCENTRYS) failed: %s.\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDIOREADTOCENTRYS) failed: %s.\n"), strerror(errno));
return 0;
}
@@ -1220,7 +1243,7 @@ static int _cda_read_toc_cd(cdainfo_t *cda) {
entry.cdte_format = CDROM_MSF;
if(ioctl(cda->fd, CDROMREADTOCENTRY, &entry)) {
- fprintf(stderr, "input_cda: ioctl(CDROMREADTOCENTRY) failed: %s.\n", strerror(errno));
+ LOG_MSG_STDERR(cda->xine, _("input_cda: ioctl(CDROMREADTOCENTRY) failed: %s.\n"), strerror(errno));
return 0;
}
cda->track[i].track = i + 1;
@@ -1402,13 +1425,13 @@ static int cda_plugin_open (input_plugin_t *this_gen, char *mrl) {
filename = (char *) &mrl[6];
if(sscanf(filename, "%d", &this->cda->cur_track) != 1) {
- fprintf(stderr, "input_cda: malformed MRL. Use cda://<track #>\n");
+ LOG_MSG_STDERR(this->xine, _("input_cda: malformed MRL. Use cda://<track #>\n"));
_cda_free_cda(this->cda);
return 0;
}
if((!this->cda->cur_track) || (this->cda->cur_track > this->cda->num_tracks)) {
- fprintf(stderr, "input_cda: invalid track %d (valid range: 1 .. %d)\n",
+ LOG_MSG_STDERR(this->xine, _("input_cda: invalid track %d (valid range: 1 .. %d)\n"),
this->cda->cur_track, this->cda->num_tracks - 1);
_cda_free_cda(this->cda);
return 0;
@@ -1491,7 +1514,7 @@ static off_t cda_plugin_seek (input_plugin_t *this_gen, off_t offset, int origin
break;
default:
- fprintf (stderr, "input_cda: error seek to origin %d not implemented!\n",
+ LOG_MSG_STDERR(this->xine, _("input_cda: error seek to origin %d not implemented!\n"),
origin);
return 0;
}
@@ -1604,7 +1627,7 @@ static void cda_plugin_stop (input_plugin_t *this_gen) {
static char *cda_plugin_get_description (input_plugin_t *this_gen) {
_ENTER_FUNC();
_LEAVE_FUNC();
- return "cd audio plugin as shipped with xine";
+ return _("cd audio plugin as shipped with xine");
}
/*
@@ -1778,11 +1801,12 @@ input_plugin_t *init_input_plugin (int iface, xine_t *xine) {
_ENTER_FUNC();
if (iface != 5) {
- printf("cda input plugin doesn't support plugin API version %d.\n"
- "PLUGIN DISABLED.\n"
- "This means there's a version mismatch between xine and this input"
- "plugin.\nInstalling current input plugins should help.\n",
- iface);
+ LOG_MSG(xine,
+ _("cda input plugin doesn't support plugin API version %d.\n"
+ "PLUGIN DISABLED.\n"
+ "This means there's a version mismatch between xine and this input"
+ "plugin.\nInstalling current input plugins should help.\n"),
+ iface);
return NULL;
}
@@ -1819,6 +1843,7 @@ input_plugin_t *init_input_plugin (int iface, xine_t *xine) {
this->mrl = NULL;
this->cda = (cdainfo_t *) xine_xmalloc(sizeof(cdainfo_t));
+ this->cda->xine = xine;
this->cda->cur_track = -1;
this->cda->cur_pos = -1;
diff --git a/src/input/input_dvd.c b/src/input/input_dvd.c
index ddd20e73b..2edd6992f 100644
--- a/src/input/input_dvd.c
+++ b/src/input/input_dvd.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: input_dvd.c,v 1.40 2001/12/16 13:38:42 miguelfreitas Exp $
+ * $Id: input_dvd.c,v 1.41 2001/12/27 14:30:30 f1rmb Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -52,6 +52,28 @@
#include "dvd_udf.h"
#include "read_cache.h"
+extern int errno;
+
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
#if defined(__sun)
#define RDVD "/vol/dev/aliases/cdrom0"
#define DVD RDVD
@@ -63,6 +85,8 @@
typedef struct {
input_plugin_t input_plugin;
+
+ xine_t *xine;
char *mrl;
config_values_t *config;
@@ -118,7 +142,7 @@ static int openDrive (dvd_input_plugin_t *this) {
this->dvd_fd = open(this->device, O_RDONLY /* | O_NONBLOCK */ );
if (this->dvd_fd < 0) {
- printf ("input_dvd: unable to open dvd drive (%s): %s\n",
+ LOG_MSG(this->xine, _("input_dvd: unable to open dvd drive (%s): %s\n"),
this->device, strerror(errno));
return -1;
}
@@ -215,11 +239,11 @@ dvd_read_copyright(int fd, dvd_struct *s)
memset(buf, 0, sizeof(buf));
if (ioctl(fd, USCSICMD, &sc)) {
- perror("USCSICMD dvd_read_copyright");
+ LOG_MSG(this->xine, _("USCSICMD dvd_read_copyright: %s"), strerror(errno));
return -1;
}
if (sc.uscsi_status) {
- fprintf(stderr, "bad status: READ DVD STRUCTURE (copyright)\n");
+ LOG_MSG_STDERR(this->xine, _("bad status: READ DVD STRUCTURE (copyright)\n"));
return -1;
}
@@ -273,7 +297,7 @@ static int openDVDFile (dvd_input_plugin_t *this,
int encrypted=0;
if (openDrive(this) < 0) {
- printf ("input_dvd: cannot open dvd drive >%s<\n", this->device);
+ LOG_MSG(this->xine, _("input_dvd: cannot open dvd drive >%s<\n"), this->device);
return 0;
}
@@ -284,7 +308,7 @@ static int openDVDFile (dvd_input_plugin_t *this,
dvd.copyright.type = DVD_STRUCT_COPYRIGHT;
dvd.copyright.layer_num = 0;
if (ioctl (this->dvd_fd, DVD_READ_STRUCT, &dvd) < 0) {
- printf ("input_dvd: Could not read Copyright Structure\n");
+ LOG_MSG(this->xine, _("input_dvd: Could not read Copyright Structure\n"));
return 0;
}
encrypted = (dvd.copyright.cpst != 0) ;
@@ -297,7 +321,7 @@ static int openDVDFile (dvd_input_plugin_t *this,
dvd.layer_num = 0;
if (ioctl(this->dvd_fd, DVDIOCREADSTRUCTURE, &dvd) < 0) {
- printf ("input_dvd: Could not read Copyright Structure\n");
+ LOG_MSG(this->xine, _("input_dvd: Could not read Copyright Structure\n"));
return 0;
}
@@ -310,23 +334,24 @@ static int openDVDFile (dvd_input_plugin_t *this,
dvd.copyright.type = DVD_STRUCT_COPYRIGHT;
dvd.copyright.layer_num = 0;
if (dvd_read_copyright(this->raw_fd, &dvd) < 0)
- printf ("input_dvd: Could not read Copyright Structure.\n"
- " Assuming disk is not encrypted.\n");
+ LOG_MSG(this->xine, _("input_dvd: Could not read Copyright Structure.\n"
+ " Assuming disk is not encrypted.\n"));
else
encrypted = (dvd.copyright.cpst != 0);
}
#endif
if( encrypted ) {
- printf("\ninput_dvd: Sorry, xine doesn't play encrypted DVDs. The legal status of CSS\n"
- " decryption is unclear and we will not provide such code.\n\n");
+ LOG_MSG(this->xine,
+ _("\ninput_dvd: Sorry, xine doesn't play encrypted DVDs. The legal status of CSS\n"
+ " decryption is unclear and we will not provide such code.\n\n"));
return 0;
}
snprintf (str, sizeof(str), "/VIDEO_TS/%s", filename);
if (!(lbnum = UDFFindFile(this->dvd_fd, str, size))) {
- printf ("input_dvd: cannot open file >%s<\n", filename);
+ LOG_MSG(this->xine, _("input_dvd: cannot open file >%s<\n"), filename);
closeDrive (this);
@@ -371,7 +396,7 @@ static int dvd_plugin_open (input_plugin_t *this_gen, char *mrl) {
this->file_lbcur = this->file_lbstart;
if (!this->file_lbstart) {
- printf ("input_dvd: Unable to find >%s< on dvd.\n", filename);
+ LOG_MSG(this->xine, _("input_dvd: Unable to find >%s< on dvd.\n"), filename);
return 0;
}
@@ -406,7 +431,7 @@ static off_t dvd_plugin_read (input_plugin_t *this_gen,
if (nlen != DVD_VIDEO_LB_LEN) {
- printf ("input_dvd: error read: %Ld bytes is not a sector!\n",
+ LOG_MSG(this->xine, _("input_dvd: error read: %Ld bytes is not a sector!\n"),
nlen);
return 0;
@@ -422,12 +447,14 @@ static off_t dvd_plugin_read (input_plugin_t *this_gen,
this->file_size_left -= DVD_VIDEO_LB_LEN;
return DVD_VIDEO_LB_LEN;
- } else if (bytes_read < 0)
- printf ("input_dvd: read error in input_dvd plugin (%s)\n",
+ } else if (bytes_read < 0) {
+ LOG_MSG(this->xine, _("input_dvd: read error in input_dvd plugin (%s)\n"),
strerror (errno));
- else
- printf ("input_dvd: short read in input_dvd (%d != %d)\n",
+ }
+ else {
+ LOG_MSG(this->xine, _("input_dvd: short read in input_dvd (%d != %d)\n"),
bytes_read, DVD_VIDEO_LB_LEN);
+ }
return 0;
}
@@ -443,8 +470,9 @@ static buf_element_t *dvd_plugin_read_block (input_plugin_t *this_gen,
* at STAGE_BY_CONTENT probe stage
*/
if(nlen != DVD_VIDEO_LB_LEN)
- printf ("input_dvd: error in input_dvd plugin read: %Ld bytes "
- "is not a sector!\n", nlen);
+ LOG_MSG(this->xine,
+ _("input_dvd: error in input_dvd plugin read: %Ld bytes "
+ "is not a sector!\n"), nlen);
return NULL;
}
@@ -455,7 +483,7 @@ static buf_element_t *dvd_plugin_read_block (input_plugin_t *this_gen,
buf->type = BUF_DEMUX_BLOCK;
} else {
- printf ("input_dvd: read error in input_dvd plugin\n");
+ LOG_MSG(this->xine, _("input_dvd: read error in input_dvd plugin\n"));
}
@@ -488,7 +516,7 @@ static off_t dvd_plugin_seek (input_plugin_t *this_gen, off_t offset, int origin
break;
default:
- printf ("input_dvd: seek: %d is an unknown origin\n", origin);
+ LOG_MSG(this->xine, _("input_dvd: seek: %d is an unknown origin\n"), origin);
}
return lseek (this->raw_fd,
@@ -529,19 +557,19 @@ static int dvd_plugin_eject_media (input_plugin_t *this_gen) {
switch(status) {
case CDS_TRAY_OPEN:
if((ret = ioctl(fd, CDROMCLOSETRAY)) != 0) {
- printf ("input_dvd: CDROMCLOSETRAY failed: %s\n",
+ LOG_MSG(this->xine, _("input_dvd: CDROMCLOSETRAY failed: %s\n"),
strerror(errno));
}
break;
case CDS_DISC_OK:
if((ret = ioctl(fd, CDROMEJECT)) != 0) {
- printf ("input_dvd: CDROMEJECT failed: %s\n", strerror(errno));
+ LOG_MSG(this->xine, _("input_dvd: CDROMEJECT failed: %s\n"), strerror(errno));
}
break;
}
}
else {
- printf ("input_dvd: CDROM_DRIVE_STATUS failed: %s\n",
+ LOG_MSG(this->xine, _("input_dvd: CDROM_DRIVE_STATUS failed: %s\n"),
strerror(errno));
close(fd);
return 0;
@@ -552,15 +580,15 @@ static int dvd_plugin_eject_media (input_plugin_t *this_gen) {
# if defined (__sun)
status = 0;
if ((ret = ioctl(fd, CDROMEJECT)) != 0) {
- printf("input_dvd: CDROMEJECT failed: %s\n", strerror(errno));
+ LOG_MSG(this->xine, _("input_dvd: CDROMEJECT failed: %s\n"), strerror(errno));
}
# else
if (ioctl(fd, CDIOCALLOW) == -1) {
- perror("ioctl(cdromallow)");
+ LOG_MSG(this->xine, _("ioctl(cdromallow): %s"), strerror(errno));
} else {
if (ioctl(fd, CDIOCEJECT) == -1) {
- perror("ioctl(cdromeject)");
+ LOG_MSG(this->xine, _("ioctl(cdromeject): %s"), strerror(errno));
}
}
# endif
@@ -587,7 +615,7 @@ static void dvd_plugin_stop (input_plugin_t *this_gen) {
static char *dvd_plugin_get_description (input_plugin_t *this_gen) {
- return "dvd device input plugin as shipped with xine";
+ return _("dvd device input plugin as shipped with xine");
}
@@ -661,7 +689,7 @@ static mrl_t **dvd_plugin_get_dir (input_plugin_t *this_gen,
}
else {
- printf ("input_dvd: unable to open dvd drive (%s): %s\n",
+ LOG_MSG(this->xine, _("input_dvd: unable to open dvd drive (%s): %s\n"),
this->device, strerror(errno));
return NULL;
}
@@ -721,7 +749,7 @@ static char **dvd_plugin_get_autoplay_list (input_plugin_t *this_gen,
close (fd);
} else {
- printf ("input_dvd: unable to open dvd drive (%s): %s\n",
+ LOG_MSG(this->xine, _("input_dvd: unable to open dvd drive (%s): %s\n"),
this->device, strerror(errno));
*nFiles = 0;
return NULL;
@@ -766,16 +794,18 @@ input_plugin_t *init_input_plugin (int iface, xine_t *xine) {
int i;
if (iface != 5) {
- printf("dvd input plugin doesn't support plugin API version %d.\n"
- "PLUGIN DISABLED.\n"
- "This means there's a version mismatch between xine and this input"
- "plugin.\nInstalling current input plugins should help.\n",
- iface);
+ LOG_MSG(xine,
+ _("dvd input plugin doesn't support plugin API version %d.\n"
+ "PLUGIN DISABLED.\n"
+ "This means there's a version mismatch between xine and this input"
+ "plugin.\nInstalling current input plugins should help.\n"),
+ iface);
return NULL;
}
this = (dvd_input_plugin_t *) xine_xmalloc (sizeof (dvd_input_plugin_t));
config = xine->config;
+ this->xine = xine;
for (i = 0; i < MAX_DIR_ENTRIES; i++) {
this->filelist[i] = (char *) xine_xmalloc(sizeof(char *) * 256);
diff --git a/src/input/input_file.c b/src/input/input_file.c
index 2003cd546..d06833df0 100644
--- a/src/input/input_file.c
+++ b/src/input/input_file.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: input_file.c,v 1.35 2001/12/14 21:03:03 f1rmb Exp $
+ * $Id: input_file.c,v 1.36 2001/12/27 14:30:30 f1rmb Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -43,6 +43,26 @@ extern int errno;
#define MAXFILES 65535
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
#ifndef S_ISLNK
#define S_ISLNK(mode) 0
#endif
@@ -67,6 +87,8 @@ extern int errno;
typedef struct {
input_plugin_t input_plugin;
+
+ xine_t *xine;
int fh;
int show_hidden_files;
@@ -175,7 +197,7 @@ static int _sortfiles_default(const mrl_t *s1, const mrl_t *s2) {
/*
* Return the type (OR'ed) of the given file *fully named*
*/
-static uint32_t get_file_type(char *filepathname, char *origin) {
+static uint32_t get_file_type(char *filepathname, char *origin, xine_t *xine) {
struct stat pstat;
int mode;
uint32_t file_type = 0;
@@ -184,7 +206,7 @@ static uint32_t get_file_type(char *filepathname, char *origin) {
if((lstat(filepathname, &pstat)) < 0) {
sprintf(buf, "%s/%s", origin, filepathname);
if((lstat(buf, &pstat)) < 0) {
- printf("lstat failed for %s{%s}\n", filepathname, origin);
+ LOG_MSG(xine, _("lstat failed for %s{%s}\n"), filepathname, origin);
file_type |= mrl_unknown;
return file_type;
}
@@ -267,7 +289,7 @@ static int file_plugin_open (input_plugin_t *this_gen, char *mrl) {
*subtitle = 0;
subtitle++;
- printf ("input_file: trying to open subtitle file '%s'\n",
+ LOG_MSG(this->xine, _("input_file: trying to open subtitle file '%s'\n"),
subtitle);
this->sub = fopen (subtitle, "r");
@@ -325,7 +347,7 @@ static buf_element_t *file_plugin_read_block (input_plugin_t *this_gen, fifo_buf
num_bytes = read (this->fh, buf->mem + total_bytes, todo-total_bytes);
if (num_bytes <= 0) {
if (num_bytes < 0)
- fprintf (stderr, "input_file: read error (%s)\n", strerror (errno));
+ LOG_MSG_STDERR(this->xine, _("input_file: read error (%s)\n"), strerror(errno));
buf->free_buffer (buf);
buf = NULL;
break;
@@ -469,7 +491,7 @@ static mrl_t **file_plugin_get_dir (input_plugin_t *this_gen,
sprintf(dir_files[num_dir_files].mrl, "%s%s",
current_dir_slashed, pdirent->d_name);
dir_files[num_dir_files].link = NULL;
- dir_files[num_dir_files].type = get_file_type(fullfilename, current_dir);
+ dir_files[num_dir_files].type = get_file_type(fullfilename, current_dir, this->xine);
dir_files[num_dir_files].size = get_file_size(fullfilename, current_dir);
/* The file is a link, follow it */
@@ -481,13 +503,13 @@ static mrl_t **file_plugin_get_dir (input_plugin_t *this_gen,
linksize = readlink(fullfilename, linkbuf, XINE_PATH_MAX + XINE_NAME_MAX);
if(linksize < 0) {
- fprintf(stderr, "%s(%d): readlink() failed: %s\n",
- __XINE_FUNCTION__, __LINE__, strerror(errno));
+ LOG_MSG_STDERR(this->xine, _("%s(%d): readlink() failed: %s\n"),
+ __XINE_FUNCTION__, __LINE__, strerror(errno));
}
else {
dir_files[num_dir_files].link = (char *) xine_xmalloc(linksize + 1);
strncpy(dir_files[num_dir_files].link, linkbuf, linksize);
- dir_files[num_dir_files].type |= get_file_type(dir_files[num_dir_files].link, current_dir);
+ dir_files[num_dir_files].type |= get_file_type(dir_files[num_dir_files].link, current_dir, this->xine);
}
}
@@ -508,7 +530,7 @@ static mrl_t **file_plugin_get_dir (input_plugin_t *this_gen,
sprintf(hide_files[num_hide_files].mrl, "%s%s",
current_dir_slashed, pdirent->d_name);
hide_files[num_hide_files].link = NULL;
- hide_files[num_hide_files].type = get_file_type(fullfilename, current_dir);
+ hide_files[num_hide_files].type = get_file_type(fullfilename, current_dir, this->xine);
hide_files[num_hide_files].size = get_file_size(fullfilename, current_dir);
/* The file is a link, follow it */
@@ -520,14 +542,14 @@ static mrl_t **file_plugin_get_dir (input_plugin_t *this_gen,
linksize = readlink(fullfilename, linkbuf, XINE_PATH_MAX + XINE_NAME_MAX);
if(linksize < 0) {
- fprintf(stderr, "%s(%d): readlink() failed: %s\n",
- __XINE_FUNCTION__, __LINE__, strerror(errno));
+ LOG_MSG_STDERR(this->xine, _("%s(%d): readlink() failed: %s\n"),
+ __XINE_FUNCTION__, __LINE__, strerror(errno));
}
else {
hide_files[num_hide_files].link = (char *)
xine_xmalloc(linksize + 1);
strncpy(hide_files[num_hide_files].link, linkbuf, linksize);
- hide_files[num_hide_files].type |= get_file_type(hide_files[num_hide_files].link, current_dir);
+ hide_files[num_hide_files].type |= get_file_type(hide_files[num_hide_files].link, current_dir, this->xine);
}
}
@@ -544,7 +566,7 @@ static mrl_t **file_plugin_get_dir (input_plugin_t *this_gen,
sprintf(norm_files[num_norm_files].mrl, "%s%s",
current_dir_slashed, pdirent->d_name);
norm_files[num_norm_files].link = NULL;
- norm_files[num_norm_files].type = get_file_type(fullfilename, current_dir);
+ norm_files[num_norm_files].type = get_file_type(fullfilename, current_dir, this->xine);
norm_files[num_norm_files].size = get_file_size(fullfilename, current_dir);
/* The file is a link, follow it */
@@ -556,14 +578,14 @@ static mrl_t **file_plugin_get_dir (input_plugin_t *this_gen,
linksize = readlink(fullfilename, linkbuf, XINE_PATH_MAX + XINE_NAME_MAX);
if(linksize < 0) {
- fprintf(stderr, "%s(%d): readlink() failed: %s\n",
- __XINE_FUNCTION__, __LINE__, strerror(errno));
+ LOG_MSG_STDERR(this->xine, _("%s(%d): readlink() failed: %s\n"),
+ __XINE_FUNCTION__, __LINE__, strerror(errno));
}
else {
norm_files[num_norm_files].link = (char *)
xine_xmalloc(linksize + 1);
strncpy(norm_files[num_norm_files].link, linkbuf, linksize);
- norm_files[num_norm_files].type |= get_file_type(norm_files[num_norm_files].link, current_dir);
+ norm_files[num_norm_files].type |= get_file_type(norm_files[num_norm_files].link, current_dir, this->xine);
}
}
@@ -744,7 +766,7 @@ static void file_plugin_stop (input_plugin_t *this_gen) {
*
*/
static char *file_plugin_get_description (input_plugin_t *this_gen) {
- return "plain file input plugin as shipped with xine";
+ return _("plain file input plugin as shipped with xine");
}
/*
@@ -762,7 +784,7 @@ static int file_plugin_get_optional_data (input_plugin_t *this_gen,
file_input_plugin_t *this = (file_input_plugin_t *) this_gen;
- printf ("input_file: get optional data, type %08x, sub %p\n",
+ LOG_MSG(this->xine, _("input_file: get optional data, type %08x, sub %p\n"),
data_type, this->sub);
@@ -791,16 +813,18 @@ input_plugin_t *init_input_plugin (int iface, xine_t *xine) {
config_values_t *config;
if (iface != 5) {
- printf("file input plugin doesn't support plugin API version %d.\n"
- "PLUGIN DISABLED.\n"
- "This means there's a version mismatch between xine and this input"
- "plugin.\nInstalling current input plugins should help.\n",
- iface);
+ LOG_MSG(xine,
+ _("file input plugin doesn't support plugin API version %d.\n"
+ "PLUGIN DISABLED.\n"
+ "This means there's a version mismatch between xine and this input"
+ "plugin.\nInstalling current input plugins should help.\n"),
+ iface);
return NULL;
}
this = (file_input_plugin_t *) xine_xmalloc (sizeof (file_input_plugin_t));
config = xine->config;
+ this->xine = xine;
this->input_plugin.interface_version = INPUT_PLUGIN_IFACE_VERSION;
this->input_plugin.get_capabilities = file_plugin_get_capabilities;
diff --git a/src/input/input_http.c b/src/input/input_http.c
index 406d9e41d..cb5cfae38 100644
--- a/src/input/input_http.c
+++ b/src/input/input_http.c
@@ -40,12 +40,36 @@
#include "xineutils.h"
#include "input_plugin.h"
+extern int errno;
+
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
#define BUFSIZE 1024
#define DEFAULT_HTTP_PORT 80
typedef struct {
input_plugin_t input_plugin;
+
+ xine_t *xine;
int fh;
char *mrl;
@@ -74,7 +98,7 @@ typedef struct {
} http_input_plugin_t;
-static int http_plugin_host_connect_attempt(struct in_addr ia, int port) {
+static int http_plugin_host_connect_attempt(struct in_addr ia, int port, xine_t *xine) {
int s;
struct sockaddr_in sin;
@@ -82,7 +106,7 @@ static int http_plugin_host_connect_attempt(struct in_addr ia, int port) {
s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s==-1) {
- printf ("input_http: failed to open socket\n");
+ LOG_MSG(xine, _("input_http: failed to open socket\n"));
return -1;
}
@@ -91,7 +115,7 @@ static int http_plugin_host_connect_attempt(struct in_addr ia, int port) {
sin.sin_port = htons(port);
if (connect(s, (struct sockaddr *)&sin, sizeof(sin))==-1 && errno != EINPROGRESS) {
- printf ("input_http: cannot connect to host\n");
+ LOG_MSG(xine, _("input_http: cannot connect to host\n"));
close(s);
return -1;
}
@@ -99,26 +123,26 @@ static int http_plugin_host_connect_attempt(struct in_addr ia, int port) {
return s;
}
-static int http_plugin_host_connect(const char *host, int port) {
+static int http_plugin_host_connect(const char *host, int port, xine_t *xine) {
struct hostent *h;
int i;
int s;
h=gethostbyname(host);
if (h==NULL) {
- printf ("input_http: unable to resolve >%s<\n", host);
+ LOG_MSG(xine, _("input_http: unable to resolve >%s<\n"), host);
return -1;
}
for(i=0; h->h_addr_list[i]; i++) {
struct in_addr ia;
memcpy(&ia, h->h_addr_list[i], 4);
- s=http_plugin_host_connect_attempt(ia, port);
+ s=http_plugin_host_connect_attempt(ia, port, xine);
if(s != -1)
return s;
}
- printf ("http: unable to connect to >%s<\n", host);
+ LOG_MSG(xine, _("http: unable to connect to >%s<\n"), host);
return -1;
}
@@ -312,16 +336,23 @@ static int http_plugin_open (input_plugin_t *this_gen, char *mrl) {
if (http_plugin_basicauth (this->user, this->password, this->auth, BUFSIZE))
return 0;
- printf ("input_http: opening >/%s< on host >%s<", this->filename, this->host);
- if(proxy != NULL)
- printf (" via proxy >%s<", this->proxyhost);
-
- printf ("\n");
+ {
+ char buf[256];
+
+ sprintf(buf, _("input_http: opening >/%s< on host >%s<"), this->filename, this->host);
+
+ if(proxy != NULL)
+ sprintf(buf, _("%s via proxy >%s<"), buf, this->proxyhost);
+
+ sprintf(buf, "%s\n", buf);
+
+ LOG_MSG(this->xine, buf);
+ }
if (proxy != NULL)
- this->fh = http_plugin_host_connect (this->proxyhost, this->proxyport);
+ this->fh = http_plugin_host_connect (this->proxyhost, this->proxyport, this->xine);
else
- this->fh = http_plugin_host_connect (this->host, this->port);
+ this->fh = http_plugin_host_connect (this->host, this->port, this->xine);
this->curpos = 0;
@@ -383,10 +414,10 @@ static int http_plugin_open (input_plugin_t *this_gen, char *mrl) {
switch (errno) {
case EAGAIN:
- printf ("input_http: EAGAIN\n");
+ LOG_MSG(this->xine, _("input_http: EAGAIN\n"));
continue;
default:
- printf ("input_http: read error\n");
+ LOG_MSG(this->xine, _("input_http: read error\n"));
return 0;
}
}
@@ -403,7 +434,7 @@ static int http_plugin_open (input_plugin_t *this_gen, char *mrl) {
linenum++;
- printf ("input_http: answer: >%s<\n", this->buf);
+ LOG_MSG(this->xine, _("input_http: answer: >%s<\n"), this->buf);
if (linenum == 1)
{
@@ -411,20 +442,20 @@ static int http_plugin_open (input_plugin_t *this_gen, char *mrl) {
char httpstatus[BUFSIZE];
if (sscanf(this->buf, "HTTP/%d.%d %d %[^\015\012]", &httpver, &httpsub,
- &httpcode, httpstatus) != 4)
+ &httpcode, httpstatus) != 4)
{
- printf ("input_http: invalid http answer\n");
+ LOG_MSG(this->xine, _("input_http: invalid http answer\n"));
return 0;
}
if (httpcode >= 300 && httpcode < 400) {
- printf ("input_http: 3xx redirection not implemented: >%d %s<\n",
- httpcode, httpstatus);
+ LOG_MSG(this->xine, _("input_http: 3xx redirection not implemented: >%d %s<\n"),
+ httpcode, httpstatus);
return 0;
}
if (httpcode < 200 || httpcode >= 300) {
- printf ("input_http: http status not 2xx: >%d %s<\n", httpcode,
- httpstatus);
+ LOG_MSG(this->xine, _("input_http: http status not 2xx: >%d %s<\n"),
+ httpcode, httpstatus);
return 0;
}
} else {
@@ -432,14 +463,14 @@ static int http_plugin_open (input_plugin_t *this_gen, char *mrl) {
off_t contentlength;
if (sscanf(this->buf, "Content-Length: %Ld", &contentlength) == 1) {
- printf ("input_http: content length = %Ld bytes\n", contentlength);
+ LOG_MSG(this->xine, _("input_http: content length = %Ld bytes\n"), contentlength);
this->contentlength = contentlength;
}
}
if (!strncasecmp(this->buf, "Location: ", 10))
{
- printf ("input_http: Location redirection not implemented\n");
+ LOG_MSG(this->xine, _("input_http: Location redirection not implemented\n"));
return 0;
}
}
@@ -452,7 +483,7 @@ static int http_plugin_open (input_plugin_t *this_gen, char *mrl) {
len ++;
}
- printf ("input_http: end of headers\n");
+ LOG_MSG(this->xine, _("input_http: end of headers\n"));
return 1;
}
@@ -472,10 +503,10 @@ static off_t http_plugin_read (input_plugin_t *this_gen,
switch (errno) {
case EAGAIN:
- printf ("input_http: EAGAIN\n");
+ LOG_MSG(this->xine, _("input_http: EAGAIN\n"));
continue;
default:
- printf ("input_http: read error\n");
+ LOG_MSG(this->xine, _("input_http: read error\n"));
return 0;
}
}
@@ -513,7 +544,7 @@ static buf_element_t *http_plugin_read_block (input_plugin_t *this_gen, fifo_buf
pthread_testcancel();
num_bytes = read (this->fh, buf->mem + total_bytes, todo-total_bytes);
if (num_bytes < 0) {
- printf ("input_http: read error (%s)\n", strerror (errno));
+ LOG_MSG(this->xine, _("input_http: read error (%s)\n"), strerror (errno));
buf->free_buffer (buf);
buf = NULL;
break;
@@ -570,7 +601,7 @@ static void http_plugin_stop (input_plugin_t *this_gen) {
}
static char *http_plugin_get_description (input_plugin_t *this_gen) {
- return "http network stream input plugin";
+ return _("http network stream input plugin");
}
static char *http_plugin_get_identifier (input_plugin_t *this_gen) {
@@ -595,16 +626,18 @@ input_plugin_t *init_input_plugin (int iface, xine_t *xine) {
config_values_t *config;
if (iface != 5) {
- printf("http input plugin doesn't support plugin API version %d.\n"
- "PLUGIN DISABLED.\n"
- "This means there's a version mismatch between xine and this input"
- "plugin.\nInstalling current input plugins should help.\n",
- iface);
+ LOG_MSG(xine,
+ _("http input plugin doesn't support plugin API version %d.\n"
+ "PLUGIN DISABLED.\n"
+ "This means there's a version mismatch between xine and this input"
+ "plugin.\nInstalling current input plugins should help.\n"),
+ iface);
return NULL;
}
this = (http_input_plugin_t *) xine_xmalloc(sizeof(http_input_plugin_t));
config = xine->config;
+ this->xine = xine;
this->input_plugin.interface_version = INPUT_PLUGIN_IFACE_VERSION;
this->input_plugin.get_capabilities = http_plugin_get_capabilities;
diff --git a/src/input/input_net.c b/src/input/input_net.c
index fcf0914d9..682a4b784 100644
--- a/src/input/input_net.c
+++ b/src/input/input_net.c
@@ -41,15 +41,38 @@
#include "xineutils.h"
#include "input_plugin.h"
+extern int errno;
+
#if !defined(NDELAY) && defined(O_NDELAY)
#define FNDELAY O_NDELAY
#endif
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
#define NET_BS_LEN 2324
typedef struct {
input_plugin_t input_plugin;
+
+ xine_t *xine;
int fh;
char *mrl;
@@ -64,7 +87,7 @@ typedef struct {
/* **************************************************************** */
-static int host_connect_attempt(struct in_addr ia, int port) {
+static int host_connect_attempt(struct in_addr ia, int port, xine_t *xine) {
int s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in sin;
@@ -74,13 +97,13 @@ static int host_connect_attempt(struct in_addr ia, int port) {
if(s==-1)
{
- perror("socket");
+ LOG_MSG_STDERR(xine, _("socket(): %s\n"), strerror(errno));
return -1;
}
if(fcntl(s, F_SETFL, FNDELAY)==-1)
{
- perror("nonblocking");
+ LOG_MSG_STDERR(xine, _("fcntl(nonblocking): %s\n"), strerror(errno));
close(s);
return -1;
}
@@ -91,7 +114,7 @@ static int host_connect_attempt(struct in_addr ia, int port) {
if(connect(s, (struct sockaddr *)&sin, sizeof(sin))==-1 && errno != EINPROGRESS)
{
- perror("connect");
+ LOG_MSG_STDERR(xine, _("connect(): %s\n"), strerror(errno));
close(s);
return -1;
}
@@ -110,7 +133,7 @@ static int host_connect_attempt(struct in_addr ia, int port) {
return -1;
case -1:
/* Ermm.. ?? */
- perror("select");
+ LOG_MSG(xine, _("select(): %s\n"), strerror(errno));
close(s);
return -1;
}
@@ -118,7 +141,7 @@ static int host_connect_attempt(struct in_addr ia, int port) {
return s;
}
-static int host_connect(const char *host, int port) {
+static int host_connect(const char *host, int port, xine_t *xine) {
struct hostent *h;
int i;
int s;
@@ -126,7 +149,7 @@ static int host_connect(const char *host, int port) {
h=gethostbyname(host);
if(h==NULL)
{
- fprintf(stderr,"unable to resolve '%s'.\n", host);
+ LOG_MSG_STDERR(xine, _("unable to resolve '%s'.\n"), host);
return -1;
}
@@ -135,11 +158,11 @@ static int host_connect(const char *host, int port) {
{
struct in_addr ia;
memcpy(&ia, h->h_addr_list[i],4);
- s=host_connect_attempt(ia, port);
+ s = host_connect_attempt(ia, port, xine);
if(s != -1)
return s;
}
- fprintf(stderr, "unable to connect to '%s'.\n", host);
+ LOG_MSG_STDERR(xine, _("unable to connect to '%s'.\n"), host);
return -1;
}
/* **************************************************************** */
@@ -171,7 +194,7 @@ static int net_plugin_open (input_plugin_t *this_gen, char *mrl) {
sscanf(pptr,"%d", &port);
}
- this->fh = host_connect(filename, port);
+ this->fh = host_connect(filename, port, this->xine);
this->curpos = 0;
if (this->fh == -1) {
@@ -260,7 +283,7 @@ static void net_plugin_stop (input_plugin_t *this_gen) {
*
*/
static char *net_plugin_get_description (input_plugin_t *this_gen) {
- return "net input plugin as shipped with xine";
+ return _("net input plugin as shipped with xine");
}
/*
@@ -297,16 +320,18 @@ input_plugin_t *init_input_plugin (int iface, xine_t *xine) {
config_values_t *config;
if (iface != 5) {
- printf("net input plugin doesn't support plugin API version %d.\n"
- "PLUGIN DISABLED.\n"
- "This means there's a version mismatch between xine and this input"
- "plugin.\nInstalling current input plugins should help.\n",
- iface);
+ LOG_MSG(xine,
+ _("net input plugin doesn't support plugin API version %d.\n"
+ "PLUGIN DISABLED.\n"
+ "This means there's a version mismatch between xine and this input"
+ "plugin.\nInstalling current input plugins should help.\n"),
+ iface);
return NULL;
}
this = (net_input_plugin_t *) xine_xmalloc(sizeof(net_input_plugin_t));
config = xine->config;
+ this->xine = xine;
this->input_plugin.interface_version = INPUT_PLUGIN_IFACE_VERSION;
this->input_plugin.get_capabilities = net_plugin_get_capabilities;
diff --git a/src/input/input_rtp.c b/src/input/input_rtp.c
index 95ddc4363..9ca25cd0e 100644
--- a/src/input/input_rtp.c
+++ b/src/input/input_rtp.c
@@ -84,6 +84,28 @@
#include "xineutils.h"
#include "input_plugin.h"
+extern int errno;
+
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
#define RTP_BLOCKSIZE 2048
typedef struct _input_buffer {
@@ -96,6 +118,8 @@ typedef struct _input_buffer {
typedef struct {
input_plugin_t input_plugin;
+
+ xine_t *xine;
char *mrl;
config_values_t *config;
@@ -125,12 +149,12 @@ typedef struct {
/*
*
*/
-static int host_connect_attempt(struct in_addr ia, int port) {
+static int host_connect_attempt(struct in_addr ia, int port, xine_t *xine) {
int s=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
struct sockaddr_in sin;
if(s==-1) {
- perror("socket");
+ LOG_MSG_STDERR(xine, _("socket(): %s.\n"), strerror(errno));
return -1;
}
@@ -140,7 +164,7 @@ static int host_connect_attempt(struct in_addr ia, int port) {
/* datagram socket */
if (bind(s, (struct sockaddr *)&sin, sizeof(sin))) {
- perror("bind failed");
+ LOG_MSG_STDERR(xine, _("bind(): %s.\n"), strerror(errno));
exit(1);
}
/* multicast ? */
@@ -158,7 +182,8 @@ static int host_connect_attempt(struct in_addr ia, int port) {
mreqn.imr_interface.s_addr = INADDR_ANY;
#endif
if (setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreqn,sizeof(mreqn))) {
- perror("setsockopt IP_ADD_MEMBERSHIP failed (multicast kernel?)");
+ LOG_MSG_STDERR(xine, _("setsockopt(IP_ADD_MEMBERSHIP) failed (multicast kernel?): %s.\n"),
+ strerror(errno));
exit(1);
}
}
@@ -169,7 +194,7 @@ static int host_connect_attempt(struct in_addr ia, int port) {
/*
*
*/
-static int host_connect(const char *host, int port) {
+static int host_connect(const char *host, int port, xine_t *xine) {
struct hostent *h;
int i;
int s;
@@ -177,7 +202,7 @@ static int host_connect(const char *host, int port) {
h=gethostbyname(host);
if(h==NULL)
{
- fprintf(stderr,"unable to resolve '%s'.\n", host);
+ LOG_MSG_STDERR(xine, _("unable to resolve '%s'.\n"), host);
return -1;
}
@@ -186,11 +211,11 @@ static int host_connect(const char *host, int port) {
{
struct in_addr ia;
memcpy(&ia, h->h_addr_list[i],4);
- s=host_connect_attempt(ia, port);
+ s = host_connect_attempt(ia, port, xine);
if(s != -1)
return s;
}
- fprintf(stderr, "unable to connect to '%s'.\n", host);
+ LOG_MSG_STDERR(xine, _("unable to connect to '%s'.\n"), host);
return -1;
}
@@ -213,7 +238,7 @@ static void * input_plugin_read_loop(void *arg) {
if (!(*this)->free_buffers) {
(*this)->input_eof = 1;
if (!warned) {
- printf("OUCH - ran out of buffers\n");
+ LOG_MSG((*this)->xine, _("OUCH - ran out of buffers\n"));
warned = 1;
}
pthread_cond_signal(&(*this)->buffer_notempty);
@@ -243,7 +268,8 @@ static void * input_plugin_read_loop(void *arg) {
/* For now - check whether we're dropping input */
if (++seq != *(unsigned short *)buf->buf) {
- printf("OUCH - dropped input packet %d %d\n", seq, *(unsigned short *)buf->buf);
+ LOG_MSG((*this)->xine, _("OUCH - dropped input packet %d %d\n"),
+ seq, *(unsigned short *)buf->buf);
seq = *(unsigned short *)buf->buf;
}
buf->buf[1] = buf->buf[0] = 0;
@@ -282,7 +308,7 @@ static int rtp_plugin_open (input_plugin_t *this_gen, char *mrl ) {
if(strncmp(filename, "//", 2)==0)
filename+=2;
- printf ("Opening >%s<\n", filename);
+ LOG_MSG(this->xine, _("Opening >%s<\n"), filename);
pptr=strrchr(filename, ':');
if(pptr)
@@ -293,7 +319,7 @@ static int rtp_plugin_open (input_plugin_t *this_gen, char *mrl ) {
if (this->fh != -1)
close(this->fh);
- this->fh = host_connect(filename, port);
+ this->fh = host_connect(filename, port, this->xine);
if (this->fh == -1) {
return 0;
@@ -310,8 +336,8 @@ static int rtp_plugin_open (input_plugin_t *this_gen, char *mrl ) {
pthread_attr_setdetachstate(&thread_attrs, PTHREAD_CREATE_DETACHED);
if ((err = pthread_create(&this->reader_thread, &thread_attrs,
input_plugin_read_loop, (void *)&this)) != 0) {
- fprintf (stderr, "input_rtp: can't create new thread (%s)\n",
- strerror(err));
+ LOG_MSG_STDERR(this->xine, _("input_rtp: can't create new thread (%s)\n"),
+ strerror(err));
exit (1);
}
pthread_attr_destroy(&thread_attrs);
@@ -421,7 +447,7 @@ static int rtp_plugin_eject_media (input_plugin_t *this_gen) {
*/
static char *rtp_plugin_get_description (input_plugin_t *this_gen) {
- return "rtp input plugin as shipped with xine";
+ return _("rtp input plugin as shipped with xine");
}
/*
@@ -460,27 +486,29 @@ input_plugin_t *init_input_plugin (int iface, xine_t *xine) {
int bufn;
if (iface != 5) {
- printf("rtp input plugin doesn't support plugin API version %d.\n"
- "PLUGIN DISABLED.\n"
- "This means there's a version mismatch between xine and this input"
- "plugin.\nInstalling current input plugins should help.\n",
- iface);
+ LOG_MSG(xine,
+ _("rtp input plugin doesn't support plugin API version %d.\n"
+ "PLUGIN DISABLED.\n"
+ "This means there's a version mismatch between xine and this input"
+ "plugin.\nInstalling current input plugins should help.\n"),
+ iface);
return NULL;
}
this = (rtp_input_plugin_t *) xine_xmalloc(sizeof(rtp_input_plugin_t));
config = xine->config;
+ this->xine = xine;
for (bufn = 0; bufn < N_BUFFERS; bufn++) {
input_buffer_t *buf = xine_xmalloc(sizeof(input_buffer_t));
if (!buf) {
- fprintf(stderr, "unable to allocate input buffer.\n");
+ LOG_MSG_STDERR(xine, _("unable to allocate input buffer.\n"));
exit(1);
}
buf->buf = xine_xmalloc(IBUFFER_SIZE);
if (!buf->buf) {
- fprintf(stderr, "unable to allocate input buffer.\n");
+ LOG_MSG_STDERR(xine, _("unable to allocate input buffer.\n"));
exit(1);
}
buf->next = this->free_buffers;
diff --git a/src/input/input_stdin_fifo.c b/src/input/input_stdin_fifo.c
index 06b002b86..0db8e609e 100644
--- a/src/input/input_stdin_fifo.c
+++ b/src/input/input_stdin_fifo.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: input_stdin_fifo.c,v 1.17 2001/11/18 03:53:23 guenter Exp $
+ * $Id: input_stdin_fifo.c,v 1.18 2001/12/27 14:30:30 f1rmb Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -40,8 +40,32 @@
#include "xineutils.h"
#include "input_plugin.h"
+extern int errno;
+
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
typedef struct {
input_plugin_t input_plugin;
+
+ xine_t *xine;
int fh;
char *mrl;
@@ -225,7 +249,7 @@ static void stdin_plugin_stop(input_plugin_t *this_gen) {
*
*/
static char *stdin_plugin_get_description (input_plugin_t *this_gen) {
- return "stdin/fifo input plugin as shipped with xine";
+ return _("stdin/fifo input plugin as shipped with xine");
}
/*
@@ -253,16 +277,18 @@ input_plugin_t *init_input_plugin (int iface, xine_t *xine) {
config_values_t *config;
if (iface != 5) {
- printf("rtp input plugin doesn't support plugin API version %d.\n"
- "PLUGIN DISABLED.\n"
- "This means there's a version mismatch between xine and this input"
- "plugin.\nInstalling current input plugins should help.\n",
- iface);
+ LOG_MSG(xine,
+ _("stdin/fifo input plugin doesn't support plugin API version %d.\n"
+ "PLUGIN DISABLED.\n"
+ "This means there's a version mismatch between xine and this input"
+ "plugin.\nInstalling current input plugins should help.\n"),
+ iface);
return NULL;
}
this = (stdin_input_plugin_t *) xine_xmalloc(sizeof(stdin_input_plugin_t));
config = xine->config;
+ this->xine = xine;
this->input_plugin.interface_version = INPUT_PLUGIN_IFACE_VERSION;
this->input_plugin.get_capabilities = stdin_plugin_get_capabilities;
diff --git a/src/input/input_vcd.c b/src/input/input_vcd.c
index 99e685398..e86d8b57d 100644
--- a/src/input/input_vcd.c
+++ b/src/input/input_vcd.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: input_vcd.c,v 1.33 2001/12/10 12:56:54 f1rmb Exp $
+ * $Id: input_vcd.c,v 1.34 2001/12/27 14:30:30 f1rmb Exp $
*
*/
@@ -51,6 +51,28 @@
#include "xineutils.h"
#include "input_plugin.h"
+extern int errno;
+
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_INPUT, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_INPUT, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
#if defined(__sun)
#define CDROM "/vol/dev/aliases/cdrom0"
#else
@@ -79,6 +101,8 @@ typedef struct {
input_plugin_t input_plugin;
+ xine_t *xine;
+
char *mrl;
config_values_t *config;
@@ -130,7 +154,7 @@ static int input_vcd_read_toc (vcd_input_plugin_t *this) {
/* read TOC header */
if ( ioctl(this->fd, CDROMREADTOCHDR, &this->tochdr) == -1 ) {
- fprintf (stderr, "input_vcd : error in ioctl CDROMREADTOCHDR\n");
+ LOG_MSG_STDERR(this->xine, _("input_vcd : error in ioctl CDROMREADTOCHDR\n"));
return -1;
}
@@ -139,7 +163,8 @@ static int input_vcd_read_toc (vcd_input_plugin_t *this) {
this->tocent[i-1].cdte_track = i;
this->tocent[i-1].cdte_format = CDROM_MSF;
if ( ioctl(this->fd, CDROMREADTOCENTRY, &this->tocent[i-1]) == -1 ) {
- fprintf (stderr, "input_vcd: error in ioctl CDROMREADTOCENTRY for track %d\n", i);
+ LOG_MSG_STDERR(this->xine,
+ _("input_vcd: error in ioctl CDROMREADTOCENTRY for track %d\n"), i);
return -1;
}
}
@@ -150,7 +175,7 @@ static int input_vcd_read_toc (vcd_input_plugin_t *this) {
if (ioctl(this->fd, CDROMREADTOCENTRY,
&this->tocent[this->tochdr.cdth_trk1]) == -1 ) {
- fprintf (stderr, "input_vcd: error in ioctl CDROMREADTOCENTRY for lead-out\n");
+ LOG_MSG_STDERR(this->xine, _("input_vcd: error in ioctl CDROMREADTOCENTRY for lead-out\n"));
return -1;
}
@@ -166,7 +191,7 @@ static int input_vcd_read_toc (vcd_input_plugin_t *this) {
/* read TOC header */
if ( ioctl(this->fd, CDIOREADTOCHEADER, &this->tochdr) == -1 ) {
- fprintf (stderr, "input_vcd : error in ioctl CDROMREADTOCHDR\n");
+ LOG_MSG_STDERR(this->xine, _("input_vcd : error in ioctl CDROMREADTOCHDR\n"));
return -1;
}
@@ -181,7 +206,7 @@ static int input_vcd_read_toc (vcd_input_plugin_t *this) {
te.data = this->tocent;
if ( ioctl(this->fd, CDIOREADTOCENTRYS, &te) == -1 ){
- fprintf (stderr, "input_vcd: error in ioctl CDROMREADTOCENTRY\n");
+ LOG_MSG_STDERR(this->xine, _("input_vcd: error in ioctl CDROMREADTOCENTRY\n"));
return -1;
}
@@ -299,7 +324,7 @@ static int sun_vcd_read(vcd_input_plugin_t *this, long lba, cdsector_t *data)
return -1;
}
if (sc.uscsi_status) {
- fprintf(stderr, "scsi command failed with status %d\n", sc.uscsi_status);
+ LOG_MSG_STDERR(this->xine, _("scsi command failed with status %d\n"), sc.uscsi_status);
return -1;
}
}
@@ -340,14 +365,14 @@ static int vcd_plugin_open (input_plugin_t *this_gen, char *mrl) {
filename = (char *) &mrl[6];
if (sscanf (filename, "%d", &this->cur_track) != 1) {
- fprintf (stderr, "input_vcd: malformed MRL. Use vcd://<track #>\n");
+ LOG_MSG_STDERR(this->xine, _("input_vcd: malformed MRL. Use vcd://<track #>\n"));
close (this->fd);
this->fd = -1;
return 0;
}
if (this->cur_track>=this->total_tracks) {
- fprintf (stderr, "input_vcd: invalid track %d (valid range: 0 .. %d)\n",
+ LOG_MSG_STDERR(this->xine, _("input_vcd: invalid track %d (valid range: 0 .. %d)\n"),
this->cur_track, this->total_tracks-1);
close (this->fd);
this->fd = -1;
@@ -362,7 +387,7 @@ static int vcd_plugin_open (input_plugin_t *this_gen, char *mrl) {
{
int bsize = 2352;
if (ioctl (this->fd, CDRIOCSETBLOCKSIZE, &bsize) == -1) {
- fprintf (stderr, "input_vcd: error in CDRIOCSETBLOCKSIZE %d\n", errno);
+ LOG_MSG_STDERR(this->xine, _("input_vcd: error in CDRIOCSETBLOCKSIZE %d\n"), errno);
return 0;
}
@@ -412,7 +437,7 @@ static off_t vcd_plugin_read (input_plugin_t *this_gen,
memcpy (&data, &msf, sizeof (msf));
if (ioctl (this->fd, CDROMREADRAW, &data) == -1) {
- fprintf (stderr, "input_vcd: error in CDROMREADRAW\n");
+ LOG_MSG_STDERR(this->xine, _("input_vcd: error in CDROMREADRAW\n"));
return 0;
}
@@ -447,11 +472,11 @@ static off_t vcd_plugin_read (input_plugin_t *this_gen,
do {
if (lseek (this->fd, this->cur_sector * bsize, SEEK_SET) == -1) {
- fprintf (stderr, "input_vcd: seek error %d\n", errno);
+ LOG_MSG_STDERR(this->xine, _("input_vcd: seek error %d\n"), errno);
return 0;
}
if (read (this->fd, &data, bsize) == -1) {
- fprintf (stderr, "input_vcd: read error %d\n", errno);
+ LOG_MSG_STDERR(this->xine, _("input_vcd: read error %d\n"), errno);
return 0;
}
this->cur_sector++;
@@ -488,7 +513,7 @@ static off_t vcd_plugin_read (input_plugin_t *this_gen,
lba = (this->cur_min * 60 + this->cur_sec) * 75L + this->cur_frame;
if (sun_vcd_read(this, lba, &data) < 0) {
- fprintf(stderr, "input_vcd: read data failed\n");
+ LOG_MSG_STDERR(this->xine, _("input_vcd: read data failed\n"));
return 0;
}
@@ -549,7 +574,7 @@ static buf_element_t *vcd_plugin_read_block (input_plugin_t *this_gen,
memcpy (&data, &msf, sizeof (msf));
if (ioctl (this->fd, CDROMREADRAW, &data) == -1) {
- fprintf (stderr, "input_vcd: error in CDROMREADRAW\n");
+ LOG_MSG_STDERR(this->xine, _("input_vcd: error in CDROMREADRAW\n"));
return NULL;
}
@@ -589,11 +614,11 @@ static buf_element_t *vcd_plugin_read_block (input_plugin_t *this_gen,
do {
if (lseek (this->fd, this->cur_sector * bsize, SEEK_SET) == -1) {
- fprintf (stderr, "input_vcd: seek error %d\n", errno);
+ LOG_MSG_STDERR(this->xine, _("input_vcd: seek error %d\n"), errno);
return NULL;
}
if (read (this->fd, &data, bsize) == -1) {
- fprintf (stderr, "input_vcd: read error %d\n", errno);
+ LOG_MSG_STDERR(this->xine, _("input_vcd: read error %d\n"), errno);
return NULL;
}
this->cur_sector++;
@@ -635,7 +660,7 @@ static buf_element_t *vcd_plugin_read_block (input_plugin_t *this_gen,
lba = (this->cur_min * 60 + this->cur_sec) * 75L + this->cur_frame;
if (sun_vcd_read (this, lba, &data) < 0) {
- fprintf (stderr, "input_vcd: read data failed\n");
+ LOG_MSG_STDERR(this->xine, _("input_vcd: read data failed\n"));
return NULL;
}
@@ -706,7 +731,7 @@ static off_t vcd_plugin_seek (input_plugin_t *this_gen,
break;
case SEEK_CUR:
if (offset)
- fprintf (stderr, "input_vcd: SEEK_CUR not implemented for offset != 0\n");
+ LOG_MSG_STDERR(this->xine, _("input_vcd: SEEK_CUR not implemented for offset != 0\n"));
/*
printf ("input_vcd: current pos: %02d:%02d:%02d\n",
@@ -724,7 +749,7 @@ static off_t vcd_plugin_seek (input_plugin_t *this_gen,
break;
default:
- fprintf (stderr, "input_vcd: error seek to origin %d not implemented!\n",
+ LOG_MSG_STDERR(this->xine, _("input_vcd: error seek to origin %d not implemented!\n"),
origin);
return 0;
}
@@ -757,7 +782,7 @@ static off_t vcd_plugin_seek (input_plugin_t *this_gen,
case SEEK_CUR:
if (offset)
- fprintf (stderr, "input_vcd: SEEK_CUR not implemented for offset != 0\n");
+ LOG_MSG_STDERR(this->xine, _("input_vcd: SEEK_CUR not implemented for offset != 0\n"));
sector_pos = this->cur_sector;
@@ -765,7 +790,7 @@ static off_t vcd_plugin_seek (input_plugin_t *this_gen,
break;
default:
- fprintf (stderr, "input_vcd: error seek to origin %d not implemented!\n",
+ LOG_MSG_STDERR(this->xine, _("input_vcd: error seek to origin %d not implemented!\n"),
origin);
return 0;
}
@@ -858,18 +883,18 @@ static int vcd_plugin_eject_media (input_plugin_t *this_gen) {
switch(status) {
case CDS_TRAY_OPEN:
if((ret = ioctl(this->fd, CDROMCLOSETRAY)) != 0) {
- printf ("input_vcd: CDROMCLOSETRAY failed: %s\n", strerror(errno));
+ LOG_MSG(this->xine, _("input_vcd: CDROMCLOSETRAY failed: %s\n"), strerror(errno));
}
break;
case CDS_DISC_OK:
if((ret = ioctl(this->fd, CDROMEJECT)) != 0) {
- printf ("input_vcd: CDROMEJECT failed: %s\n", strerror(errno));
+ LOG_MSG(this->xine, _("input_vcd: CDROMEJECT failed: %s\n"), strerror(errno));
}
break;
}
}
else {
- printf ("input_vcd: CDROM_DRIVE_STATUS failed: %s\n",
+ LOG_MSG(this->xine, _("input_vcd: CDROM_DRIVE_STATUS failed: %s\n"),
strerror(errno));
close(this->fd);
return 0;
@@ -905,7 +930,7 @@ static int vcd_plugin_eject_media (input_plugin_t *this_gen) {
if ((fd = open(this->device, O_RDONLY|O_NONBLOCK)) > -1) {
if ((ret = ioctl(fd, CDROMEJECT)) != 0) {
- printf ("input_vcd: CDROMEJECT failed: %s\n", strerror(errno));
+ LOG_MSG(this->xine, _("input_vcd: CDROMEJECT failed: %s\n"), strerror(errno));
}
close(fd);
}
@@ -935,7 +960,7 @@ static void vcd_plugin_stop (input_plugin_t *this_gen) {
*
*/
static char *vcd_plugin_get_description (input_plugin_t *this_gen) {
- return "plain file input plugin as shipped with xine";
+ return _("plain file input plugin as shipped with xine");
}
/*
@@ -963,8 +988,7 @@ static mrl_t **vcd_plugin_get_dir (input_plugin_t *this_gen,
this->fd = open (this->device, O_RDONLY);
if (this->fd == -1) {
- fprintf(stderr, "unable to open %s: ", this->device);
- perror ("");
+ LOG_MSG_STDERR(this->xine, _("unable to open %s: %s.\n"), this->device, strerror(errno));
return NULL;
}
@@ -972,7 +996,7 @@ static mrl_t **vcd_plugin_get_dir (input_plugin_t *this_gen,
close (this->fd);
this->fd = -1;
- printf ("vcd_read_toc failed\n");
+ LOG_MSG(this->xine, _("vcd_read_toc failed\n"));
return NULL;
}
@@ -1044,8 +1068,7 @@ static char **vcd_plugin_get_autoplay_list (input_plugin_t *this_gen,
this->fd = open (this->device, O_RDONLY);
if (this->fd == -1) {
- fprintf(stderr, "unable to open %s: ", this->device);
- perror ("");
+ LOG_MSG_STDERR(this->xine, _("unable to open %s: %s."), this->device, strerror(errno));
return NULL;
}
@@ -1053,7 +1076,7 @@ static char **vcd_plugin_get_autoplay_list (input_plugin_t *this_gen,
close (this->fd);
this->fd = -1;
- printf ("vcd_read_toc failed\n");
+ LOG_MSG(this->xine, _("vcd_read_toc failed\n"));
return NULL;
}
@@ -1108,17 +1131,19 @@ input_plugin_t *init_input_plugin (int iface, xine_t *xine) {
int i;
if (iface != 5) {
- printf("vcd input plugin doesn't support plugin API version %d.\n"
- "PLUGIN DISABLED.\n"
- "This means there's a version mismatch between xine and this input"
- "plugin.\nInstalling current input plugins should help.\n",
- iface);
+ LOG_MSG(xine,
+ _("vcd input plugin doesn't support plugin API version %d.\n"
+ "PLUGIN DISABLED.\n"
+ "This means there's a version mismatch between xine and this input"
+ "plugin.\nInstalling current input plugins should help.\n"),
+ iface);
return NULL;
}
this = (vcd_input_plugin_t *) xine_xmalloc(sizeof(vcd_input_plugin_t));
config = xine->config;
-
+ this->xine = xine;
+
for (i = 0; i < 100; i++) {
this->filelist[i] = (char *) xine_xmalloc(sizeof(char *) * 256);
}
diff --git a/src/xine-engine/Makefile.am b/src/xine-engine/Makefile.am
index e52733df0..e9628af2b 100644
--- a/src/xine-engine/Makefile.am
+++ b/src/xine-engine/Makefile.am
@@ -10,8 +10,9 @@ lib_LTLIBRARIES = libxine.la
libxine_la_SOURCES = xine.c metronom.c configfile.c buffer.c \
load_plugins.c video_decoder.c buffer_types.c \
audio_decoder.c video_out.c audio_out.c resample.c events.c lrb.c \
- video_overlay.c osd.c scratch.c
-libxine_la_LIBADD = $(THREAD_LIBS) $(DYNAMIC_LD_LIBS) -lm -lz
+ video_overlay.c osd.c scratch.c locale.c
+libxine_la_DEPENDENCIES = @INTLLIBS@
+libxine_la_LIBADD = $(THREAD_LIBS) $(DYNAMIC_LD_LIBS) @INTLLIBS@ -lm -lz
libxine_la_LDFLAGS = \
-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
@@ -19,10 +20,13 @@ libxine_la_LDFLAGS = \
include_HEADERS = buffer.h metronom.h configfile.h \
audio_out.h resample.h video_out.h xine_internal.h spu_decoder.h \
- events.h lrb.h video_overlay.h osd.h scratch.h
+ events.h lrb.h video_overlay.h osd.h scratch.h xineintl.h
noinst_HEADERS = bswap.h
+@INCLUDED_INTL_TRUE@@INTLLIBS@:
+@INCLUDED_INTL_TRUE@ @cd $(top_builddir)/intl && $(MAKE) libintl.la
+
debug:
@$(MAKE) CFLAGS="$(DEBUG_CFLAGS)"
diff --git a/src/xine-engine/load_plugins.c b/src/xine-engine/load_plugins.c
index 488911e6d..49f177af4 100644
--- a/src/xine-engine/load_plugins.c
+++ b/src/xine-engine/load_plugins.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: load_plugins.c,v 1.62 2001/12/21 23:34:07 f1rmb Exp $
+ * $Id: load_plugins.c,v 1.63 2001/12/27 14:30:30 f1rmb Exp $
*
*
* Load input/demux/audio_out/video_out/codec plugins
@@ -51,6 +51,26 @@
#define LOAD_LOG
*/
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_PLUGIN, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_PLUGIN, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_PLUGIN, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_PLUGIN, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
/* transition code; between xine 0.9.7 and 0.9.8, the dxr3enc driver
* was integrated in the dxr3 driver and no longer exists as a seperate
* plugin. upgraded installs may have an old dxr3enc driver left in the
@@ -98,8 +118,8 @@ void load_demux_plugins (xine_t *this,
DIR *dir;
if(this == NULL || config == NULL) {
- printf("%s(%s@%d): parameter should be non null, exiting\n",
- __FILE__, __XINE_FUNCTION__, __LINE__);
+ LOG_MSG(this, _("%s(%s@%d): parameter should be non null, exiting\n"),
+ __FILE__, __XINE_FUNCTION__, __LINE__);
exit(1);
}
@@ -133,7 +153,7 @@ void load_demux_plugins (xine_t *this,
plugin_name = str;
if(!(plugin = dlopen (str, RTLD_LAZY))) {
- printf ("load_plugins: cannot open demux plugin %s:\n%s\n",
+ LOG_MSG(this, _("load_plugins: cannot open demux plugin %s:\n%s\n"),
str, dlerror());
} else {
@@ -147,15 +167,15 @@ void load_demux_plugins (xine_t *this,
if (dxp) {
this->demuxer_plugins[this->num_demuxer_plugins] = dxp;
- printf("load_plugins: demux plugin found : %s\n",
- this->demuxer_plugins[this->num_demuxer_plugins]->get_identifier());
+ LOG_MSG(this, _("load_plugins: demux plugin found : %s\n"),
+ this->demuxer_plugins[this->num_demuxer_plugins]->get_identifier());
this->num_demuxer_plugins++;
}
}
if(this->num_demuxer_plugins > DEMUXER_PLUGIN_MAX) {
- printf ("load_plugins: too many demux plugins installed, exiting.\n");
+ LOG_MSG(this, _("load_plugins: too many demux plugins installed, exiting.\n"));
exit(1);
}
}
@@ -291,8 +311,8 @@ void load_input_plugins (xine_t *this,
plugin_name = str;
if(!(plugin = dlopen (str, RTLD_LAZY))) {
- printf("load_plugins: cannot open input plugin %s:\n%s\n",
- str, dlerror());
+ LOG_MSG(this, _("load_plugins: cannot open input plugin %s:\n%s\n"),
+ str, dlerror());
} else {
void *(*initplug) (int, xine_t *);
@@ -303,19 +323,19 @@ void load_input_plugins (xine_t *this,
if (ip) {
this->input_plugins[this->num_input_plugins] = ip;
- printf("load_plugins: input plugin found : %s\n",
- this->input_plugins[this->num_input_plugins]->get_identifier(this->input_plugins[this->num_input_plugins]));
+ LOG_MSG(this, _("load_plugins: input plugin found : %s\n"),
+ this->input_plugins[this->num_input_plugins]->get_identifier(this->input_plugins[this->num_input_plugins]));
this->num_input_plugins++;
}
} else {
- printf ("load_plugins: %s is no valid input plugin (lacks init_input_plugin() function)\n", str);
+ LOG_MSG(this, _("load_plugins: %s is no valid input plugin (lacks init_input_plugin() function)\n"), str);
}
if(this->num_input_plugins > INPUT_PLUGIN_MAX) {
- fprintf(stderr, "%s(%d): too many input plugins installed, "
- "exiting.\n", __FILE__, __LINE__);
+ LOG_MSG_STDERR(this, _("%s(%d): too many input plugins installed, "
+ "exiting.\n"), __FILE__, __LINE__);
exit(1);
}
}
@@ -327,8 +347,8 @@ void load_input_plugins (xine_t *this,
remove_segv_handler();
if (this->num_input_plugins == 0) {
- fprintf (stderr, "load_plugins: no input plugins found in %s! - "
- "Did you install xine correctly??\n", XINE_PLUGINDIR);
+ LOG_MSG_STDERR(this, _("load_plugins: no input plugins found in %s! - "
+ "Did you install xine correctly??\n"), XINE_PLUGINDIR);
exit (1);
}
@@ -446,8 +466,8 @@ void load_decoder_plugins (xine_t *this,
if(this == NULL || config == NULL) {
- printf("%s(%s@%d): parameter should be non null, exiting\n",
- __FILE__, __XINE_FUNCTION__, __LINE__);
+ LOG_MSG(this, _("%s(%s@%d): parameter should be non null, exiting\n"),
+ __FILE__, __XINE_FUNCTION__, __LINE__);
exit(1);
}
@@ -506,7 +526,7 @@ void load_decoder_plugins (xine_t *this,
if(!(plugin = dlopen (str, RTLD_LAZY))) {
- printf ("load_plugins: failed to load plugin %s:\n%s\n",
+ LOG_MSG(this, _("load_plugins: failed to load plugin %s:\n%s\n"),
str, dlerror());
} else {
@@ -534,8 +554,8 @@ void load_decoder_plugins (xine_t *this,
spu_prio[streamtype] = plugin_prio;
}
- printf("spu decoder plugin found : %s\n",
- sdp->get_identifier());
+ LOG_MSG(this, _("spu decoder plugin found : %s\n"),
+ sdp->get_identifier());
}
}
}
@@ -562,8 +582,8 @@ void load_decoder_plugins (xine_t *this,
video_prio[streamtype] = plugin_prio;
}
- printf("video decoder plugin found : %s\n",
- vdp->get_identifier());
+ LOG_MSG(this, _("video decoder plugin found : %s\n"),
+ vdp->get_identifier());
}
}
@@ -586,8 +606,8 @@ void load_decoder_plugins (xine_t *this,
audio_prio[streamtype] = plugin_prio;
}
- printf("audio decoder plugin found : %s\n",
- adp->get_identifier());
+ LOG_MSG(this, _("audio decoder plugin found : %s\n"),
+ adp->get_identifier());
}
}
@@ -939,8 +959,7 @@ char **xine_list_audio_output_plugins(void) {
return plugin_ids;
}
-ao_driver_t *xine_load_audio_output_plugin(config_values_t *config,
- char *id) {
+ao_driver_t *xine_load_audio_output_plugin(config_values_t *config, char *id) {
DIR *dir;
ao_driver_t *aod = NULL;
diff --git a/src/xine-engine/metronom.c b/src/xine-engine/metronom.c
index 695b47cfa..6f801eb09 100644
--- a/src/xine-engine/metronom.c
+++ b/src/xine-engine/metronom.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: metronom.c,v 1.45 2001/12/25 14:39:01 miguelfreitas Exp $
+ * $Id: metronom.c,v 1.46 2001/12/27 14:30:30 f1rmb Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -49,6 +49,26 @@
#define MAX_SCR_PROVIDERS 10
#define PREBUFFER_PTS_OFFSET 30000
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log((xine_t*)xine, XINE_LOG_METRONOM, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log((xine_t*)xine, XINE_LOG_METRONOM, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log((xine_t*)xine, XINE_LOG_METRONOM, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log((xine_t*)xine, XINE_LOG_METRONOM, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
/*
#define METRONOM_LOG
*/
@@ -233,10 +253,10 @@ static void metronom_video_stream_start (metronom_t *this) {
pthread_mutex_lock (&this->lock);
- printf ("metronom: video stream start...\n");
+ LOG_MSG(this->xine, _("metronom: video stream start...\n"));
if (this->video_stream_running) {
- printf ("metronom: video stream start ignored\n");
+ LOG_MSG(this->xine, _("metronom: video stream start ignored\n"));
pthread_mutex_unlock (&this->lock);
return;
}
@@ -263,7 +283,7 @@ static void metronom_video_stream_start (metronom_t *this) {
if (this->have_audio) {
/*while (!this->audio_stream_running) {*/
if (!this->audio_stream_running) {
- printf ("metronom: waiting for audio to start...\n");
+ LOG_MSG(this->xine, _("metronom: waiting for audio to start...\n"));
pthread_cond_wait (&this->audio_started, &this->lock);
}
}
@@ -279,10 +299,10 @@ static void metronom_video_stream_end (metronom_t *this) {
pthread_mutex_lock (&this->lock);
- printf ("metronom: video stream end\n");
+ LOG_MSG(this->xine, _("metronom: video stream end\n"));
if (!this->video_stream_running) {
- printf ("metronom: video stream end ignored\n");
+ LOG_MSG(this->xine, _("metronom: video stream end ignored\n"));
pthread_mutex_unlock (&this->lock);
return;
}
@@ -292,7 +312,7 @@ static void metronom_video_stream_end (metronom_t *this) {
if (this->have_audio) {
/* while (this->audio_stream_running) { */
if (this->audio_stream_running) {
- printf ("metronom: waiting for audio to end...\n");
+ LOG_MSG(this->xine, _("metronom: waiting for audio to end...\n"));
pthread_cond_wait (&this->audio_ended, &this->lock);
}
}
@@ -306,10 +326,10 @@ static void metronom_audio_stream_start (metronom_t *this) {
pthread_mutex_lock (&this->lock);
- printf ("metronom: audio stream start...\n");
+ LOG_MSG(this->xine, _("metronom: audio stream start...\n"));
if (this->audio_stream_running) {
- printf ("metronom: audio stream start ignored\n");
+ LOG_MSG(this->xine, _("metronom: audio stream start ignored\n"));
pthread_mutex_unlock (&this->lock);
return;
}
@@ -334,7 +354,7 @@ static void metronom_audio_stream_start (metronom_t *this) {
/*while (!this->video_stream_running) { */
if (!this->video_stream_running) {
- printf ("metronom: waiting for video to start...\n");
+ LOG_MSG(this->xine, _("metronom: waiting for video to start...\n"));
pthread_cond_wait (&this->video_started, &this->lock);
}
@@ -342,7 +362,7 @@ static void metronom_audio_stream_start (metronom_t *this) {
pthread_mutex_unlock (&this->lock);
- printf ("metronom: audio stream start...done\n");
+ LOG_MSG(this->xine, _("metronom: audio stream start...done\n"));
metronom_start_clock (this, 0);
}
@@ -351,9 +371,9 @@ static void metronom_audio_stream_end (metronom_t *this) {
pthread_mutex_lock (&this->lock);
- printf ("metronom: audio stream end\n");
+ LOG_MSG(this->xine, _("metronom: audio stream end\n"));
if (!this->audio_stream_running) {
- printf ("metronom: audio stream end ignored\n");
+ LOG_MSG(this->xine, _("metronom: audio stream end ignored\n"));
pthread_mutex_unlock (&this->lock);
return;
}
@@ -362,7 +382,7 @@ static void metronom_audio_stream_end (metronom_t *this) {
/* while (this->video_stream_running) { */
if (this->video_stream_running) {
- printf ("metronom: waiting for video to end...\n");
+ LOG_MSG(this->xine, _("metronom: waiting for video to end...\n"));
pthread_cond_wait (&this->video_ended, &this->lock);
}
@@ -445,14 +465,14 @@ static void metronom_expect_video_discontinuity (metronom_t *this) {
this->video_discontinuity_count++;
pthread_cond_signal (&this->video_discontinuity_reached);
- printf ("metronom: video discontinuity #%d\n",
+ LOG_MSG(this->xine, _("metronom: video discontinuity #%d\n"),
this->video_discontinuity_count);
if( this->have_audio ) {
while ( this->audio_discontinuity_count <
this->video_discontinuity_count ) {
- printf ("metronom: waiting for audio discontinuity #%d\n",
+ LOG_MSG(this->xine, _("metronom: waiting for audio discontinuity #%d\n"),
this->video_discontinuity_count);
pthread_cond_wait (&this->audio_discontinuity_reached, &this->lock);
@@ -460,7 +480,7 @@ static void metronom_expect_video_discontinuity (metronom_t *this) {
if ( this->video_vpts < this->audio_vpts ) {
this->video_vpts = this->audio_vpts;
- printf("metronom: video vpts adjusted to %d\n", this->video_vpts);
+ LOG_MSG(this->xine, _("metronom: video vpts adjusted to %d\n"), this->video_vpts);
}
}
@@ -515,7 +535,7 @@ static uint32_t metronom_got_video_frame (metronom_t *this, uint32_t pts, uint32
vpts = pts + this->video_wrap_offset;
- printf ("metronom: video pts discontinuity/start, pts is %d, wrap_offset is %d, vpts is %d\n",
+ LOG_MSG(this->xine, _("metronom: video pts discontinuity/start, pts is %d, wrap_offset is %d, vpts is %d\n"),
pts, this->video_wrap_offset, vpts);
} else {
@@ -530,7 +550,7 @@ static uint32_t metronom_got_video_frame (metronom_t *this, uint32_t pts, uint32
if (this->wrap_diff_counter > MAX_NUM_WRAP_DIFF) {
- printf ("metronom: forcing video_wrap (%d) and audio wrap (%d)",
+ LOG_MSG(this->xine, _("metronom: forcing video_wrap (%d) and audio wrap (%d)"),
this->video_wrap_offset, this->audio_wrap_offset);
if (this->video_wrap_offset > this->audio_wrap_offset)
@@ -538,7 +558,7 @@ static uint32_t metronom_got_video_frame (metronom_t *this, uint32_t pts, uint32
else
this->video_wrap_offset = this->audio_wrap_offset;
- printf (" to %d\n", this->video_wrap_offset);
+ LOG_MSG(this->xine, _(" to %d\n"), this->video_wrap_offset);
this->wrap_diff_counter = 0;
}
@@ -602,7 +622,7 @@ static uint32_t metronom_got_video_frame (metronom_t *this, uint32_t pts, uint32
this->video_vpts = pts + this->video_wrap_offset;
- printf ("metronom: delta too big, setting vpts to %d\n",
+ LOG_MSG(this->xine, _("metronom: delta too big, setting vpts to %d\n"),
this->video_vpts);
@@ -645,20 +665,21 @@ static void metronom_expect_audio_discontinuity (metronom_t *this) {
this->audio_discontinuity_count++;
pthread_cond_signal (&this->audio_discontinuity_reached);
- printf ("metronom: audio discontinuity #%d\n",
+ LOG_MSG(this->xine, _("metronom: audio discontinuity #%d\n"),
this->audio_discontinuity_count);
while ( this->audio_discontinuity_count >
this->video_discontinuity_count ) {
- printf ("metronom: waiting for video_discontinuity #%d\n", this->audio_discontinuity_count);
+ LOG_MSG(this->xine, _("metronom: waiting for video_discontinuity #%d\n"),
+ this->audio_discontinuity_count);
pthread_cond_wait (&this->video_discontinuity_reached, &this->lock);
}
if ( this->audio_vpts < this->video_vpts ) {
this->audio_vpts = this->video_vpts;
- printf("metronom: audio vpts adjusted to %d\n", this->audio_vpts);
+ LOG_MSG(this->xine, _("metronom: audio vpts adjusted to %d\n"), this->audio_vpts);
}
/* this->num_audio_samples_guessed = 1; */
@@ -701,7 +722,7 @@ static uint32_t metronom_got_audio_samples (metronom_t *this, uint32_t pts,
vpts = pts + this->audio_wrap_offset;
- printf ("metronom: audio pts discontinuity/start, pts is %d, wrap_offset is %d, vpts is %d\n",
+ LOG_MSG(this->xine, _("metronom: audio pts discontinuity/start, pts is %d, wrap_offset is %d, vpts is %d\n"),
pts, this->audio_wrap_offset, vpts);
@@ -718,7 +739,7 @@ static uint32_t metronom_got_audio_samples (metronom_t *this, uint32_t pts,
if (this->wrap_diff_counter > MAX_NUM_WRAP_DIFF) {
- printf ("metronom: forcing video_wrap (%d) and audio wrap (%d)",
+ LOG_MSG(this->xine, _("metronom: forcing video_wrap (%d) and audio wrap (%d)"),
this->video_wrap_offset, this->audio_wrap_offset);
if (this->video_wrap_offset > this->audio_wrap_offset)
@@ -726,7 +747,7 @@ static uint32_t metronom_got_audio_samples (metronom_t *this, uint32_t pts,
else
this->video_wrap_offset = this->audio_wrap_offset;
- printf ("to %d\n", this->video_wrap_offset);
+ LOG_MSG(this->xine, _("to %d\n"), this->video_wrap_offset);
this->wrap_diff_counter = 0;
}
@@ -776,7 +797,7 @@ static void metronom_set_av_offset (metronom_t *this, int32_t pts) {
pthread_mutex_unlock (&this->lock);
- printf ("metronom: av_offset=%d pts\n", pts);
+ LOG_MSG(this->xine, _("metronom: av_offset=%d pts\n"), pts);
}
static int32_t metronom_get_av_offset (metronom_t *this) {
@@ -796,7 +817,7 @@ static scr_plugin_t* get_master_scr(metronom_t *this) {
}
}
if (select < 0) {
- printf("metronom: panic - no scr provider found!\n");
+ LOG_MSG(this->xine, _("metronom: panic - no scr provider found!\n"));
return NULL;
}
return this->scr_list[select];
@@ -847,11 +868,12 @@ static int metronom_sync_loop (metronom_t *this) {
}
-metronom_t * metronom_init (int have_audio) {
+metronom_t * metronom_init (int have_audio, void *xine) {
metronom_t *this = xine_xmalloc (sizeof (metronom_t));
int err;
+ this->xine = xine;
this->audio_stream_start = metronom_audio_stream_start;
this->audio_stream_end = metronom_audio_stream_end ;
this->video_stream_start = metronom_video_stream_start;
@@ -880,8 +902,8 @@ metronom_t * metronom_init (int have_audio) {
if ((err = pthread_create(&this->sync_thread, NULL,
(void*(*)(void*)) metronom_sync_loop, this)) != 0)
- printf("metronom: cannot create sync thread (%s)\n",
- strerror(err));
+ LOG_MSG(this->xine, _("metronom: cannot create sync thread (%s)\n"),
+ strerror(err));
pthread_mutex_init (&this->lock, NULL);
pthread_cond_init (&this->video_started, NULL);
@@ -896,4 +918,3 @@ metronom_t * metronom_init (int have_audio) {
return this;
}
-
diff --git a/src/xine-engine/metronom.h b/src/xine-engine/metronom.h
index 1fc00c240..18dd2ca8e 100644
--- a/src/xine-engine/metronom.h
+++ b/src/xine-engine/metronom.h
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: metronom.h,v 1.15 2001/12/22 20:16:49 miguelfreitas Exp $
+ * $Id: metronom.h,v 1.16 2001/12/27 14:30:30 f1rmb Exp $
*
* metronom: general pts => virtual calculation/assoc
*
@@ -57,6 +57,12 @@ typedef struct scr_plugin_s scr_plugin_t;
struct metronom_s {
/*
+ * Pointer to current xine object. We use a void pointer to avoid type declaration clash.
+ * Ugly but working.
+ */
+ void *xine;
+
+ /*
* this is called to tell metronom to prepare for a new video stream
* (video and audio decoder threads may be blocked at these functions
* to synchronize starting and stopping)
@@ -272,7 +278,7 @@ struct metronom_s {
int avg_frame_duration;
};
-metronom_t *metronom_init (int have_audio);
+metronom_t *metronom_init (int have_audio, void *xine);
/*
* SCR plugins
diff --git a/src/xine-engine/resample.c b/src/xine-engine/resample.c
index 8da9897a7..4b363735c 100644
--- a/src/xine-engine/resample.c
+++ b/src/xine-engine/resample.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: resample.c,v 1.1 2001/08/21 19:48:48 jcdutton Exp $
+ * $Id: resample.c,v 1.2 2001/12/27 14:30:30 f1rmb Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -278,5 +278,3 @@ void audio_out_resample_6channel(int16_t* input_samples, uint32_t in_samples,
output_samples[out_samples*6-2] = input_samples[in_samples*6-2];
output_samples[out_samples*6-1] = input_samples[in_samples*6-1];
}
-
-
diff --git a/src/xine-engine/video_out.c b/src/xine-engine/video_out.c
index 15c54ad7b..a32ce6f88 100644
--- a/src/xine-engine/video_out.c
+++ b/src/xine-engine/video_out.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: video_out.c,v 1.60 2001/12/24 16:31:57 hrm Exp $
+ * $Id: video_out.c,v 1.61 2001/12/27 14:30:30 f1rmb Exp $
*
*/
@@ -36,6 +36,26 @@
#include "xine_internal.h"
#include "xineutils.h"
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_VIDEO, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_VIDEO, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_VIDEO, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_VIDEO, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
/*
#define VIDEO_OUT_LOG
*/
@@ -186,7 +206,7 @@ static void *video_out_loop (void *this_gen) {
sigemptyset(&vo_mask);
sigaddset(&vo_mask, SIGALRM);
if (sigprocmask (SIG_UNBLOCK, &vo_mask, NULL)) {
- printf ("video_out: sigprocmask failed.\n");
+ LOG_MSG(this->xine, _("video_out: sigprocmask failed.\n"));
}
#if HAVE_SIGACTION
{
@@ -248,9 +268,9 @@ static void *video_out_loop (void *this_gen) {
absdiff = abs(diff);
if (diff >this->pts_per_half_frame) {
- printf ( "video_out : throwing away image with pts %d because "
- "it's too old (diff : %d > %d).\n",pts,diff,
- this->pts_per_half_frame);
+ LOG_MSG(this->xine, _("video_out : throwing away image with pts %d because "
+ "it's too old (diff : %d > %d).\n"),
+ pts, diff, this->pts_per_half_frame);
this->num_frames_discarded++;
@@ -387,7 +407,7 @@ static void *video_out_loop (void *this_gen) {
if (img && !img->next) {
if (img_backup) {
- printf("video_out : overwriting frame backup\n");
+ LOG_MSG(this->xine, _("video_out : overwriting frame backup\n"));
vo_append_to_img_buf_queue (this->free_img_buf_queue, img_backup);
}
@@ -491,15 +511,15 @@ static void vo_open (vo_instance_t *this) {
if((err = pthread_create (&this->video_thread,
&pth_attrs, video_out_loop, this)) != 0) {
- printf ("video_out : can't create thread (%s)\n", strerror(err));
+ LOG_MSG(this->xine, _("video_out : can't create thread (%s)\n"), strerror(err));
/* FIXME: how does this happen ? */
- printf ("video_out : sorry, this should not happen. please restart xine.\n");
+ LOG_MSG(this->xine, _("video_out : sorry, this should not happen. please restart xine.\n"));
exit(1);
}
else
- printf ("video_out : thread created\n");
+ LOG_MSG(this->xine, _("video_out : thread created\n"));
} else
- printf ("video_out : vo_open : warning! video thread already running\n");
+ LOG_MSG(this->xine, _("video_out : vo_open : warning! video thread already running\n"));
}
@@ -696,7 +716,7 @@ static int vo_frame_draw (vo_frame_t *img) {
#endif
if (img->display_locked) {
- printf ("video_out : ALERT! frame is already locked for displaying\n");
+ LOG_MSG(this->xine, _("video_out : ALERT! frame is already locked for displaying\n"));
return frames_to_skip;
}
@@ -709,7 +729,7 @@ static int vo_frame_draw (vo_frame_t *img) {
printf ("video_out : frame rejected, %d frames to skip\n", frames_to_skip);
#endif
- printf ("vo_frame_draw: rejected, %d frames to skip\n", frames_to_skip);
+ LOG_MSG(this->xine, _("vo_frame_draw: rejected, %d frames to skip\n"), frames_to_skip);
pthread_mutex_lock (&img->mutex);
img->display_locked = 0;
@@ -756,9 +776,9 @@ static int vo_frame_draw (vo_frame_t *img) {
*/
if (this->num_frames_delivered>199) {
- fprintf (stderr,
- "%d frames delivered, %d frames skipped, %d frames discarded\n",
- this->num_frames_delivered, this->num_frames_skipped, this->num_frames_discarded);
+ LOG_MSG_STDERR(this->xine,
+ _("%d frames delivered, %d frames skipped, %d frames discarded\n"),
+ this->num_frames_delivered, this->num_frames_skipped, this->num_frames_discarded);
this->num_frames_delivered = 0;
this->num_frames_discarded = 0;
diff --git a/src/xine-engine/xine.c b/src/xine-engine/xine.c
index 0c7725a0d..6ecea0236 100644
--- a/src/xine-engine/xine.c
+++ b/src/xine-engine/xine.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: xine.c,v 1.93 2001/12/24 00:45:03 guenter Exp $
+ * $Id: xine.c,v 1.94 2001/12/27 14:30:30 f1rmb Exp $
*
* top-level xine functions
*
@@ -56,6 +56,26 @@
#include "xineutils.h"
#include "compat.h"
+#ifdef __GNUC__
+#define LOG_MSG_STDERR(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_MSG, message, ##args); \
+ fprintf(stderr, message, ##args); \
+ }
+#define LOG_MSG(xine, message, args...) { \
+ xine_log(xine, XINE_LOG_MSG, message, ##args); \
+ printf(message, ##args); \
+ }
+#else
+#define LOG_MSG_STDERR(xine, ...) { \
+ xine_log(xine, XINE_LOG_MSG, __VAR_ARGS__); \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#define LOG_MSG(xine, ...) { \
+ xine_log(xine, XINE_LOG_MSG, __VAR_ARGS__); \
+ printf(__VA_ARGS__); \
+ }
+#endif
+
void * xine_notify_stream_finished_thread (void * this_gen) {
xine_t *this = this_gen;
xine_event_t event;
@@ -84,8 +104,8 @@ void xine_notify_stream_finished (xine_t *this) {
*/
if ((err = pthread_create (&finished_thread,
NULL, xine_notify_stream_finished_thread, this)) != 0) {
- fprintf (stderr, "xine_notify_stream_finished: can't create new thread (%s)\n",
- strerror(err));
+ LOG_MSG_STDERR(this, _("xine_notify_stream_finished: can't create new thread (%s)\n"),
+ strerror(err));
exit (1);
}
}
@@ -126,12 +146,12 @@ void xine_stop_internal (xine_t *this) {
pthread_mutex_lock (&this->xine_lock);
- printf ("xine_stop\n");
+ LOG_MSG(this, _("xine_stop\n"));
xine_internal_osd (this, "}", this->metronom->get_current_time (this->metronom), 30000);
if (this->status == XINE_STOP) {
- printf ("xine_stop ignored\n");
+ LOG_MSG(this, _("xine_stop ignored\n"));
pthread_mutex_unlock (&this->xine_lock);
return;
}
@@ -144,7 +164,7 @@ void xine_stop_internal (xine_t *this) {
this->audio_out->audio_paused = 0;
this->status = XINE_STOP;
- printf ("xine_stop: stopping demuxer\n");
+ LOG_MSG(this, _("xine_stop: stopping demuxer\n"));
if(this->cur_demuxer_plugin) {
this->cur_demuxer_plugin->stop (this->cur_demuxer_plugin);
@@ -161,7 +181,7 @@ void xine_stop_internal (xine_t *this) {
*/
}
- printf ("xine_stop: done\n");
+ LOG_MSG(this, _("xine_stop: done\n"));
pthread_mutex_unlock (&this->xine_lock);
}
@@ -192,8 +212,8 @@ static int try_demux_with_stages(xine_t *this, const char *MRL,
stages[2] = -1;
if(stages[0] == -1) {
- fprintf(stderr, "%s(%d) wrong first stage = %d !!\n",
- __XINE_FUNCTION__, __LINE__, stage1);
+ LOG_MSG_STDERR(this, _("%s(%d) wrong first stage = %d !!\n"),
+ __XINE_FUNCTION__, __LINE__, stage1);
return 0;
}
@@ -255,12 +275,8 @@ int xine_play (xine_t *this, char *mrl,
off_t pos, len;
int i;
- printf ("xine_play: xine open %s, start pos = %d, start time = %d (sec)\n",
- mrl, start_pos, start_time);
-
- xine_log (this, XINE_LOG_MSG,
- "xine_play: xine open %s, start pos = %d, start time = %d (sec)\n",
- mrl, start_pos, start_time);
+ LOG_MSG(this, _("xine_play: xine open %s, start pos = %d, start time = %d (sec)\n"),
+ mrl, start_pos, start_time);
pthread_mutex_lock (&this->xine_lock);
@@ -304,7 +320,7 @@ int xine_play (xine_t *this, char *mrl,
}
if (!this->cur_input_plugin) {
- printf ("xine: cannot find input plugin for this MRL\n");
+ LOG_MSG(this, _("xine: cannot find input plugin for this MRL\n"));
this->cur_demuxer_plugin = NULL;
this->err = XINE_ERROR_NO_INPUT_PLUGIN;
pthread_mutex_unlock (&this->xine_lock);
@@ -312,28 +328,21 @@ int xine_play (xine_t *this, char *mrl,
return 0;
}
- xine_log (this, XINE_LOG_MSG,
- "xine: using input plugin >%s< for this MRL (%s).\n",
- this->cur_input_plugin->get_identifier(this->cur_input_plugin), mrl);
- printf ("xine: using input plugin >%s< for this MRL (%s).\n",
- this->cur_input_plugin->get_identifier(this->cur_input_plugin), mrl);
+ LOG_MSG(this, _("xine: using input plugin >%s< for this MRL (%s).\n"),
+ this->cur_input_plugin->get_identifier(this->cur_input_plugin), mrl);
/*
* find demuxer plugin
*/
if (!find_demuxer(this, mrl)) {
- printf ("xine: couldn't find demuxer for >%s<\n", mrl);
+ LOG_MSG(this, _("xine: couldn't find demuxer for >%s<\n"), mrl);
this->err = XINE_ERROR_NO_DEMUXER_PLUGIN;
pthread_mutex_unlock (&this->xine_lock);
return 0;
}
- xine_log (this, XINE_LOG_MSG,
- "xine: using demuxer plugin >%s< for this MRL.\n",
- this->cur_demuxer_plugin->get_identifier());
-
- printf ("xine: using demuxer plugin >%s< for this MRL.\n",
+ LOG_MSG(this, _("xine: using demuxer plugin >%s< for this MRL.\n"),
this->cur_demuxer_plugin->get_identifier());
/*
@@ -353,7 +362,7 @@ int xine_play (xine_t *this, char *mrl,
pos, start_time);
if (this->cur_demuxer_plugin->get_status(this->cur_demuxer_plugin) != DEMUX_OK) {
- printf("xine_play: demuxer failed to start\n");
+ LOG_MSG(this, _("xine_play: demuxer failed to start\n"));
this->cur_input_plugin->close(this->cur_input_plugin);
@@ -402,17 +411,17 @@ void xine_exit (xine_t *this) {
xine_stop(this);
- printf ("xine_exit: shutdown audio\n");
+ LOG_MSG(this, _("xine_exit: shutdown audio\n"));
audio_decoder_shutdown (this);
- printf ("xine_exit: shutdown video\n");
+ LOG_MSG(this, _("xine_exit: shutdown video\n"));
video_decoder_shutdown (this);
this->status = XINE_QUIT;
- printf ("xine_exit: bye!\n");
+ LOG_MSG(this, _("xine_exit: bye!\n"));
xine_profiler_print_results ();
@@ -427,21 +436,25 @@ xine_t *xine_init (vo_driver_t *vo,
"extension", NULL};
int i;
- printf("xine_init entered\n");
+ /* init log buffers */
+ for (i = 0; i < XINE_LOG_NUM; i++)
+ this->log_buffers[i] = new_scratch_buffer (25);
+
+#ifdef ENABLE_NLS
+ bindtextdomain("xine-lib", XINE_LOCALEDIR);
+#endif
+ LOG_MSG(this, _("xine_init entered\n"));
+
this->err = XINE_ERROR_NONE;
this->config = config;
+
/* probe for optimized memcpy or config setting */
xine_probe_fast_memcpy(config);
/* initialize aligned mem allocator */
xine_init_mem_aligned();
- /* init log buffers */
-
- for (i=0; i<XINE_LOG_NUM; i++)
- this->log_buffers[i] = new_scratch_buffer (25);
-
/*
* init locks
*/
@@ -462,7 +475,7 @@ xine_t *xine_init (vo_driver_t *vo,
* create a metronom
*/
- this->metronom = metronom_init (ao != NULL);
+ this->metronom = metronom_init (ao != NULL, (void *)this);
/*
* load input and demuxer plugins
@@ -504,7 +517,7 @@ xine_t *xine_init (vo_driver_t *vo,
this->audio_out = ao_new_instance (ao, this->metronom, config);
audio_decoder_init (this);
- printf("xine_init returning\n");
+ LOG_MSG(this, _("xine_init returning\n"));
return this;
}
@@ -545,7 +558,7 @@ int xine_get_current_position (xine_t *this) {
pthread_mutex_lock (&this->xine_lock);
if (!this->cur_input_plugin) {
- printf ("xine: xine_get_current_position: no input source\n");
+ LOG_MSG(this, _("xine: xine_get_current_position: no input source\n"));
pthread_mutex_unlock (&this->xine_lock);
return 0;
}
@@ -666,7 +679,7 @@ void xine_set_speed (xine_t *this, int speed) {
nanosleep (&tenth_sec, NULL);
- printf ("xine: set_speed %d\n", speed);
+ LOG_MSG(this, _("xine: set_speed %d\n"), speed);
this->metronom->set_speed (this->metronom, speed);
@@ -819,13 +832,22 @@ osd_renderer_t *xine_get_osd_renderer (xine_t *this) {
/*
* log functions
*/
-const char **xine_get_log_names(void) {
- static const char *log_sections[XINE_LOG_NUM + 1] = {
- "messages", /* XINE_LOG_MSG */
- "codecs", /* XINE_LOG_CODEC */
- NULL
- };
+unsigned int xine_get_log_section_count(void) {
+ return XINE_LOG_NUM;
+}
+const char **xine_get_log_names(void) {
+ static const char *log_sections[XINE_LOG_NUM + 1];
+
+ log_sections[XINE_LOG_MSG] = _("messages"); /* XINE_LOG_MSG */
+ log_sections[XINE_LOG_INPUT] = _("inputs"); /* XINE_LOG_INPUT */
+ log_sections[XINE_LOG_DEMUX] = _("demuxers"); /* XINE_LOG_DEMUX */
+ log_sections[XINE_LOG_CODEC] = _("codecs"); /* XINE_LOG_CODEC */
+ log_sections[XINE_LOG_VIDEO] = _("video"); /* XINE_LOG_VIDEO */
+ log_sections[XINE_LOG_METRONOM] = _("metronom"); /* XINE_LOG_METRONOM */
+ log_sections[XINE_LOG_PLUGIN] = _("plugin"); /* XINE_LOG_PLUGIN */
+ log_sections[XINE_LOG_NUM] = NULL;
+
return log_sections;
}
diff --git a/src/xine-engine/xine_internal.h b/src/xine-engine/xine_internal.h
index 9421ed650..a4f960136 100644
--- a/src/xine-engine/xine_internal.h
+++ b/src/xine-engine/xine_internal.h
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: xine_internal.h,v 1.66 2001/12/24 00:45:03 guenter Exp $
+ * $Id: xine_internal.h,v 1.67 2001/12/27 14:30:30 f1rmb Exp $
*
*/
@@ -50,6 +50,7 @@ extern "C" {
#endif
#include "osd.h"
#include "scratch.h"
+#include "xineintl.h"
#define INPUT_PLUGIN_MAX 50
#define DEMUXER_PLUGIN_MAX 50
@@ -137,9 +138,14 @@ struct audio_decoder_s {
/*
* log output
*/
-#define XINE_LOG_MSG 0
-#define XINE_LOG_CODEC 1
-#define XINE_LOG_NUM 2 /* # of log buffers defined */
+#define XINE_LOG_MSG 0
+#define XINE_LOG_INPUT 1
+#define XINE_LOG_DEMUX 2
+#define XINE_LOG_CODEC 3
+#define XINE_LOG_VIDEO 4
+#define XINE_LOG_METRONOM 5
+#define XINE_LOG_PLUGIN 6
+#define XINE_LOG_NUM 7 /* # of log buffers defined */
typedef void (*xine_event_listener_t) (void *user_data, xine_event_t *);
diff --git a/src/xine-engine/xineintl.h b/src/xine-engine/xineintl.h
new file mode 100644
index 000000000..a2b1fcdd7
--- /dev/null
+++ b/src/xine-engine/xineintl.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2000-2001 the xine project
+ *
+ * This file is part of xine, a unix video player.
+ *
+ * xine is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * xine is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * $Id: xineintl.h,v 1.1 2001/12/27 14:30:30 f1rmb Exp $
+ *
+ */
+
+#ifndef HAVE_XINEINTL_H
+#define HAVE_XINEINTL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <locale.h>
+
+#ifdef ENABLE_NLS
+# include <libintl.h>
+# define _(String) dgettext ("xine-lib", String)
+# ifdef gettext_noop
+# define N_(String) gettext_noop (String)
+# else
+# define N_(String) (String)
+# endif
+#else
+/* Stubs that do something close enough. */
+# define textdomain(String) (String)
+# define gettext(String) (String)
+# define dgettext(Domain,Message) (Message)
+# define dcgettext(Domain,Message,Type) (Message)
+# define bindtextdomain(Domain,Directory) (Domain)
+# define _(String) (String)
+# define N_(String) (String)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif