Initial revision
authorPekka Riikonen <priikone@silcnet.org>
Sun, 18 Nov 2001 13:18:37 +0000 (13:18 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sun, 18 Nov 2001 13:18:37 +0000 (13:18 +0000)
106 files changed:
apps/silcer/ABOUT-NLS [new file with mode: 0644]
apps/silcer/AUTHORS [new file with mode: 0644]
apps/silcer/COPYING [new file with mode: 0644]
apps/silcer/ChangeLog [new file with mode: 0644]
apps/silcer/INSTALL [new file with mode: 0644]
apps/silcer/Makefile.am [new file with mode: 0644]
apps/silcer/Makefile.in [new file with mode: 0644]
apps/silcer/NEWS [new file with mode: 0644]
apps/silcer/README [new file with mode: 0644]
apps/silcer/acconfig.h [new file with mode: 0644]
apps/silcer/aclocal.m4 [new file with mode: 0644]
apps/silcer/autogen.sh [new file with mode: 0755]
apps/silcer/config.guess [new file with mode: 0755]
apps/silcer/config.h.in [new file with mode: 0644]
apps/silcer/config.sub [new file with mode: 0755]
apps/silcer/configure.in [new file with mode: 0644]
apps/silcer/depcomp [new file with mode: 0755]
apps/silcer/install-sh [new file with mode: 0755]
apps/silcer/intl/ChangeLog [new file with mode: 0644]
apps/silcer/intl/Makefile.in [new file with mode: 0644]
apps/silcer/intl/Makefile.in.in [new file with mode: 0644]
apps/silcer/intl/VERSION [new file with mode: 0644]
apps/silcer/intl/bindtextdom.c [new file with mode: 0644]
apps/silcer/intl/config.charset [new file with mode: 0755]
apps/silcer/intl/dcgettext.c [new file with mode: 0644]
apps/silcer/intl/dcigettext.c [new file with mode: 0644]
apps/silcer/intl/dcngettext.c [new file with mode: 0644]
apps/silcer/intl/dgettext.c [new file with mode: 0644]
apps/silcer/intl/dngettext.c [new file with mode: 0644]
apps/silcer/intl/explodename.c [new file with mode: 0644]
apps/silcer/intl/finddomain.c [new file with mode: 0644]
apps/silcer/intl/gettext.c [new file with mode: 0644]
apps/silcer/intl/gettext.h [new file with mode: 0644]
apps/silcer/intl/gettextP.h [new file with mode: 0644]
apps/silcer/intl/hash-string.h [new file with mode: 0644]
apps/silcer/intl/intl-compat.c [new file with mode: 0644]
apps/silcer/intl/l10nflist.c [new file with mode: 0644]
apps/silcer/intl/libgettext.h [new file with mode: 0644]
apps/silcer/intl/libgnuintl.h [new file with mode: 0644]
apps/silcer/intl/loadinfo.h [new file with mode: 0644]
apps/silcer/intl/loadmsgcat.c [new file with mode: 0644]
apps/silcer/intl/localcharset.c [new file with mode: 0644]
apps/silcer/intl/locale.alias [new file with mode: 0644]
apps/silcer/intl/localealias.c [new file with mode: 0644]
apps/silcer/intl/ngettext.c [new file with mode: 0644]
apps/silcer/intl/plural.c [new file with mode: 0644]
apps/silcer/intl/plural.y [new file with mode: 0644]
apps/silcer/intl/ref-add.sin [new file with mode: 0644]
apps/silcer/intl/ref-del.sin [new file with mode: 0644]
apps/silcer/intl/textdomain.c [new file with mode: 0644]
apps/silcer/macros/Makefile.am [new file with mode: 0644]
apps/silcer/macros/Makefile.in [new file with mode: 0644]
apps/silcer/macros/aclocal-include.m4 [new file with mode: 0644]
apps/silcer/macros/autogen.sh [new file with mode: 0644]
apps/silcer/macros/compiler-flags.m4 [new file with mode: 0644]
apps/silcer/macros/curses.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-bonobo-check.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-common.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-fileutils.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-ghttp-check.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-gnorba-check.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-guile-checks.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-libgtop-check.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-objc-checks.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-orbit-check.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-print-check.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-pthread-check.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-support.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-undelfs.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-vfs.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-x-checks.m4 [new file with mode: 0644]
apps/silcer/macros/gnome-xml-check.m4 [new file with mode: 0644]
apps/silcer/macros/gnome.m4 [new file with mode: 0644]
apps/silcer/macros/gperf-check.m4 [new file with mode: 0644]
apps/silcer/macros/linger.m4 [new file with mode: 0644]
apps/silcer/macros/need-declaration.m4 [new file with mode: 0644]
apps/silcer/missing [new file with mode: 0755]
apps/silcer/mkinstalldirs [new file with mode: 0755]
apps/silcer/pixmaps/glade-group.xpm [new file with mode: 0644]
apps/silcer/po/ChangeLog [new file with mode: 0644]
apps/silcer/po/Makefile.in.in [new file with mode: 0644]
apps/silcer/po/POTFILES.in [new file with mode: 0644]
apps/silcer/silcer.png [new file with mode: 0644]
apps/silcer/src/Makefile.am [new file with mode: 0644]
apps/silcer/src/Makefile.in [new file with mode: 0644]
apps/silcer/src/SilcerMainDlg.cc [new file with mode: 0644]
apps/silcer/src/SilcerMainDlg.hh [new file with mode: 0644]
apps/silcer/src/gtkspell.c [new file with mode: 0644]
apps/silcer/src/gtkspell.h [new file with mode: 0644]
apps/silcer/src/gtkurl.c [new file with mode: 0644]
apps/silcer/src/gtkurl.h [new file with mode: 0644]
apps/silcer/src/silcer.cc [new file with mode: 0644]
apps/silcer/src/silcer_gladehelper.hh [new file with mode: 0644]
apps/silcer/src/silcerapp.cc [new file with mode: 0644]
apps/silcer/src/silcerapp.hh [new file with mode: 0644]
apps/silcer/src/silcerbasewin.cc [new file with mode: 0644]
apps/silcer/src/silcerbasewin.hh [new file with mode: 0644]
apps/silcer/src/silcerchatview.cc [new file with mode: 0644]
apps/silcer/src/silcerchatview.hh [new file with mode: 0644]
apps/silcer/src/xtext.c [new file with mode: 0644]
apps/silcer/src/xtext.h [new file with mode: 0644]
apps/silcer/stamp-h.in [new file with mode: 0644]
apps/silcer/ui/SilcerMainDlg.glade [new file with mode: 0644]
apps/silcer/xml-i18n-extract.in [new file with mode: 0644]
apps/silcer/xml-i18n-merge.in [new file with mode: 0644]
apps/silcer/xml-i18n-update.in [new file with mode: 0644]

diff --git a/apps/silcer/ABOUT-NLS b/apps/silcer/ABOUT-NLS
new file mode 100644 (file)
index 0000000..a4fb870
--- /dev/null
@@ -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/apps/silcer/AUTHORS b/apps/silcer/AUTHORS
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/apps/silcer/COPYING b/apps/silcer/COPYING
new file mode 100644 (file)
index 0000000..d60c31a
--- /dev/null
@@ -0,0 +1,340 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/apps/silcer/ChangeLog b/apps/silcer/ChangeLog
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/apps/silcer/INSTALL b/apps/silcer/INSTALL
new file mode 100644 (file)
index 0000000..b42a17a
--- /dev/null
@@ -0,0 +1,182 @@
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+   The file `configure.in' is used to create `configure' by a program
+called `autoconf'.  You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  You can give `configure'
+initial values for variables by setting them in the environment.  Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory.  After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on.  Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+     CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+   If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+     Use and save the results of the tests in FILE instead of
+     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
+     debugging `configure'.
+
+`--help'
+     Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--version'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
diff --git a/apps/silcer/Makefile.am b/apps/silcer/Makefile.am
new file mode 100644 (file)
index 0000000..8475507
--- /dev/null
@@ -0,0 +1,28 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = intl po macros src
+
+EXTRA_DIST = \
+       autogen.sh ui
+
+install-data-local:
+       @$(NORMAL_INSTALL)
+       if test -d $(srcdir)/pixmaps; then \
+         $(mkinstalldirs) $(DESTDIR)$(datadir)/pixmaps/$(PACKAGE); \
+         for pixmap in $(srcdir)/pixmaps/*; do \
+           if test -f $$pixmap; then \
+             $(INSTALL_DATA) $$pixmap $(DESTDIR)$(datadir)/pixmaps/$(PACKAGE); \
+           fi \
+         done \
+       fi
+
+dist-hook:
+       if test -d pixmaps; then \
+         mkdir $(distdir)/pixmaps; \
+         for pixmap in pixmaps/*; do \
+           if test -f $$pixmap; then \
+             cp -p $$pixmap $(distdir)/pixmaps; \
+           fi \
+         done \
+       fi
+
diff --git a/apps/silcer/Makefile.in b/apps/silcer/Makefile.in
new file mode 100644 (file)
index 0000000..ebbd4c1
--- /dev/null
@@ -0,0 +1,480 @@
+# Makefile.in generated automatically by automake 1.5 from Makefile.am.
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AMTAR = @AMTAR@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CXX = @CXX@
+DATADIRNAME = @DATADIRNAME@
+DEPDIR = @DEPDIR@
+EXEEXT = @EXEEXT@
+EXTRA_GNOME_CFLAGS = @EXTRA_GNOME_CFLAGS@
+EXTRA_GNOME_LIBS = @EXTRA_GNOME_LIBS@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOMEGNORBA_LIBS = @GNOMEGNORBA_LIBS@
+GNOMEUI_LIBS = @GNOMEUI_LIBS@
+GNOME_ACLOCAL_DIR = @GNOME_ACLOCAL_DIR@
+GNOME_APPLETS_LIBS = @GNOME_APPLETS_LIBS@
+GNOME_CAPPLET_LIBS = @GNOME_CAPPLET_LIBS@
+GNOME_CONFIG = @GNOME_CONFIG@
+GNOME_DOCKLETS_LIBS = @GNOME_DOCKLETS_LIBS@
+GNOME_INCLUDEDIR = @GNOME_INCLUDEDIR@
+GNOME_LIBDIR = @GNOME_LIBDIR@
+GNOME_LIBS = @GNOME_LIBS@
+GNORBA_CFLAGS = @GNORBA_CFLAGS@
+GNORBA_LIBS = @GNORBA_LIBS@
+GTKXMHTML_LIBS = @GTKXMHTML_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIBICONV = @LIBICONV@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+OBJEXT = @OBJEXT@
+ORBIT_CFLAGS = @ORBIT_CFLAGS@
+ORBIT_CONFIG = @ORBIT_CONFIG@
+ORBIT_IDL = @ORBIT_IDL@
+ORBIT_LIBS = @ORBIT_LIBS@
+PACKAGE = @PACKAGE@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PTHREAD_LIB = @PTHREAD_LIB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XML_I18N_EXTRACT = @XML_I18N_EXTRACT@
+XML_I18N_MERGE = @XML_I18N_MERGE@
+XML_I18N_TOOLS_PERL = @XML_I18N_TOOLS_PERL@
+XML_I18N_UPDATE = @XML_I18N_UPDATE@
+XPM_LIBS = @XPM_LIBS@
+ZVT_LIBS = @ZVT_LIBS@
+am__include = @am__include@
+am__quote = @am__quote@
+cflags_set = @cflags_set@
+cxxflags_set = @cxxflags_set@
+install_sh = @install_sh@
+
+SUBDIRS = intl po macros src
+
+EXTRA_DIST = \
+       autogen.sh ui
+
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = intl/Makefile
+DIST_SOURCES =
+
+RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \
+       uninstall-info-recursive all-recursive install-data-recursive \
+       install-exec-recursive installdirs-recursive install-recursive \
+       uninstall-recursive check-recursive installcheck-recursive
+DIST_COMMON = README ./stamp-h.in ABOUT-NLS AUTHORS COPYING ChangeLog \
+       INSTALL Makefile.am Makefile.in NEWS acconfig.h aclocal.m4 \
+       config.guess config.h.in config.sub configure configure.in \
+       depcomp install-sh missing mkinstalldirs
+DIST_SUBDIRS = $(SUBDIRS)
+all: config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  Makefile
+Makefile:  $(srcdir)/Makefile.in  $(top_builddir)/config.status
+       cd $(top_builddir) && \
+         CONFIG_HEADERS= CONFIG_LINKS= \
+         CONFIG_FILES=$@ $(SHELL) ./config.status
+
+$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+$(srcdir)/configure:  $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
+       cd $(srcdir) && $(AUTOCONF)
+
+$(ACLOCAL_M4):  configure.in 
+       cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+config.h: stamp-h
+       @if test ! -f $@; then \
+               rm -f stamp-h; \
+               $(MAKE) stamp-h; \
+       else :; fi
+stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status
+       @rm -f stamp-h stamp-hT
+       @echo timestamp > stamp-hT 2> /dev/null
+       cd $(top_builddir) \
+         && CONFIG_FILES= CONFIG_HEADERS=config.h \
+            $(SHELL) ./config.status
+       @mv stamp-hT stamp-h
+$(srcdir)/config.h.in:  $(srcdir)/./stamp-h.in
+       @if test ! -f $@; then \
+               rm -f $(srcdir)/./stamp-h.in; \
+               $(MAKE) $(srcdir)/./stamp-h.in; \
+       else :; fi
+$(srcdir)/./stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) $(top_srcdir)/acconfig.h
+       @rm -f $(srcdir)/./stamp-h.in $(srcdir)/./stamp-h.inT
+       @echo timestamp > $(srcdir)/./stamp-h.inT 2> /dev/null
+       cd $(top_srcdir) && $(AUTOHEADER)
+       @mv $(srcdir)/./stamp-h.inT $(srcdir)/./stamp-h.in
+
+distclean-hdr:
+       -rm -f config.h
+intl/Makefile: $(top_builddir)/config.status $(top_srcdir)/intl/Makefile.in
+       cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= CONFIG_LINKS= $(SHELL) ./config.status
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       rev=''; for subdir in $$list; do \
+         if test "$$subdir" = "."; then :; else \
+           rev="$$subdir $$rev"; \
+         fi; \
+       done; \
+       rev="$$rev ."; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \
+         || etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP)
+
+GTAGS:
+       here=`CDPATH=: && cd $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
+
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = .
+# Avoid unsightly `./'.
+distdir = $(PACKAGE)-$(VERSION)
+
+GZIP_ENV = --best
+
+distdir: $(DISTFILES)
+       -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir)
+       mkdir $(distdir)
+       $(mkinstalldirs) $(distdir)/intl $(distdir)/po
+       @for file in $(DISTFILES); do \
+         if test -f $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           $(mkinstalldirs) "$(distdir)/$$dir"; \
+         fi; \
+         if test -d $$d/$$file; then \
+           cp -pR $$d/$$file $(distdir) \
+           || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+       for subdir in $(SUBDIRS); do \
+         if test "$$subdir" = .; then :; else \
+           test -d $(distdir)/$$subdir \
+           || mkdir $(distdir)/$$subdir \
+           || exit 1; \
+           (cd $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$(top_distdir)" \
+               distdir=../$(distdir)/$$subdir \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+       $(MAKE) $(AM_MAKEFLAGS) \
+         top_distdir="${top_distdir}" distdir="$(distdir)" \
+         dist-hook
+       -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+         ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+       || chmod -R a+r $(distdir)
+dist: distdir
+       $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir)
+       GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf -
+       chmod -R a-w $(distdir); chmod a+w $(distdir)
+       mkdir $(distdir)/=build
+       mkdir $(distdir)/=inst
+       chmod a-w $(distdir)
+       dc_install_base=`CDPATH=: && cd $(distdir)/=inst && pwd` \
+         && cd $(distdir)/=build \
+         && ../configure --srcdir=.. --prefix=$$dc_install_base \
+           --with-included-gettext \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+         && (test `find $$dc_install_base -type f -print | wc -l` -le 1 \
+            || (echo "Error: files left after uninstall" 1>&2; \
+                exit 1) ) \
+         && $(MAKE) $(AM_MAKEFLAGS) dist \
+         && $(MAKE) $(AM_MAKEFLAGS) distclean \
+         && rm -f $(distdir).tar.gz \
+         && (test `find . -type f -print | wc -l` -eq 0 \
+            || (echo "Error: files left after distclean" 1>&2; \
+                exit 1) )
+       -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir)
+       @echo "$(distdir).tar.gz is ready for distribution" | \
+         sed 'h;s/./=/g;p;x;p;x'
+check-am: all-am
+check: check-recursive
+all-am: Makefile config.h
+installdirs: installdirs-recursive
+installdirs-am:
+
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+dist-all: distdir
+       $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir)
+distclean: distclean-recursive
+       -rm -f config.status config.cache config.log
+distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-data-local
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \
+       clean-generic clean-recursive dist dist-all distcheck distclean \
+       distclean-generic distclean-hdr distclean-recursive \
+       distclean-tags distdir dvi dvi-am dvi-recursive info info-am \
+       info-recursive install install-am install-data install-data-am \
+       install-data-local install-data-recursive install-exec \
+       install-exec-am install-exec-recursive install-info \
+       install-info-am install-info-recursive install-man \
+       install-recursive install-strip installcheck installcheck-am \
+       installdirs installdirs-am installdirs-recursive \
+       maintainer-clean maintainer-clean-generic \
+       maintainer-clean-recursive mostlyclean mostlyclean-generic \
+       mostlyclean-recursive tags tags-recursive uninstall \
+       uninstall-am uninstall-info-am uninstall-info-recursive \
+       uninstall-recursive
+
+
+install-data-local:
+       @$(NORMAL_INSTALL)
+       if test -d $(srcdir)/pixmaps; then \
+         $(mkinstalldirs) $(DESTDIR)$(datadir)/pixmaps/$(PACKAGE); \
+         for pixmap in $(srcdir)/pixmaps/*; do \
+           if test -f $$pixmap; then \
+             $(INSTALL_DATA) $$pixmap $(DESTDIR)$(datadir)/pixmaps/$(PACKAGE); \
+           fi \
+         done \
+       fi
+
+dist-hook:
+       if test -d pixmaps; then \
+         mkdir $(distdir)/pixmaps; \
+         for pixmap in pixmaps/*; do \
+           if test -f $$pixmap; then \
+             cp -p $$pixmap $(distdir)/pixmaps; \
+           fi \
+         done \
+       fi
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/apps/silcer/NEWS b/apps/silcer/NEWS
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/apps/silcer/README b/apps/silcer/README
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/apps/silcer/acconfig.h b/apps/silcer/acconfig.h
new file mode 100644 (file)
index 0000000..894805b
--- /dev/null
@@ -0,0 +1,12 @@
+#undef ENABLE_NLS
+#undef HAVE_CATGETS
+#undef HAVE_GETTEXT
+#undef HAVE_LC_MESSAGES
+#undef HAVE_STPCPY
+#undef HAVE_LIBSM
+#undef PACKAGE_LOCALE_DIR
+#undef PACKAGE_DATA_DIR
+#undef PACKAGE_SOURCE_DIR
+
+#undef EXTRA_GNOME_LIBS
+#undef EXTRA_GNOME_CFLAGS
diff --git a/apps/silcer/aclocal.m4 b/apps/silcer/aclocal.m4
new file mode 100644 (file)
index 0000000..aa0c77c
--- /dev/null
@@ -0,0 +1,1949 @@
+# aclocal.m4 generated automatically by aclocal 1.5
+
+# Copyright 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Do all the work for Automake.  This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 5
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# We require 2.13 because we rely on SHELL being computed by configure.
+AC_PREREQ([2.13])
+
+# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
+# -----------------------------------------------------------
+# If MACRO-NAME is provided do IF-PROVIDED, else IF-NOT-PROVIDED.
+# The purpose of this macro is to provide the user with a means to
+# check macros which are provided without letting her know how the
+# information is coded.
+# If this macro is not defined by Autoconf, define it here.
+ifdef([AC_PROVIDE_IFELSE],
+      [],
+      [define([AC_PROVIDE_IFELSE],
+              [ifdef([AC_PROVIDE_$1],
+                     [$2], [$3])])])
+
+
+# AM_INIT_AUTOMAKE(PACKAGE,VERSION, [NO-DEFINE])
+# ----------------------------------------------
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`CDPATH=:; cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run \"make distclean\" there first])
+fi
+
+# Define the identity of the package.
+PACKAGE=$1
+AC_SUBST(PACKAGE)dnl
+VERSION=$2
+AC_SUBST(VERSION)dnl
+ifelse([$3],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])
+
+# Autoconf 2.50 wants to disallow AM_ names.  We explicitly allow
+# the ones we care about.
+ifdef([m4_pattern_allow],
+      [m4_pattern_allow([^AM_[A-Z]+FLAGS])])dnl
+
+# Autoconf 2.50 always computes EXEEXT.  However we need to be
+# compatible with 2.13, for now.  So we always define EXEEXT, but we
+# don't compute it.
+AC_SUBST(EXEEXT)
+# Similar for OBJEXT -- only we only use OBJEXT if the user actually
+# requests that it be used.  This is a bit dumb.
+: ${OBJEXT=o}
+AC_SUBST(OBJEXT)
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal)
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake)
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_MISSING_PROG(AMTAR, tar)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_PROVIDE_IFELSE([AC_PROG_][CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_][CC],
+                          defn([AC_PROG_][CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_][CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_][CXX],
+                          defn([AC_PROG_][CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+# serial 3
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+
+# serial 2
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  am_backtick='`'
+  AC_MSG_WARN([${am_backtick}missing' script is too old or missing])
+fi
+])
+
+# AM_AUX_DIR_EXPAND
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND], [
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`CDPATH=:; cd $ac_aux_dir && pwd`
+])
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# serial 4                                             -*- Autoconf -*-
+
+
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+
+# _AM_DEPENDENCIES(NAME)
+# ---------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX" or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc']
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    echo '#include "conftest.h"' > conftest.c
+    echo 'int i;' > conftest.h
+    echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=conftest.c object=conftest.o \
+       depfile=conftest.Po tmpdepfile=conftest.TPo \
+       $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 &&
+       grep conftest.h conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      am_cv_$1_dependencies_compiler_type=$depmode
+      break
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+$1DEPMODE="depmode=$am_cv_$1_dependencies_compiler_type"
+AC_SUBST([$1DEPMODE])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[rm -f .deps 2>/dev/null
+mkdir .deps 2>/dev/null
+if test -d .deps; then
+  DEPDIR=.deps
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  DEPDIR=_deps
+fi
+rmdir .deps 2>/dev/null
+AC_SUBST(DEPDIR)
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking Speeds up one-time builds
+  --enable-dependency-tracking  Do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+pushdef([subst], defn([AC_SUBST]))
+subst(AMDEPBACKSLASH)
+popdef([subst])
+])
+
+# Generate code to set up dependency tracking.
+# This macro should only be invoked once -- use via AC_REQUIRE.
+# Usage:
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],[
+AC_OUTPUT_COMMANDS([
+test x"$AMDEP_TRUE" != x"" ||
+for mf in $CONFIG_FILES; do
+  case "$mf" in
+  Makefile) dirpart=.;;
+  */Makefile) dirpart=`echo "$mf" | sed -e 's|/[^/]*$||'`;;
+  *) continue;;
+  esac
+  grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue
+  # Extract the definition of DEP_FILES from the Makefile without
+  # running `make'.
+  DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n -e '/^U = / s///p' < "$mf"`
+  test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR"
+  # We invoke sed twice because it is the simplest approach to
+  # changing $(DEPDIR) to its actual value in the expansion.
+  for file in `sed -n -e '
+    /^DEP_FILES = .*\\\\$/ {
+      s/^DEP_FILES = //
+      :loop
+       s/\\\\$//
+       p
+       n
+       /\\\\$/ b loop
+      p
+    }
+    /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`echo "$file" | sed -e 's|/[^/]*$||'`
+    $ac_aux_dir/mkinstalldirs "$dirpart/$fdir" > /dev/null 2>&1
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+], [AMDEP_TRUE="$AMDEP_TRUE"
+ac_aux_dir="$ac_aux_dir"])])
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+doit:
+       @echo done
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include='#'
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote='"'
+      _am_result=BSD
+   fi
+fi
+AC_SUBST(am__include)
+AC_SUBST(am__quote)
+AC_MSG_RESULT($_am_result)
+rm -f confinc confmf
+])
+
+# serial 3
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+#
+# FIXME: Once using 2.50, use this:
+# m4_match([$1], [^TRUE\|FALSE$], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_DEFUN([AM_CONDITIONAL],
+[ifelse([$1], [TRUE],
+        [errprint(__file__:__line__: [$0: invalid condition: $1
+])dnl
+m4exit(1)])dnl
+ifelse([$1], [FALSE],
+       [errprint(__file__:__line__: [$0: invalid condition: $1
+])dnl
+m4exit(1)])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi])
+
+# Like AC_CONFIG_HEADER, but automatically create stamp file.
+
+# serial 3
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  We must strip everything past the first ":",
+# and everything past the last "/".
+
+AC_PREREQ([2.12])
+
+AC_DEFUN([AM_CONFIG_HEADER],
+[ifdef([AC_FOREACH],dnl
+        [dnl init our file count if it isn't already
+        m4_ifndef([_AM_Config_Header_Index], m4_define([_AM_Config_Header_Index], [0]))
+        dnl prepare to store our destination file list for use in config.status
+        AC_FOREACH([_AM_File], [$1],
+                   [m4_pushdef([_AM_Dest], m4_patsubst(_AM_File, [:.*]))
+                   m4_define([_AM_Config_Header_Index], m4_incr(_AM_Config_Header_Index))
+                   dnl and add it to the list of files AC keeps track of, along
+                   dnl with our hook
+                   AC_CONFIG_HEADERS(_AM_File,
+dnl COMMANDS, [, INIT-CMDS]
+[# update the timestamp
+echo timestamp >"AS_ESCAPE(_AM_DIRNAME(]_AM_Dest[))/stamp-h]_AM_Config_Header_Index["
+][$2]m4_ifval([$3], [, [$3]]))dnl AC_CONFIG_HEADERS
+                   m4_popdef([_AM_Dest])])],dnl
+[AC_CONFIG_HEADER([$1])
+  AC_OUTPUT_COMMANDS(
+   ifelse(patsubst([$1], [[^ ]], []),
+         [],
+         [test -z "$CONFIG_HEADERS" || echo timestamp >dnl
+          patsubst([$1], [^\([^:]*/\)?.*], [\1])stamp-h]),dnl
+[am_indx=1
+for am_file in $1; do
+  case " \$CONFIG_HEADERS " in
+  *" \$am_file "*)
+    am_dir=\`echo \$am_file |sed 's%:.*%%;s%[^/]*\$%%'\`
+    if test -n "\$am_dir"; then
+      am_tmpdir=\`echo \$am_dir |sed 's%^\(/*\).*\$%\1%'\`
+      for am_subdir in \`echo \$am_dir |sed 's%/% %'\`; do
+        am_tmpdir=\$am_tmpdir\$am_subdir/
+        if test ! -d \$am_tmpdir; then
+          mkdir \$am_tmpdir
+        fi
+      done
+    fi
+    echo timestamp > "\$am_dir"stamp-h\$am_indx
+    ;;
+  esac
+  am_indx=\`expr \$am_indx + 1\`
+done])
+])]) # AM_CONFIG_HEADER
+
+# _AM_DIRNAME(PATH)
+# -----------------
+# Like AS_DIRNAME, only do it during macro expansion
+AC_DEFUN([_AM_DIRNAME],
+       [m4_if(m4_regexp([$1], [^.*[^/]//*[^/][^/]*/*$]), -1,
+             m4_if(m4_regexp([$1], [^//\([^/]\|$\)]), -1,
+                   m4_if(m4_regexp([$1], [^/.*]), -1,
+                         [.],
+                         m4_patsubst([$1], [^\(/\).*], [\1])),
+                   m4_patsubst([$1], [^\(//\)\([^/].*\|$\)], [\1])),
+             m4_patsubst([$1], [^\(.*[^/]\)//*[^/][^/]*/*$], [\1]))[]dnl
+]) # _AM_DIRNAME
+
+# aclocal-include.m4
+# 
+# This macro adds the name macrodir to the set of directories
+# that `aclocal' searches for macros.  
+
+# serial 1
+
+dnl AM_ACLOCAL_INCLUDE(macrodir)
+AC_DEFUN([AM_ACLOCAL_INCLUDE],
+[
+       AM_CONDITIONAL(INSIDE_GNOME_COMMON, test x = y)
+
+       test -n "$ACLOCAL_FLAGS" && ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
+
+       for k in $1 ; do ACLOCAL="$ACLOCAL -I $k" ; done
+])
+
+
+define([HACK_SUBST], defn([AC_SUBST]))
+
+# serial 1 AC_PROG_XML_I18N_TOOLS
+AC_DEFUN(AC_PROG_XML_I18N_TOOLS,
+[
+
+dnl This is a hack - we use the expansion of AC_SUBST instead of
+dnl AC_SUBST itself to avoid automake putting 
+dnl XML_I18N_MERGE_OAF_RULE = @XML_I18N_MERGE_OAF_RULE@
+dnl in all the Makefile.in's, because that will blow up when substituted.
+XML_I18N_MERGE_OAF_RULE='\%.oaf : \%.oaf.in $(top_builddir)/xml-i18n-merge $(top_srcdir)/po/*.po\
+       $(top_builddir)/xml-i18n-merge -o $(top_srcdir)/po $< [$]*.oaf'
+HACK_SUBST(XML_I18N_MERGE_OAF_RULE)
+
+XML_I18N_MERGE_SERVER_RULE='\%.server : \%.server.in $(top_builddir)/xml-i18n-merge $(top_srcdir)/po/*.po\
+       $(top_builddir)/xml-i18n-merge -o $(top_srcdir)/po $< [$]*.server'
+HACK_SUBST(XML_I18N_MERGE_SERVER_RULE)
+
+dnl same deal
+XML_I18N_MERGE_KEYS_RULE='\%.keys : \%.keys.in $(top_builddir)/xml-i18n-merge $(top_srcdir)/po/*.po\
+       $(top_builddir)/xml-i18n-merge -k $(top_srcdir)/po $< [$]*.keys'
+HACK_SUBST(XML_I18N_MERGE_KEYS_RULE)
+
+dnl same deal
+XML_I18N_MERGE_DESKTOP_RULE='\%.desktop : \%.desktop.in $(top_builddir)/xml-i18n-merge $(top_srcdir)/po/*.po\
+       $(top_builddir)/xml-i18n-merge -d $(top_srcdir)/po $< [$]*.desktop'
+HACK_SUBST(XML_I18N_MERGE_DESKTOP_RULE)
+
+dnl same deal
+XML_I18N_MERGE_DIRECTORY_RULE='\%.directory : \%.directory.in $(top_builddir)/xml-i18n-merge $(top_srcdir)/po/*.po\
+       $(top_builddir)/xml-i18n-merge -d $(top_srcdir)/po $< [$]*.directory'
+HACK_SUBST(XML_I18N_MERGE_DIRECTORY_RULE)
+
+dnl same deal
+XML_I18N_MERGE_SOUNDLIST_RULE='\%.soundlist : \%.soundlist.in $(top_builddir)/xml-i18n-merge $(top_srcdir)/po/*.po\
+       $(top_builddir)/xml-i18n-merge -d $(top_srcdir)/po $< [$]*.soundlist'
+HACK_SUBST(XML_I18N_MERGE_SOUNDLIST_RULE)
+
+dnl same deal
+XML_I18N_MERGE_PONG_RULE='\%.pong : \%.pong.in $(top_builddir)/xml-i18n-merge $(top_srcdir)/po/*.po\
+       $(top_builddir)/xml-i18n-merge -x $(top_srcdir)/po $< [$]*.pong'
+HACK_SUBST(XML_I18N_MERGE_PONG_RULE)
+
+dnl same deal
+XML_I18N_MERGE_XML_RULE='\%.xml : \%.xml.in $(top_builddir)/xml-i18n-merge $(top_srcdir)/po/*.po\
+       $(top_builddir)/xml-i18n-merge -x $(top_srcdir)/po $< [$]*.xml'
+HACK_SUBST(XML_I18N_MERGE_XML_RULE)
+
+# Always use our own xml-i18n-tools.
+XML_I18N_EXTRACT='$(top_builddir)/xml-i18n-extract'
+AC_SUBST(XML_I18N_EXTRACT)dnl
+
+XML_I18N_MERGE='$(top_builddir)/xml-i18n-merge'
+AC_SUBST(XML_I18N_MERGE)dnl
+
+XML_I18N_UPDATE='$(top_builddir)/xml-i18n-update'
+AC_SUBST(XML_I18N_UPDATE)dnl
+
+AC_PATH_PROG(XML_I18N_TOOLS_PERL, perl)
+if test -z "$XML_I18N_TOOLS_PERL"; then
+   AC_MSG_ERROR([perl not found; required for xml-i18n-tools])
+fi
+if test -z "`$XML_I18N_TOOLS_PERL -v | fgrep '5.' 2> /dev/null`"; then
+   AC_MSG_ERROR([perl 5.x required for xml-i18n-tools])
+fi
+
+dnl  manually sed perl in so people don't have to put the xml-i18n-tools scripts in their 
+dnl  AC_OUTPUT
+AC_OUTPUT_COMMANDS([
+sed -e "s:@XML_I18N_TOOLS_PERL@:${XML_I18N_TOOLS_PERL}:;" < ${srcdir}/xml-i18n-extract.in > xml-i18n-extract;
+chmod ugo+x xml-i18n-extract;
+chmod u+w xml-i18n-extract;
+
+sed -e "s:@XML_I18N_TOOLS_PERL@:${XML_I18N_TOOLS_PERL}:;" < ${srcdir}/xml-i18n-merge.in > xml-i18n-merge;
+chmod ugo+x xml-i18n-merge;
+chmod u+w xml-i18n-merge;
+
+sed -e "s:@XML_I18N_TOOLS_PERL@:${XML_I18N_TOOLS_PERL}:;" < ${srcdir}/xml-i18n-update.in > xml-i18n-update;
+chmod ugo+x xml-i18n-update;
+chmod u+w xml-i18n-update;
+], XML_I18N_TOOLS_PERL=${XML_I18N_TOOLS_PERL})
+
+# Redirect the config.log output again, so that the ltconfig log is not
+# clobbered by the next message.
+exec 5>>./config.log
+])
+
+dnl old names
+AC_DEFUN(AM_PROG_XML_I18N_TOOLS, [indir([AC_PROG_XML_I18N_TOOLS])])dnl
+
+# gnome-common.m4
+# 
+# This only for packages that are not in the GNOME CVS tree.
+
+dnl GNOME_COMMON_INIT
+
+AC_DEFUN([GNOME_COMMON_INIT],
+[
+       GNOME_ACLOCAL_DIR="$GNOME_COMMON_MACROS_DIR"
+       AC_SUBST(GNOME_ACLOCAL_DIR)
+
+       ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
+])
+
+
+dnl
+dnl GNOME_INIT_HOOK (script-if-gnome-enabled, [failflag], [additional-inits])
+dnl
+dnl if failflag is "fail" then GNOME_INIT_HOOK will abort if gnomeConf.sh
+dnl is not found. 
+dnl
+
+AC_DEFUN([GNOME_INIT_HOOK],[
+       AC_SUBST(GNOME_LIBS)
+       AC_SUBST(GNOMEUI_LIBS)
+       AC_SUBST(GNOMEGNORBA_LIBS)
+       AC_SUBST(GTKXMHTML_LIBS)
+       AC_SUBST(ZVT_LIBS)
+       AC_SUBST(GNOME_LIBDIR)
+       AC_SUBST(GNOME_INCLUDEDIR)
+
+       AC_ARG_WITH(gnome-includes,
+       [  --with-gnome-includes   Specify location of GNOME headers],[
+       CFLAGS="$CFLAGS -I$withval"
+       ])
+       
+       AC_ARG_WITH(gnome-libs,
+       [  --with-gnome-libs       Specify location of GNOME libs],[
+       LDFLAGS="$LDFLAGS -L$withval"
+       gnome_prefix=$withval
+       ])
+
+       AC_ARG_WITH(gnome,
+       [  --with-gnome            Specify prefix for GNOME files],
+               if test x$withval = xyes; then
+                       want_gnome=yes
+                       dnl Note that an empty true branch is not
+                       dnl valid sh syntax.
+                       ifelse([$1], [], :, [$1])
+               else
+                       if test "x$withval" = xno; then
+                               want_gnome=no
+                       else
+                               want_gnome=yes
+                               LDFLAGS="$LDFLAGS -L$withval/lib"
+                               CFLAGS="$CFLAGS -I$withval/include"
+                               gnome_prefix=$withval/lib
+                       fi
+               fi,
+               want_gnome=yes)
+
+       if test "x$want_gnome" = xyes; then
+
+           AC_PATH_PROG(GNOME_CONFIG,gnome-config,no)
+           if test "$GNOME_CONFIG" = "no"; then
+             no_gnome_config="yes"
+           else
+             AC_MSG_CHECKING(if $GNOME_CONFIG works)
+             if $GNOME_CONFIG --libs-only-l gnome >/dev/null 2>&1; then
+               AC_MSG_RESULT(yes)
+               GNOME_GNORBA_HOOK([],$2)
+               GNOME_LIBS="`$GNOME_CONFIG --libs-only-l gnome`"
+               GNOMEUI_LIBS="`$GNOME_CONFIG --libs-only-l gnomeui`"
+               GNOMEGNORBA_LIBS="`$GNOME_CONFIG --libs-only-l gnorba gnomeui`"
+               GTKXMHTML_LIBS="`$GNOME_CONFIG --libs-only-l gtkxmhtml`"
+               ZVT_LIBS="`$GNOME_CONFIG --libs-only-l zvt`"
+               GNOME_LIBDIR="`$GNOME_CONFIG --libs-only-L gnorba gnomeui`"
+               GNOME_INCLUDEDIR="`$GNOME_CONFIG --cflags gnorba gnomeui`"
+                $1
+             else
+               AC_MSG_RESULT(no)
+               no_gnome_config="yes"
+              fi
+            fi
+
+           if test x$exec_prefix = xNONE; then
+               if test x$prefix = xNONE; then
+                   gnome_prefix=$ac_default_prefix/lib
+               else
+                   gnome_prefix=$prefix/lib
+               fi
+           else
+               gnome_prefix=`eval echo \`echo $libdir\``
+           fi
+       
+           if test "$no_gnome_config" = "yes"; then
+              AC_MSG_CHECKING(for gnomeConf.sh file in $gnome_prefix)
+             if test -f $gnome_prefix/gnomeConf.sh; then
+               AC_MSG_RESULT(found)
+               echo "loading gnome configuration from" \
+                    "$gnome_prefix/gnomeConf.sh"
+               . $gnome_prefix/gnomeConf.sh
+               $1
+             else
+               AC_MSG_RESULT(not found)
+               if test x$2 = xfail; then
+                 AC_MSG_ERROR(Could not find the gnomeConf.sh file that is generated by gnome-libs install)
+               fi
+             fi
+            fi
+       fi
+
+       if test -n "$3"; then
+         n="$3"
+         for i in $n; do
+           AC_MSG_CHECKING(extra library \"$i\")
+           case $i in 
+             applets)
+               AC_SUBST(GNOME_APPLETS_LIBS)
+               GNOME_APPLETS_LIBS=`$GNOME_CONFIG --libs-only-l applets`
+               AC_MSG_RESULT($GNOME_APPLETS_LIBS);;
+             docklets)
+               AC_SUBST(GNOME_DOCKLETS_LIBS)
+               GNOME_DOCKLETS_LIBS=`$GNOME_CONFIG --libs-only-l docklets`
+               AC_MSG_RESULT($GNOME_DOCKLETS_LIBS);;
+             capplet)
+               AC_SUBST(GNOME_CAPPLET_LIBS)
+               GNOME_CAPPLET_LIBS=`$GNOME_CONFIG --libs-only-l capplet`
+               AC_MSG_RESULT($GNOME_CAPPLET_LIBS);;
+             *)
+               AC_MSG_RESULT(unknown library)
+           esac
+         done
+       fi
+])
+
+dnl
+dnl GNOME_INIT ([additional-inits])
+dnl
+
+AC_DEFUN([GNOME_INIT],[
+       GNOME_INIT_HOOK([],fail,$1)
+])
+
+dnl
+dnl GNOME_GNORBA_HOOK (script-if-gnorba-found, failflag)
+dnl
+dnl if failflag is "failure" it aborts if gnorba is not found.
+dnl
+
+AC_DEFUN([GNOME_GNORBA_HOOK],[
+       GNOME_ORBIT_HOOK([],$2)
+       AC_CACHE_CHECK([for gnorba libraries],gnome_cv_gnorba_found,[
+               gnome_cv_gnorba_found=no
+               if test x$gnome_cv_orbit_found = xyes; then
+                       GNORBA_CFLAGS="`gnome-config --cflags gnorba gnomeui`"
+                       GNORBA_LIBS="`gnome-config --libs gnorba gnomeui`"
+                       if test -n "$GNORBA_LIBS"; then
+                               gnome_cv_gnorba_found=yes
+                       fi
+               fi
+       ])
+       AM_CONDITIONAL(HAVE_GNORBA, test x$gnome_cv_gnorba_found = xyes)
+       if test x$gnome_cv_orbit_found = xyes; then
+               $1
+               GNORBA_CFLAGS="`gnome-config --cflags gnorba gnomeui`"
+               GNORBA_LIBS="`gnome-config --libs gnorba gnomeui`"
+               AC_SUBST(GNORBA_CFLAGS)
+               AC_SUBST(GNORBA_LIBS)
+       else
+               if test x$2 = xfailure; then
+                       AC_MSG_ERROR(gnorba library not installed or installation problem)
+               fi
+       fi
+])
+
+AC_DEFUN([GNOME_GNORBA_CHECK], [
+       GNOME_GNORBA_HOOK([],failure)
+])
+
+dnl
+dnl GNOME_ORBIT_HOOK (script-if-orbit-found, failflag)
+dnl
+dnl if failflag is "failure" it aborts if orbit is not found.
+dnl
+
+AC_DEFUN([GNOME_ORBIT_HOOK],[
+       AC_PATH_PROG(ORBIT_CONFIG,orbit-config,no)
+       AC_PATH_PROG(ORBIT_IDL,orbit-idl,no)
+       AC_CACHE_CHECK([for working ORBit environment],gnome_cv_orbit_found,[
+               if test x$ORBIT_CONFIG = xno -o x$ORBIT_IDL = xno; then
+                       gnome_cv_orbit_found=no
+               else
+                       gnome_cv_orbit_found=yes
+               fi
+       ])
+       AM_CONDITIONAL(HAVE_ORBIT, test x$gnome_cv_orbit_found = xyes)
+       if test x$gnome_cv_orbit_found = xyes; then
+               $1
+               ORBIT_CFLAGS=`orbit-config --cflags client server`
+               ORBIT_LIBS=`orbit-config --use-service=name --libs client server`
+               AC_SUBST(ORBIT_CFLAGS)
+               AC_SUBST(ORBIT_LIBS)
+       else
+               if test x$2 = xfailure; then
+                       AC_MSG_ERROR(ORBit not installed or installation problem)
+               fi
+       fi
+])
+
+AC_DEFUN([GNOME_ORBIT_CHECK], [
+       GNOME_ORBIT_HOOK([],failure)
+])
+
+#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"])
+  ]
+)
+
+
+# serial 1
+
+# @defmac AC_PROG_CC_STDC
+# @maindex PROG_CC_STDC
+# @ovindex CC
+# If the C compiler in not in ANSI C mode by default, try to add an option
+# to output variable @code{CC} to make it so.  This macro tries various
+# options that select ANSI C on some system or another.  It considers the
+# compiler to be in ANSI C mode if it handles function prototypes correctly.
+#
+# If you use this macro, you should check after calling it whether the C
+# compiler has been set to accept ANSI C; if not, the shell variable
+# @code{am_cv_prog_cc_stdc} is set to @samp{no}.  If you wrote your source
+# code in ANSI C, you can make an un-ANSIfied copy of it by using the
+# program @code{ansi2knr}, which comes with Ghostscript.
+# @end defmac
+
+AC_DEFUN([AM_PROG_CC_STDC],
+[AC_REQUIRE([AC_PROG_CC])
+AC_BEFORE([$0], [AC_C_INLINE])
+AC_BEFORE([$0], [AC_C_CONST])
+dnl Force this before AC_PROG_CPP.  Some cpp's, eg on HPUX, require
+dnl a magic option to avoid problems with ANSI preprocessor commands
+dnl like #elif.
+dnl FIXME: can't do this because then AC_AIX won't work due to a
+dnl circular dependency.
+dnl AC_BEFORE([$0], [AC_PROG_CPP])
+AC_MSG_CHECKING([for ${CC-cc} option to accept ANSI C])
+AC_CACHE_VAL(am_cv_prog_cc_stdc,
+[am_cv_prog_cc_stdc=no
+ac_save_CC="$CC"
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX                  -qlanglvl=ansi
+# Ultrix and OSF/1     -std1
+# HP-UX 10.20 and later        -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4                 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  AC_TRY_COMPILE(
+[#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+], [
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+],
+[am_cv_prog_cc_stdc="$ac_arg"; break])
+done
+CC="$ac_save_CC"
+])
+if test -z "$am_cv_prog_cc_stdc"; then
+  AC_MSG_RESULT([none needed])
+else
+  AC_MSG_RESULT([$am_cv_prog_cc_stdc])
+fi
+case "x$am_cv_prog_cc_stdc" in
+  x|xno) ;;
+  *) CC="$CC $am_cv_prog_cc_stdc" ;;
+esac
+])
+
+dnl GNOME_COMPILE_WARNINGS
+dnl Turn on many useful compiler warnings
+dnl For now, only works on GCC
+AC_DEFUN([GNOME_COMPILE_WARNINGS],[
+  AC_ARG_ENABLE(compile-warnings, 
+    [  --enable-compile-warnings=[no/minimum/yes]      Turn on compiler warnings.],,enable_compile_warnings=minimum)
+
+  AC_MSG_CHECKING(what warning flags to pass to the C compiler)
+  warnCFLAGS=
+  if test "x$GCC" != xyes; then
+    enable_compile_warnings=no
+  fi
+
+  if test "x$enable_compile_warnings" != "xno"; then
+    if test "x$GCC" = "xyes"; then
+      case " $CFLAGS " in
+      *[\ \    ]-Wall[\ \      ]*) ;;
+      *) warnCFLAGS="-Wall -Wunused" ;;
+      esac
+
+      ## -W is not all that useful.  And it cannot be controlled
+      ## with individual -Wno-xxx flags, unlike -Wall
+      if test "x$enable_compile_warnings" = "xyes"; then
+       warnCFLAGS="$warnCFLAGS -Wmissing-prototypes -Wmissing-declarations"
+      fi
+    fi
+  fi
+  AC_MSG_RESULT($warnCFLAGS)
+
+  AC_ARG_ENABLE(iso-c,
+    [  --enable-iso-c          Try to warn if code is not ISO C ],,
+    enable_iso_c=no)
+
+  AC_MSG_CHECKING(what language compliance flags to pass to the C compiler)
+  complCFLAGS=
+  if test "x$enable_iso_c" != "xno"; then
+    if test "x$GCC" = "xyes"; then
+      case " $CFLAGS " in
+      *[\ \    ]-ansi[\ \      ]*) ;;
+      *) complCFLAGS="$complCFLAGS -ansi" ;;
+      esac
+
+      case " $CFLAGS " in
+      *[\ \    ]-pedantic[\ \  ]*) ;;
+      *) complCFLAGS="$complCFLAGS -pedantic" ;;
+      esac
+    fi
+  fi
+  AC_MSG_RESULT($complCFLAGS)
+  if test "x$cflags_set" != "xyes"; then
+    CFLAGS="$CFLAGS $warnCFLAGS $complCFLAGS"
+    cflags_set=yes
+    AC_SUBST(cflags_set)
+  fi
+])
+
+dnl For C++, do basically the same thing.
+
+AC_DEFUN([GNOME_CXX_WARNINGS],[
+  AC_ARG_ENABLE(cxx-warnings, 
+    [  --enable-cxx-warnings=[no/minimum/yes]  Turn on compiler warnings.],,enable_cxx_warnings=minimum)
+
+  AC_MSG_CHECKING(what warning flags to pass to the C++ compiler)
+  warnCXXFLAGS=
+  if test "x$GCC" != xyes; then
+    enable_compile_warnings=no
+  fi
+  if test "x$enable_cxx_warnings" != "xno"; then
+    if test "x$GCC" = "xyes"; then
+      case " $CXXFLAGS " in
+      *[\ \    ]-Wall[\ \      ]*) ;;
+      *) warnCXXFLAGS="-Wall -Wno-unused" ;;
+      esac
+
+      ## -W is not all that useful.  And it cannot be controlled
+      ## with individual -Wno-xxx flags, unlike -Wall
+      if test "x$enable_cxx_warnings" = "xyes"; then
+       warnCXXFLAGS="$warnCXXFLAGS -Wmissing-prototypes -Wmissing-declarations -Wshadow -Woverloaded-virtual"
+      fi
+    fi
+  fi
+  AC_MSG_RESULT($warnCXXFLAGS)
+
+   AC_ARG_ENABLE(iso-cxx,
+     [  --enable-iso-cxx          Try to warn if code is not ISO C++ ],,
+     enable_iso_cxx=no)
+
+   AC_MSG_CHECKING(what language compliance flags to pass to the C++ compiler)
+   complCXXFLAGS=
+   if test "x$enable_iso_cxx" != "xno"; then
+     if test "x$GCC" = "xyes"; then
+      case " $CXXFLAGS " in
+      *[\ \    ]-ansi[\ \      ]*) ;;
+      *) complCXXFLAGS="$complCXXFLAGS -ansi" ;;
+      esac
+
+      case " $CXXFLAGS " in
+      *[\ \    ]-pedantic[\ \  ]*) ;;
+      *) complCXXFLAGS="$complCXXFLAGS -pedantic" ;;
+      esac
+     fi
+   fi
+  AC_MSG_RESULT($complCXXFLAGS)
+  if test "x$cxxflags_set" != "xyes"; then
+    CXXFLAGS="$CXXFLAGS $warnCXXFLAGS $complCXXFLAGS"
+    cxxflags_set=yes
+    AC_SUBST(cxxflags_set)
+  fi
+])
+
+dnl GNOME_X_CHECKS
+dnl
+dnl Basic X11 related checks for X11.  At the end, the following will be
+dnl defined/changed:
+dnl   GTK_{CFLAGS,LIBS}      From AM_PATH_GTK
+dnl   CPPFLAGS              Will include $X_CFLAGS
+dnl   GNOME_HAVE_SM         `true' or `false' depending on whether session
+dnl                          management is available.  It is available if
+dnl                          both -lSM and X11/SM/SMlib.h exist.  (Some
+dnl                          Solaris boxes have the library but not the header)
+dnl   XPM_LIBS               -lXpm if Xpm library is present, otherwise ""
+dnl
+dnl The following configure cache variables are defined (but not used):
+dnl   gnome_cv_passdown_{x_libs,X_LIBS,X_CFLAGS}
+dnl
+AC_DEFUN([GNOME_X_CHECKS],
+[
+       AM_PATH_GTK(1.2.0,,AC_MSG_ERROR(GTK not installed, or gtk-config not in path))
+       dnl Hope that GTK_CFLAGS have only -I and -D.  Otherwise, we could
+       dnl   test -z "$x_includes" || CPPFLAGS="$CPPFLAGS -I$x_includes"
+       dnl
+       dnl Use CPPFLAGS instead of CFLAGS because AC_CHECK_HEADERS uses
+       dnl CPPFLAGS, not CFLAGS
+        CPPFLAGS="$CPPFLAGS $GTK_CFLAGS"
+
+        saved_ldflags="$LDFLAGS"
+        LDFLAGS="$LDFLAGS $GTK_LIBS"
+
+       gnome_cv_passdown_x_libs="$GTK_LIBS"
+       gnome_cv_passdown_X_LIBS="$GTK_LIBS"
+       gnome_cv_passdown_X_CFLAGS="$GTK_CFLAGS"
+       gnome_cv_passdown_GTK_LIBS="$GTK_LIBS"
+
+        LDFLAGS="$saved_ldflags $GTK_LIBS"
+
+dnl We are requiring GTK >= 1.1.1, which means this will be fine anyhow.
+       USE_DEVGTK=true
+
+dnl    AC_MSG_CHECKING([whether to use features from (unstable) GTK+ 1.1.x])
+dnl    AC_EGREP_CPP(answer_affirmatively,
+dnl    [#include <gtk/gtkfeatures.h>
+dnl    #ifdef GTK_HAVE_FEATURES_1_1_0
+dnl       answer_affirmatively
+dnl    #endif
+dnl    ], dev_gtk=yes, dev_gtk=no)
+dnl    if test "$dev_gtk" = "yes"; then
+dnl       USE_DEVGTK=true
+dnl    fi
+dnl    AC_MSG_RESULT("$dev_gtk")
+
+       GNOME_HAVE_SM=true
+       case "$GTK_LIBS" in
+        *-lSM*)
+           dnl Already found it.
+           ;;
+        *)
+           dnl Assume that if we have -lSM then we also have -lICE.
+           AC_CHECK_LIB(SM, SmcSaveYourselfDone,
+               [GTK_LIBS="-lSM -lICE $GTK_LIBS"],GNOME_HAVE_SM=false,
+               $x_libs -lICE)
+           ;;
+       esac
+
+       if test "$GNOME_HAVE_SM" = true; then
+          AC_CHECK_HEADERS(X11/SM/SMlib.h,,GNOME_HAVE_SM=false)
+       fi
+
+       if test "$GNOME_HAVE_SM" = true; then
+          AC_DEFINE(HAVE_LIBSM)
+       fi
+
+       XPM_LIBS=""
+       AC_CHECK_LIB(Xpm, XpmFreeXpmImage, [XPM_LIBS="-lXpm"], , $x_libs)
+       AC_SUBST(XPM_LIBS)
+
+       AC_REQUIRE([GNOME_PTHREAD_CHECK])
+        LDFLAGS="$saved_ldflags"
+
+       AC_PROVIDE([GNOME_X_CHECKS])
+])
+
+# Configure paths for GTK+
+# Owen Taylor     97-11-3
+
+dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS
+dnl
+AC_DEFUN(AM_PATH_GTK,
+[dnl 
+dnl Get the cflags and libraries from the gtk-config script
+dnl
+AC_ARG_WITH(gtk-prefix,[  --with-gtk-prefix=PFX   Prefix where GTK is installed (optional)],
+            gtk_config_prefix="$withval", gtk_config_prefix="")
+AC_ARG_WITH(gtk-exec-prefix,[  --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)],
+            gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="")
+AC_ARG_ENABLE(gtktest, [  --disable-gtktest       Do not try to compile and run a test GTK program],
+                   , enable_gtktest=yes)
+
+  for module in . $4
+  do
+      case "$module" in
+         gthread) 
+             gtk_config_args="$gtk_config_args gthread"
+         ;;
+      esac
+  done
+
+  if test x$gtk_config_exec_prefix != x ; then
+     gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix"
+     if test x${GTK_CONFIG+set} != xset ; then
+        GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config
+     fi
+  fi
+  if test x$gtk_config_prefix != x ; then
+     gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix"
+     if test x${GTK_CONFIG+set} != xset ; then
+        GTK_CONFIG=$gtk_config_prefix/bin/gtk-config
+     fi
+  fi
+
+  AC_PATH_PROG(GTK_CONFIG, gtk-config, no)
+  min_gtk_version=ifelse([$1], ,0.99.7,$1)
+  AC_MSG_CHECKING(for GTK - version >= $min_gtk_version)
+  no_gtk=""
+  if test "$GTK_CONFIG" = "no" ; then
+    no_gtk=yes
+  else
+    GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
+    GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
+    gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+    gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+    gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+    if test "x$enable_gtktest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $GTK_CFLAGS"
+      LIBS="$GTK_LIBS $LIBS"
+dnl
+dnl Now check if the installed GTK is sufficiently new. (Also sanity
+dnl checks the results of gtk-config to some extent
+dnl
+      rm -f conf.gtktest
+      AC_TRY_RUN([
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int 
+main ()
+{
+  int major, minor, micro;
+  char *tmp_version;
+
+  system ("touch conf.gtktest");
+
+  /* HP/UX 9 (%@#!) writes to sscanf strings */
+  tmp_version = g_strdup("$min_gtk_version");
+  if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+     printf("%s, bad version string\n", "$min_gtk_version");
+     exit(1);
+   }
+
+  if ((gtk_major_version != $gtk_config_major_version) ||
+      (gtk_minor_version != $gtk_config_minor_version) ||
+      (gtk_micro_version != $gtk_config_micro_version))
+    {
+      printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", 
+             $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+             gtk_major_version, gtk_minor_version, gtk_micro_version);
+      printf ("*** was found! If gtk-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n");
+      printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n");
+      printf("*** before re-running configure\n");
+    } 
+#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION)
+  else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+          (gtk_minor_version != GTK_MINOR_VERSION) ||
+           (gtk_micro_version != GTK_MICRO_VERSION))
+    {
+      printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+            GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+      printf("*** library (version %d.%d.%d)\n",
+            gtk_major_version, gtk_minor_version, gtk_micro_version);
+    }
+#endif /* defined (GTK_MAJOR_VERSION) ... */
+  else
+    {
+      if ((gtk_major_version > major) ||
+        ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+        ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+      {
+        return 0;
+       }
+     else
+      {
+        printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n",
+               gtk_major_version, gtk_minor_version, gtk_micro_version);
+        printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n",
+              major, minor, micro);
+        printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+        printf("***\n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the gtk-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n");
+        printf("*** correct copy of gtk-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_gtk" = x ; then
+     AC_MSG_RESULT(yes)
+     ifelse([$2], , :, [$2])     
+  else
+     AC_MSG_RESULT(no)
+     if test "$GTK_CONFIG" = "no" ; then
+       echo "*** The gtk-config script installed by GTK could not be found"
+       echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in"
+       echo "*** your path, or set the GTK_CONFIG environment variable to the"
+       echo "*** full path to gtk-config."
+     else
+       if test -f conf.gtktest ; then
+        :
+       else
+          echo "*** Could not run GTK test program, checking why..."
+          CFLAGS="$CFLAGS $GTK_CFLAGS"
+          LIBS="$LIBS $GTK_LIBS"
+          AC_TRY_LINK([
+#include <gtk/gtk.h>
+#include <stdio.h>
+],      [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ],
+        [ echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding GTK or finding the wrong"
+          echo "*** version of GTK. If it is not finding GTK, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+         echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+          echo "***"
+          echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
+          echo "*** came with the system with the command"
+          echo "***"
+          echo "***    rpm --erase --nodeps gtk gtk-devel" ],
+        [ echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means GTK was incorrectly installed"
+          echo "*** or that you have moved GTK since it was installed. In the latter case, you"
+          echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ])
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     GTK_CFLAGS=""
+     GTK_LIBS=""
+     ifelse([$3], , :, [$3])
+  fi
+  AC_SUBST(GTK_CFLAGS)
+  AC_SUBST(GTK_LIBS)
+  rm -f conf.gtktest
+])
+
+dnl
+dnl And better, use gthreads instead...
+dnl
+
+AC_DEFUN([GNOME_PTHREAD_CHECK],[
+       PTHREAD_LIB=""
+       AC_CHECK_LIB(pthread, pthread_create, PTHREAD_LIB="-lpthread",
+               [AC_CHECK_LIB(pthreads, pthread_create, PTHREAD_LIB="-lpthreads",
+                   [AC_CHECK_LIB(c_r, pthread_create, PTHREAD_LIB="-lc_r",
+                       [AC_CHECK_FUNC(pthread_create)]
+                   )]
+               )]
+       )
+       AC_SUBST(PTHREAD_LIB)
+       AC_PROVIDE([GNOME_PTHREAD_CHECK])
+])
+
+# 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)
+  ])
+
+# 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
+])
+
+#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"
+  ]
+)
+
+#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)
+])
+
+#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
+])
+
+# 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/apps/silcer/autogen.sh b/apps/silcer/autogen.sh
new file mode 100755 (executable)
index 0000000..8cda498
--- /dev/null
@@ -0,0 +1,15 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+PKG_NAME="the package."
+
+(test -f $srcdir/configure.in) || {
+    echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
+    echo " top-level directory"
+    exit 1
+}
+
+. $srcdir/macros/autogen.sh
diff --git a/apps/silcer/config.guess b/apps/silcer/config.guess
new file mode 100755 (executable)
index 0000000..cd430f6
--- /dev/null
@@ -0,0 +1,1314 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+#   Free Software Foundation, Inc.
+
+timestamp='2001-08-21'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# Please send patches to <config-patches@gnu.org>.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script.
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int dummy(){}" > $dummy.c ;
+       for c in cc gcc c89 ; do
+         ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
+         if test $? = 0 ; then
+            CC_FOR_BUILD="$c"; break ;
+         fi ;
+       done ;
+       rm -f $dummy.c $dummy.o $dummy.rel ;
+       if test x"$CC_FOR_BUILD" = x ; then
+         CC_FOR_BUILD=no_compiler_found ;
+       fi
+       ;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+       # Netbsd (nbsd) targets should (where applicable) match one or
+       # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+       # switched to ELF, *-*-netbsd* would select the old
+       # object file format.  This provides both forward
+       # compatibility and a consistent mechanism for selecting the
+       # object file format.
+       # Determine the machine/vendor (is the vendor relevant).
+       case "${UNAME_MACHINE}" in
+           amiga) machine=m68k-unknown ;;
+           arm32) machine=arm-unknown ;;
+           atari*) machine=m68k-atari ;;
+           sun3*) machine=m68k-sun ;;
+           mac68k) machine=m68k-apple ;;
+           macppc) machine=powerpc-apple ;;
+           hp3[0-9][05]) machine=m68k-hp ;;
+           ibmrt|romp-ibm) machine=romp-ibm ;;
+           *) machine=${UNAME_MACHINE}-unknown ;;
+       esac
+       # The Operating System including object format, if it has switched
+       # to ELF recently, or will in the future.
+       case "${UNAME_MACHINE}" in
+           i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
+               eval $set_cc_for_build
+               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+                       | grep __ELF__ >/dev/null
+               then
+                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+                   # Return netbsd for either.  FIX?
+                   os=netbsd
+               else
+                   os=netbsdelf
+               fi
+               ;;
+           *)
+               os=netbsd
+               ;;
+       esac
+       # The OS release
+       release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+       # contains redundant information, the shorter form:
+       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+       echo "${machine}-${os}${release}"
+       exit 0 ;;
+    alpha:OSF1:*:*)
+       if test $UNAME_RELEASE = "V4.0"; then
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+       fi
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       cat <<EOF >$dummy.s
+       .data
+\$Lformat:
+       .byte 37,100,45,37,120,10,0     # "%d-%x\n"
+
+       .text
+       .globl main
+       .align 4
+       .ent main
+main:
+       .frame \$30,16,\$26,0
+       ldgp \$29,0(\$27)
+       .prologue 1
+       .long 0x47e03d80 # implver \$0
+       lda \$2,-1
+       .long 0x47e20c21 # amask \$2,\$1
+       lda \$16,\$Lformat
+       mov \$0,\$17
+       not \$1,\$18
+       jsr \$26,printf
+       ldgp \$29,0(\$26)
+       mov 0,\$16
+       jsr \$26,exit
+       .end main
+EOF
+       eval $set_cc_for_build
+       $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+       if test "$?" = 0 ; then
+               case `./$dummy` in
+                       0-0)
+                               UNAME_MACHINE="alpha"
+                               ;;
+                       1-0)
+                               UNAME_MACHINE="alphaev5"
+                               ;;
+                       1-1)
+                               UNAME_MACHINE="alphaev56"
+                               ;;
+                       1-101)
+                               UNAME_MACHINE="alphapca56"
+                               ;;
+                       2-303)
+                               UNAME_MACHINE="alphaev6"
+                               ;;
+                       2-307)
+                               UNAME_MACHINE="alphaev67"
+                               ;;
+                       2-1307)
+                               UNAME_MACHINE="alphaev68"
+                               ;;
+               esac
+       fi
+       rm -f $dummy.s $dummy
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # Should we change UNAME_MACHINE based on the output of uname instead
+       # of the specific Alpha model?
+       echo alpha-pc-interix
+       exit 0 ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-unknown-sysv4
+       exit 0;;
+    amiga:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit 0 ;;
+    arc64:OpenBSD:*:*)
+       echo mips64el-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hkmips:OpenBSD:*:*)
+       echo mips-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    pmax:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sgi:OpenBSD:*:*)
+       echo mips-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    *:OS/390:*:*)
+       echo i370-ibm-openedition
+       exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit 0;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit 0 ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit 0 ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    i86pc:SunOS:5.*:*)
+       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit 0 ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos${UNAME_RELEASE}
+               ;;
+           sun4)
+               echo sparc-sun-sunos${UNAME_RELEASE}
+               ;;
+       esac
+       exit 0 ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    sparc*:NetBSD:*)
+       echo `uname -p`-unknown-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    sun3*:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+       echo m88k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit 0 ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit 0 ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       sed 's/^        //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       eval $set_cc_for_build
+       $CC_FOR_BUILD $dummy.c -o $dummy \
+         && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+         && rm -f $dummy.c $dummy && exit 0
+       rm -f $dummy.c $dummy
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+       echo powerpc-motorola-powermax
+       exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit 0 ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit 0 ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit 0 ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+       then
+           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+              [ ${TARGET_BINARY_INTERFACE}x = x ]
+           then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+           else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+           fi
+       else
+           echo i586-dg-dgux${UNAME_RELEASE}
+       fi
+       exit 0 ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit 0 ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit 0 ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+       exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+       echo i386-ibm-aix
+       exit 0 ;;
+    ia64:AIX:*:*)
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+       exit 0 ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               sed 's/^                //' << EOF >$dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               eval $set_cc_for_build
+               $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+               rm -f $dummy.c $dummy
+               echo rs6000-ibm-aix3.2.5
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit 0 ;;
+    *:AIX:*:[45])
+       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+       if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit 0 ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       case "${UNAME_MACHINE}" in
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/[678][0-9][0-9])
+              case "${HPUX_REV}" in
+                11.[0-9][0-9])
+                  if [ -x /usr/bin/getconf ]; then
+                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+                        esac ;;
+                    esac
+                  fi ;;
+              esac
+              if [ "${HP_ARCH}" = "" ]; then
+              sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+               {
+               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+               case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+                   switch (bits)
+                       {
+                       case 64: puts ("hppa2.0w"); break;
+                       case 32: puts ("hppa2.0n"); break;
+                       default: puts ("hppa2.0"); break;
+                       } break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+                   puts ("hppa2.0"); break;
+              #endif
+               default: puts ("hppa1.0"); break;
+               }
+                  exit (0);
+              }
+EOF
+       eval $set_cc_for_build
+       (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+       if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
+       rm -f $dummy.c $dummy
+       fi ;;
+       esac
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    ia64:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ia64-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    3050*:HI-UX:*:*)
+       sed 's/^        //' << EOF >$dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       eval $set_cc_for_build
+       $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+       rm -f $dummy.c $dummy
+       echo unknown-hitachi-hiuxwe2
+       exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit 0 ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+       echo hppa1.0-hp-mpeix
+       exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit 0 ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit 0 ;;
+    i*86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit 0 ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit 0 ;;
+    hppa*:OpenBSD:*:*)
+       echo hppa-unknown-openbsd
+       exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+       echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+             -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*T3D:*:*:*)
+       echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*T3E:*:*:*)
+       echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*SV1:*:*:*)
+       echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY-2:*:*:*)
+       echo cray2-cray-unicos
+        exit 0 ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+       FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    hp300:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:FreeBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+       exit 0 ;;
+    *:OpenBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin
+       exit 0 ;;
+    i*:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit 0 ;;
+    i*:PW*:*)
+       echo ${UNAME_MACHINE}-pc-pw32
+       exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+       # UNAME_MACHINE based on the output of uname instead of i386?
+       echo i386-pc-interix
+       exit 0 ;;
+    i*:UWIN*:*)
+       echo ${UNAME_MACHINE}-pc-uwin
+       exit 0 ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin
+       exit 0 ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    *:GNU:*:*)
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit 0 ;;
+    i*86:Minix:*:*)
+       echo ${UNAME_MACHINE}-pc-minix
+       exit 0 ;;
+    arm*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    ia64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux
+       exit 0 ;;
+    m68*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    mips:Linux:*:*)
+       case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
+         big)    echo mips-unknown-linux-gnu && exit 0 ;;
+         little) echo mipsel-unknown-linux-gnu && exit 0 ;;
+       esac
+       ;;
+    ppc:Linux:*:*)
+       echo powerpc-unknown-linux-gnu
+       exit 0 ;;
+    ppc64:Linux:*:*)
+       echo powerpc64-unknown-linux-gnu
+       exit 0 ;;
+    alpha:Linux:*:*)
+       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+         EV5)   UNAME_MACHINE=alphaev5 ;;
+         EV56)  UNAME_MACHINE=alphaev56 ;;
+         PCA56) UNAME_MACHINE=alphapca56 ;;
+         PCA57) UNAME_MACHINE=alphapca56 ;;
+         EV6)   UNAME_MACHINE=alphaev6 ;;
+         EV67)  UNAME_MACHINE=alphaev67 ;;
+         EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+       objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+       if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+       echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+       exit 0 ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+       # Look for CPU level
+       case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+         PA7*) echo hppa1.1-unknown-linux-gnu ;;
+         PA8*) echo hppa2.0-unknown-linux-gnu ;;
+         *)    echo hppa-unknown-linux-gnu ;;
+       esac
+       exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+       echo hppa64-unknown-linux-gnu
+       exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+       echo ${UNAME_MACHINE}-ibm-linux
+       exit 0 ;;
+    sh*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    x86_64:Linux:*:*)
+       echo x86_64-unknown-linux-gnu
+       exit 0 ;;
+    i*86:Linux:*:*)
+       # The BFD linker knows what the default object file format is, so
+       # first see if it will tell us. cd to the root directory to prevent
+       # problems with other programs or directories called `ld' in the path.
+       ld_supported_targets=`cd /; ld --help 2>&1 \
+                        | sed -ne '/supported targets:/!d
+                                   s/[         ][      ]*/ /g
+                                   s/.*supported targets: *//
+                                   s/ .*//
+                                   p'`
+        case "$ld_supported_targets" in
+         elf32-i386)
+               TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+               ;;
+         a.out-i386-linux)
+               echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+               exit 0 ;;               
+         coff-i386)
+               echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+               exit 0 ;;
+         "")
+               # Either a pre-BFD a.out linker (linux-gnuoldld) or
+               # one that does not give us useful --help.
+               echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+               exit 0 ;;
+       esac
+       # Determine whether the default compiler is a.out or elf
+       cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-pc-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-pc-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+       eval $set_cc_for_build
+       $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
+       rm -f $dummy.c $dummy
+       test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+       ;;
+    i*86:DYNIX/ptx:4*:*)
+       # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+       # earlier versions are messed up and put the nodename in both
+       # sysname and nodename.
+       echo i386-sequent-sysv4
+       exit 0 ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+       exit 0 ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+       UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+       else
+               echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+       fi
+       exit 0 ;;
+    i*86:*:5:[78]*)
+       case `/bin/uname -X | grep "^Machine"` in
+           *486*)           UNAME_MACHINE=i486 ;;
+           *Pentium)        UNAME_MACHINE=i586 ;;
+           *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+       esac
+       echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+       exit 0 ;;
+    i*86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit 0 ;;
+    i*86:*DOS:*:*)
+       echo ${UNAME_MACHINE}-pc-msdosdjgpp
+       exit 0 ;;
+    pc:*:*:*)
+       # Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+       echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit 0 ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+       fi
+       exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit 0 ;;
+    M68*:*:R3V[567]*:*)
+       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit 0 ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+       echo powerpc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo ${UNAME_MACHINE}-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit 0 ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit 0 ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit 0 ;;
+    *:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo hppa1.1-stratus-vos
+       exit 0 ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit 0 ;;
+    news*:NEWS-OS:6*:*)
+       echo mips-sony-newsos6
+       exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit 0 ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit 0 ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+    *:Rhapsody:*:*)
+       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+    *:Darwin:*:*)
+       echo `uname -p`-apple-darwin${UNAME_RELEASE}
+       exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+       if test "${UNAME_MACHINE}" = "x86pc"; then
+               UNAME_MACHINE=pc
+       fi
+       echo `uname -p`-${UNAME_MACHINE}-nto-qnx
+       exit 0 ;;
+    *:QNX:*:4*)
+       echo i386-pc-qnx
+       exit 0 ;;
+    NSR-[KW]:NONSTOP_KERNEL:*:*)
+       echo nsr-tandem-nsk${UNAME_RELEASE}
+       exit 0 ;;
+    *:NonStop-UX:*:*)
+       echo mips-compaq-nonstopux
+       exit 0 ;;
+    BS2000:POSIX*:*:*)
+       echo bs2000-siemens-sysv
+       exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+       echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+       exit 0 ;;
+    *:Plan9:*:*)
+       # "uname -m" is not consistent, so use $cputype instead. 386
+       # is converted to i386 for consistency with other x86
+       # operating systems.
+       if test "$cputype" = "386"; then
+           UNAME_MACHINE=i386
+       else
+           UNAME_MACHINE="$cputype"
+       fi
+       echo ${UNAME_MACHINE}-unknown-plan9
+       exit 0 ;;
+    i*86:OS/2:*:*)
+       # If we were able to find `uname', then EMX Unix compatibility
+       # is probably installed.
+       echo ${UNAME_MACHINE}-pc-os2-emx
+       exit 0 ;;
+    *:TOPS-10:*:*)
+       echo pdp10-unknown-tops10
+       exit 0 ;;
+    *:TENEX:*:*)
+       echo pdp10-unknown-tenex
+       exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+       echo pdp10-dec-tops20
+       exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+       echo pdp10-xkl-tops20
+       exit 0 ;;
+    *:TOPS-20:*:*)
+       echo pdp10-unknown-tops20
+       exit 0 ;;
+    *:ITS:*:*)
+       echo pdp10-unknown-its
+       exit 0 ;;
+    i*86:XTS-300:*:STOP)
+       echo ${UNAME_MACHINE}-unknown-stop
+       exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+         ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+eval $set_cc_for_build
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit 0 ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit 0 ;;
+    c34*)
+       echo c34-convex-bsd
+       exit 0 ;;
+    c38*)
+       echo c38-convex-bsd
+       exit 0 ;;
+    c4*)
+       echo c4-convex-bsd
+       exit 0 ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/apps/silcer/config.h.in b/apps/silcer/config.h.in
new file mode 100644 (file)
index 0000000..22d7de6
--- /dev/null
@@ -0,0 +1,199 @@
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+#undef ENABLE_NLS
+#undef HAVE_CATGETS
+#undef HAVE_GETTEXT
+#undef HAVE_LC_MESSAGES
+#undef HAVE_STPCPY
+#undef HAVE_LIBSM
+#undef PACKAGE_LOCALE_DIR
+#undef PACKAGE_DATA_DIR
+#undef PACKAGE_SOURCE_DIR
+
+#undef EXTRA_GNOME_LIBS
+#undef EXTRA_GNOME_CFLAGS
+
+/* Define if using `alloca.c'. */
+#undef C_ALLOCA
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+   systems. This function is required for `alloca.c' support on those systems.
+   */
+#undef CRAY_STACKSEG_END
+
+/* Define to 1 if translation of program messages to the user's native
+   language is requested. */
+#undef ENABLE_NLS
+
+/* Define if you have `alloca', as a function or macro. */
+#undef HAVE_ALLOCA
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
+#undef HAVE_ALLOCA_H
+
+/* Define if you have the `__argz_count' function. */
+#undef HAVE___ARGZ_COUNT
+
+/* Define if you have the <argz.h> header file. */
+#undef HAVE_ARGZ_H
+
+/* Define if you have the `__argz_next' function. */
+#undef HAVE___ARGZ_NEXT
+
+/* Define if you have the `__argz_stringify' function. */
+#undef HAVE___ARGZ_STRINGIFY
+
+/* Define if you have the `dcgettext' function. */
+#undef HAVE_DCGETTEXT
+
+/* Define if you have the `feof_unlocked' function. */
+#undef HAVE_FEOF_UNLOCKED
+
+/* Define if you have the `fgets_unlocked' function. */
+#undef HAVE_FGETS_UNLOCKED
+
+/* Define if you have the `getcwd' function. */
+#undef HAVE_GETCWD
+
+/* Define if you have the `getegid' function. */
+#undef HAVE_GETEGID
+
+/* Define if you have the `geteuid' function. */
+#undef HAVE_GETEUID
+
+/* Define if you have the `getgid' function. */
+#undef HAVE_GETGID
+
+/* Define if you have the `getpagesize' function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define if you have the `getuid' function. */
+#undef HAVE_GETUID
+
+/* Define if you have the iconv() function. */
+#undef HAVE_ICONV
+
+/* Define if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
+#undef HAVE_LANGINFO_CODESET
+
+/* Define if your <locale.h> file defines LC_MESSAGES. */
+#undef HAVE_LC_MESSAGES
+
+/* Define if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define if you have the <malloc.h> header file. */
+#undef HAVE_MALLOC_H
+
+/* Define if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define if you have the `mempcpy' function. */
+#undef HAVE_MEMPCPY
+
+/* Define if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define if you have the `munmap' function. */
+#undef HAVE_MUNMAP
+
+/* Define if you have the <nl_types.h> header file. */
+#undef HAVE_NL_TYPES_H
+
+/* Define if you have the `putenv' function. */
+#undef HAVE_PUTENV
+
+/* Define if you have the `setenv' function. */
+#undef HAVE_SETENV
+
+/* Define if you have the `setlocale' function. */
+#undef HAVE_SETLOCALE
+
+/* Define if you have the <stddef.h> header file. */
+#undef HAVE_STDDEF_H
+
+/* Define if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define if you have the `stpcpy' function. */
+#undef HAVE_STPCPY
+
+/* Define if you have the `strcasecmp' function. */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the `strchr' function. */
+#undef HAVE_STRCHR
+
+/* Define if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define if you have the `strtoul' function. */
+#undef HAVE_STRTOUL
+
+/* Define if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define if you have the `tsearch' function. */
+#undef HAVE_TSEARCH
+
+/* Define if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the <X11/SM/SMlib.h> header file. */
+#undef HAVE_X11_SM_SMLIB_H
+
+/* Define as const if the declaration of iconv() needs const. */
+#undef ICONV_CONST
+
+/* Define as `__inline' if that's what the C compiler calls it, or to nothing
+   if it is not supported. */
+#undef inline
+
+/* Define to `long' if <sys/types.h> does not define. */
+#undef off_t
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to `unsigned' if <sys/types.h> does not define. */
+#undef size_t
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at run-time.
+        STACK_DIRECTION > 0 => grows toward higher addresses
+        STACK_DIRECTION < 0 => grows toward lower addresses
+        STACK_DIRECTION = 0 => direction of growth unknown */
+#undef STACK_DIRECTION
+
+/* Define if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
diff --git a/apps/silcer/config.sub b/apps/silcer/config.sub
new file mode 100755 (executable)
index 0000000..12ebc78
--- /dev/null
@@ -0,0 +1,1410 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+#   Free Software Foundation, Inc.
+
+timestamp='2001-08-13'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit 0;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple | -axis)
+               os=
+               basic_machine=$1
+               ;;
+       -sim | -cisco | -oki | -wec | -winbond)
+               os=
+               basic_machine=$1
+               ;;
+       -scout)
+               ;;
+       -wrs)
+               os=-vxworks
+               basic_machine=$1
+               ;;
+       -chorusos*)
+               os=-chorusos
+               basic_machine=$1
+               ;;
+       -chorusrdb)
+               os=-chorusrdb
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco5)
+               os=-sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -udk*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+       -mint | -mint[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       1750a | 580 \
+       | a29k \
+       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+       | c4x | clipper \
+       | d10v | d30v | dsp16xx \
+       | fr30 \
+       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | i370 | i860 | i960 | ia64 \
+       | m32r | m68000 | m68k | m88k | mcore \
+       | mips16 | mips64 | mips64el | mips64orion | mips64orionel \
+       | mips64vr4100 | mips64vr4100el | mips64vr4300 \
+       | mips64vr4300el | mips64vr5000 | mips64vr5000el \
+       | mipsbe | mipsel | mipsle | mipstx39 | mipstx39el \
+       | mn10200 | mn10300 \
+       | ns16k | ns32k \
+       | openrisc \
+       | pdp10 | pdp11 | pj | pjl \
+       | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+       | pyramid \
+       | s390 | s390x \
+       | sh | sh[34] | sh[34]eb | shbe | shle \
+       | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \
+       | strongarm \
+       | tahoe | thumb | tic80 | tron \
+       | v850 \
+       | we32k \
+       | x86 | xscale \
+       | z8k)
+               basic_machine=$basic_machine-unknown
+               ;;
+       m6811 | m68hc11 | m6812 | m68hc12)
+               # Motorola 68HC11/12.
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+               ;;
+
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i*86 | x86_64)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       580-* \
+       | a29k-* \
+       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+       | alphapca5[67]-* | arc-* \
+       | arm-*  | armbe-* | armle-* | armv*-* \
+       | bs2000-* \
+       | c[123]* | c30-* | [cjt]90-* | c54x-* \
+       | clipper-* | cray2-* | cydra-* \
+       | d10v-* | d30v-* \
+       | elxsi-* \
+       | f30[01]-* | f700-* | fr30-* | fx80-* \
+       | h8300-* | h8500-* \
+       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+       | i*86-* | i860-* | i960-* | ia64-* \
+       | m32r-* \
+       | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \
+       | m88110-* | m88k-* | mcore-* \
+       | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \
+       | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \
+       | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipsel-* \
+       | mipsle-* | mipstx39-* | mipstx39el-* \
+       | none-* | np1-* | ns16k-* | ns32k-* \
+       | orion-* \
+       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+       | pyramid-* \
+       | romp-* | rs6000-* \
+       | s390-* | s390x-* \
+       | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \
+       | sparc-* | sparc64-* | sparc86x-* | sparclite-* \
+       | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* \
+       | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
+       | v850-* | vax-* \
+       | we32k-* \
+       | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \
+       | ymp-* \
+       | z8k-*)
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       386bsd)
+               basic_machine=i386-unknown
+               os=-bsd
+               ;;
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       a29khif)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       adobe68k)
+               basic_machine=m68010-adobe
+               os=-scout
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-unknown
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-unknown
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-unknown
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       apollo68bsd)
+               basic_machine=m68k-apollo
+               os=-bsd
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       cray2)
+               basic_machine=cray2-cray
+               os=-unicos
+               ;;
+       [cjt]90)
+               basic_machine=${basic_machine}-cray
+               os=-unicos
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       cris | cris-* | etrax*)
+               basic_machine=cris-axis
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       es1800 | OSE68k | ose68k | ose | OSE)
+               basic_machine=m68k-ericsson
+               os=-ose
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       go32)
+               basic_machine=i386-pc
+               os=-go32
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       h8300xray)
+               basic_machine=h8300-hitachi
+               os=-xray
+               ;;
+       h8500hms)
+               basic_machine=h8500-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k6[0-9][0-9] | hp6[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k7[0-79][0-9] | hp7[0-79][0-9])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k78[0-9] | hp78[0-9])
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][13679] | hp8[0-9][13679])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       hppaosf)
+               basic_machine=hppa1.1-hp
+               os=-osf
+               ;;
+       hppro)
+               basic_machine=hppa1.1-hp
+               os=-proelf
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               ;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+       i*86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i*86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i*86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i*86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       i386mach)
+               basic_machine=i386-mach
+               os=-mach
+               ;;
+       i386-vsta | vsta)
+               basic_machine=i386-unknown
+               os=-vsta
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       mingw32)
+               basic_machine=i386-pc
+               os=-mingw32
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+       mipsel*-linux*)
+               basic_machine=mipsel-unknown
+               os=-linux-gnu
+               ;;
+       mips*-linux*)
+               basic_machine=mips-unknown
+               os=-linux-gnu
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       mmix*)
+               basic_machine=mmix-knuth
+               os=-mmixware
+               ;;
+       monitor)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       msdos)
+               basic_machine=i386-pc
+               os=-msdos
+               ;;
+       mvs)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       netbsd386)
+               basic_machine=i386-unknown
+               os=-netbsd
+               ;;
+       netwinder)
+               basic_machine=armv4l-rebel
+               os=-linux
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       necv70)
+               basic_machine=v70-nec
+               os=-sysv
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       mon960)
+               basic_machine=i960-intel
+               os=-mon960
+               ;;
+       nonstopux)
+               basic_machine=mips-compaq
+               os=-nonstopux
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+       nsr-tandem)
+               basic_machine=nsr-tandem
+               ;;
+       op50n-* | op60c-*)
+               basic_machine=hppa1.1-oki
+               os=-proelf
+               ;;
+       OSE68000 | ose68000)
+               basic_machine=m68000-ericsson
+               os=-ose
+               ;;
+       os68k)
+               basic_machine=m68k-none
+               os=-os68k
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+        pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pentium | p5 | k5 | k6 | nexgen)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | 6x86 | athlon)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2)
+               basic_machine=i686-pc
+               ;;
+       pentium-* | p5-* | k5-* | k6-* | nexgen-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | 6x86-* | athlon-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=power-ibm
+               ;;
+       ppc)    basic_machine=powerpc-unknown
+               ;;
+       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64)  basic_machine=powerpc64-unknown
+               ;;
+       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+               basic_machine=powerpc64le-unknown
+               ;;
+       ppc64le-* | powerpc64little-*)
+               basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       pw32)
+               basic_machine=i586-unknown
+               os=-pw32
+               ;;
+       rom68k)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       sa29200)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sparclite-wrs)
+               basic_machine=sparclite-wrs
+               os=-vxworks
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       st2000)
+               basic_machine=m68k-tandem
+               ;;
+       stratus)
+               basic_machine=i860-stratus
+               os=-sysv4
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+       sv1)
+               basic_machine=sv1-cray
+               os=-unicos
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       t3e)
+               basic_machine=t3e-cray
+               os=-unicos
+               ;;
+       tic54x | c54x*)
+               basic_machine=tic54x-unknown
+               os=-coff
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       v810 | necv810)
+               basic_machine=v810-nec
+               os=-none
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       w65*)
+               basic_machine=w65-wdc
+               os=-none
+               ;;
+       w89k-*)
+               basic_machine=hppa1.1-winbond
+               os=-proelf
+               ;;
+       windows32)
+               basic_machine=i386-pc
+               os=-windows32-msvcrt
+               ;;
+       xmp)
+               basic_machine=xmp-cray
+               os=-unicos
+               ;;
+        xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       z8k-*-coff)
+               basic_machine=z8k-unknown
+               os=-sim
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       w89k)
+               basic_machine=hppa1.1-winbond
+               ;;
+       op50n)
+               basic_machine=hppa1.1-oki
+               ;;
+       op60c)
+               basic_machine=hppa1.1-oki
+               ;;
+       mips)
+               if [ x$os = x-linux-gnu ]; then
+                       basic_machine=mips-unknown
+               else
+                       basic_machine=mips-mips
+               fi
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp10)
+               # there are many clones, so DEC is not a safe bet
+               basic_machine=pdp10-unknown
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sh3 | sh4 | sh3eb | sh4eb)
+               basic_machine=sh-unknown
+               ;;
+       sparc | sparcv9 | sparcv9b)
+               basic_machine=sparc-sun
+               ;;
+        cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       mac | mpw | mac-mpw)
+               basic_machine=m68k-apple
+               ;;
+       pmac | pmac-mpw)
+               basic_machine=powerpc-apple
+               ;;
+       c4x*)
+               basic_machine=c4x-none
+               os=-coff
+               ;;
+       *-unknown)
+               # Make sure to match an already-canonicalized machine name.
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+       # -solaris* is a basic system type, with this one exception.
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -svr4*)
+               os=-sysv4
+               ;;
+       -unixware*)
+               os=-sysv4.2uw
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+             | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -chorusos* | -chorusrdb* \
+             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
+             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+             | -os2* | -vos*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -qnx*)
+               case $basic_machine in
+                   x86-* | i*86-*)
+                       ;;
+                   *)
+                       os=-nto$os
+                       ;;
+               esac
+               ;;
+       -nto*)
+               os=-nto-qnx
+               ;;
+       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+             | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+               ;;
+       -mac*)
+               os=`echo $os | sed -e 's|mac|macos|'`
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -opened*)
+               os=-openedition
+               ;;
+       -wince*)
+               os=-wince
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -386bsd)
+               os=-bsd
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       -nsk*)
+               os=-nsk
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -ose*)
+               os=-ose
+               ;;
+       -es1800*)
+               os=-ose
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+        -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+               os=-mint
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-rebel)
+               os=-linux
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+       pdp10-*)
+               os=-tops20
+               ;;
+        pdp11-*)
+               os=-none
+               ;;
+       *-dec | vax-*)
+               os=-ultrix4.2
+               ;;
+       m68*-apollo)
+               os=-domain
+               ;;
+       i386-sun)
+               os=-sunos4.0.2
+               ;;
+       m68000-sun)
+               os=-sunos3
+               # This also exists in the configure program, but was not the
+               # default.
+               # os=-sunos4
+               ;;
+       m68*-cisco)
+               os=-aout
+               ;;
+       mips*-cisco)
+               os=-elf
+               ;;
+       mips*-*)
+               os=-elf
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-be)
+               os=-beos
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-wec)
+               os=-proelf
+               ;;
+       *-winbond)
+               os=-proelf
+               ;;
+       *-oki)
+               os=-proelf
+               ;;
+       *-hp)
+               os=-hpux
+               ;;
+       *-hitachi)
+               os=-hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=-sysv
+               ;;
+       *-cbm)
+               os=-amigaos
+               ;;
+       *-dg)
+               os=-dgux
+               ;;
+       *-dolphin)
+               os=-sysv3
+               ;;
+       m68k-ccur)
+               os=-rtu
+               ;;
+       m88k-omron*)
+               os=-luna
+               ;;
+       *-next )
+               os=-nextstep
+               ;;
+       *-sequent)
+               os=-ptx
+               ;;
+       *-crds)
+               os=-unos
+               ;;
+       *-ns)
+               os=-genix
+               ;;
+       i370-*)
+               os=-mvs
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+        *-gould)
+               os=-sysv
+               ;;
+        *-highlevel)
+               os=-bsd
+               ;;
+       *-encore)
+               os=-bsd
+               ;;
+        *-sgi)
+               os=-irix
+               ;;
+        *-siemens)
+               os=-sysv4
+               ;;
+       *-masscomp)
+               os=-rtu
+               ;;
+       f30[01]-fujitsu | f700-fujitsu)
+               os=-uxpv
+               ;;
+       *-rom68k)
+               os=-coff
+               ;;
+       *-*bug)
+               os=-coff
+               ;;
+       *-apple)
+               os=-macos
+               ;;
+       *-atari*)
+               os=-mint
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -aix*)
+                               vendor=ibm
+                               ;;
+                       -beos*)
+                               vendor=be
+                               ;;
+                       -hpux*)
+                               vendor=hp
+                               ;;
+                       -mpeix*)
+                               vendor=hp
+                               ;;
+                       -hiux*)
+                               vendor=hitachi
+                               ;;
+                       -unos*)
+                               vendor=crds
+                               ;;
+                       -dgux*)
+                               vendor=dg
+                               ;;
+                       -luna*)
+                               vendor=omron
+                               ;;
+                       -genix*)
+                               vendor=ns
+                               ;;
+                       -mvs* | -opened*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -vxsim* | -vxworks*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+                       -hms*)
+                               vendor=hitachi
+                               ;;
+                       -mpw* | -macos*)
+                               vendor=apple
+                               ;;
+                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+                               vendor=atari
+                               ;;
+                       -vos*)
+                               vendor=stratus
+                               ;;
+               esac
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/apps/silcer/configure.in b/apps/silcer/configure.in
new file mode 100644 (file)
index 0000000..aef8e2c
--- /dev/null
@@ -0,0 +1,46 @@
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(configure.in)
+AM_INIT_AUTOMAKE(silcer, 0.1)
+AM_CONFIG_HEADER(config.h)
+AC_PREFIX_DEFAULT(/usr/local)
+
+AM_ACLOCAL_INCLUDE(macros)
+AM_PROG_XML_I18N_TOOLS
+GNOME_COMMON_INIT
+GNOME_INIT
+
+AC_ISC_POSIX
+AC_PROG_CC
+AC_PROG_CXX
+AM_PROG_CC_STDC
+AC_HEADER_STDC
+
+GNOME_CXX_WARNINGS
+GNOME_COMPILE_WARNINGS
+GNOME_X_CHECKS
+
+EXTRA_GNOME_LIBS="`$GNOME_CONFIG --libs libglade gnomeui gnomemm gal`"
+EXTRA_GNOME_CFLAGS="`$GNOME_CONFIG --cflags libglade gnomeui gnomemm gal`"
+AC_SUBST(EXTRA_GNOME_LIBS)  
+AC_SUBST(EXTRA_GNOME_CFLAGS)
+
+dnl Add the languages which your application supports here.
+ALL_LINGUAS=""
+AM_GNU_GETTEXT
+
+dnl Set PACKAGE_LOCALE_DIR in config.h.
+if test "x${prefix}" = "xNONE"; then
+  AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${ac_default_prefix}/${DATADIRNAME}/locale")
+else
+  AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${prefix}/${DATADIRNAME}/locale")
+fi
+
+AC_OUTPUT([
+Makefile
+macros/Makefile
+src/Makefile
+intl/Makefile
+po/Makefile.in
+])
+
diff --git a/apps/silcer/depcomp b/apps/silcer/depcomp
new file mode 100755 (executable)
index 0000000..6589965
--- /dev/null
@@ -0,0 +1,411 @@
+#! /bin/sh
+
+# depcomp - compile a program generating dependencies as side-effects
+# Copyright 1999, 2000 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 to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+# `libtool' can also be set to `yes' or `no'.
+
+depfile=${depfile-`echo "$object" | sed 's,\([^/]*\)$,.deps/\1,;s/\.\([^.]*\)$/.P\1/'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+  "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> $depfile
+    echo >> $depfile
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> $depfile
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  This file always lives in the current directory.
+  # Also, the AIX compiler puts `$object:' at the start of each line;
+  # $object doesn't have directory information.
+  stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'`
+  tmpdepfile="$stripped.u"
+  outname="$stripped.o"
+  if test "$libtool" = yes; then
+    "$@" -Wc,-M
+  else
+    "$@" -M
+  fi
+
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+tru64)
+   # The Tru64 AIX compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+
+   tmpdepfile1="$object.d"
+   tmpdepfile2=`echo "$object" | sed -e 's/.o$/.d/'` 
+   if test "$libtool" = yes; then
+      "$@" -Wc,-MD
+   else
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2"
+      exit $stat
+   fi
+
+   if test -f "$tmpdepfile1"; then
+      tmpdepfile="$tmpdepfile1"
+   else
+      tmpdepfile="$tmpdepfile2"
+   fi
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a space and a tab in the [].
+      sed -e 's,^.*\.[a-z]*:[  ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the proprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  test -z "$dashmflag" && dashmflag=-M
+  ( IFS=" "
+    case " $* " in
+    *" --mode=compile "*) # this is libtool, let us make it quiet
+      for arg
+      do # cycle over the arguments
+        case "$arg" in
+       "--mode=compile")
+         # insert --quiet before "--mode=compile"
+         set fnord "$@" --quiet
+         shift # fnord
+         ;;
+       esac
+       set fnord "$@" "$arg"
+       shift # fnord
+       shift # "$arg"
+      done
+      ;;
+    esac
+    "$@" $dashmflag | sed 's:^[^:]*\:[         ]*:'"$object"'\: :' > "$tmpdepfile"
+  ) &
+  proc=$!
+  "$@"
+  stat=$?
+  wait "$proc"
+  if test "$stat" != 0; then exit $stat; fi
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  # X makedepend
+  (
+    shift
+    cleared=no
+    for arg in "$@"; do
+      case $cleared in no)
+        set ""; shift
+       cleared=yes
+      esac
+      case "$arg" in
+        -D*|-I*)
+         set fnord "$@" "$arg"; shift;;
+       -*)
+         ;;
+       *)
+         set fnord "$@" "$arg"; shift;;
+      esac
+    done
+    obj_suffix="`echo $object | sed 's/^.*\././'`"
+    touch "$tmpdepfile"
+    ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  ) &
+  proc=$!
+  "$@"
+  stat=$?
+  wait "$proc"
+  if test "$stat" != 0; then exit $stat; fi
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tail +3 "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the proprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  ( IFS=" "
+    case " $* " in
+    *" --mode=compile "*)
+      for arg
+      do # cycle over the arguments
+        case $arg in
+       "--mode=compile")
+         # insert --quiet before "--mode=compile"
+         set fnord "$@" --quiet
+         shift # fnord
+         ;;
+       esac
+       set fnord "$@" "$arg"
+       shift # fnord
+       shift # "$arg"
+      done
+      ;;
+    esac
+    "$@" -E |
+    sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  ) &
+  proc=$!
+  "$@"
+  stat=$?
+  wait "$proc"
+  if test "$stat" != 0; then exit $stat; fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the proprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  ( IFS=" "
+    case " $* " in
+    *" --mode=compile "*)
+      for arg
+      do # cycle over the arguments
+        case $arg in
+       "--mode=compile")
+         # insert --quiet before "--mode=compile"
+         set fnord "$@" --quiet
+         shift # fnord
+         ;;
+       esac
+       set fnord "$@" "$arg"
+       shift # fnord
+       shift # "$arg"
+      done
+      ;;
+    esac
+    "$@" -E |
+    sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+  ) &
+  proc=$!
+  "$@"
+  stat=$?
+  wait "$proc"
+  if test "$stat" != 0; then exit $stat; fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::   \1 \\:p' >> "$depfile"
+  echo "       " >> "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
diff --git a/apps/silcer/install-sh b/apps/silcer/install-sh
new file mode 100755 (executable)
index 0000000..e9de238
--- /dev/null
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+               chmodcmd=""
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/apps/silcer/intl/ChangeLog b/apps/silcer/intl/ChangeLog
new file mode 100644 (file)
index 0000000..e62afd4
--- /dev/null
@@ -0,0 +1,4 @@
+2001-07-24  GNU  <bug-gnu-utils@gnu.org>
+
+       * Version 0.10.39 released.
+
diff --git a/apps/silcer/intl/Makefile.in b/apps/silcer/intl/Makefile.in
new file mode 100644 (file)
index 0000000..889ba23
--- /dev/null
@@ -0,0 +1,312 @@
+# 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@
+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
+
+# 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/apps/silcer/intl/Makefile.in.in b/apps/silcer/intl/Makefile.in.in
new file mode 100644 (file)
index 0000000..32b7376
--- /dev/null
@@ -0,0 +1,196 @@
+# 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 = ChangeLog 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
+
+# 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/apps/silcer/intl/VERSION b/apps/silcer/intl/VERSION
new file mode 100644 (file)
index 0000000..be17e27
--- /dev/null
@@ -0,0 +1 @@
+GNU gettext library from gettext-0.10.39
diff --git a/apps/silcer/intl/bindtextdom.c b/apps/silcer/intl/bindtextdom.c
new file mode 100644 (file)
index 0000000..7e5a74a
--- /dev/null
@@ -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/apps/silcer/intl/config.charset b/apps/silcer/intl/config.charset
new file mode 100755 (executable)
index 0000000..f4f2611
--- /dev/null
@@ -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/apps/silcer/intl/dcgettext.c b/apps/silcer/intl/dcgettext.c
new file mode 100644 (file)
index 0000000..469e78d
--- /dev/null
@@ -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/apps/silcer/intl/dcigettext.c b/apps/silcer/intl/dcigettext.c
new file mode 100644 (file)
index 0000000..b7627bf
--- /dev/null
@@ -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/apps/silcer/intl/dcngettext.c b/apps/silcer/intl/dcngettext.c
new file mode 100644 (file)
index 0000000..e5da257
--- /dev/null
@@ -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/apps/silcer/intl/dgettext.c b/apps/silcer/intl/dgettext.c
new file mode 100644 (file)
index 0000000..c513041
--- /dev/null
@@ -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/apps/silcer/intl/dngettext.c b/apps/silcer/intl/dngettext.c
new file mode 100644 (file)
index 0000000..79aaa9a
--- /dev/null
@@ -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/apps/silcer/intl/explodename.c b/apps/silcer/intl/explodename.c
new file mode 100644 (file)
index 0000000..c4ddcc4
--- /dev/null
@@ -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/apps/silcer/intl/finddomain.c b/apps/silcer/intl/finddomain.c
new file mode 100644 (file)
index 0000000..4882554
--- /dev/null
@@ -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/apps/silcer/intl/gettext.c b/apps/silcer/intl/gettext.c
new file mode 100644 (file)
index 0000000..a640205
--- /dev/null
@@ -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/apps/silcer/intl/gettext.h b/apps/silcer/intl/gettext.h
new file mode 100644 (file)
index 0000000..eb58890
--- /dev/null
@@ -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/apps/silcer/intl/gettextP.h b/apps/silcer/intl/gettextP.h
new file mode 100644 (file)
index 0000000..ee8ca48
--- /dev/null
@@ -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/apps/silcer/intl/hash-string.h b/apps/silcer/intl/hash-string.h
new file mode 100644 (file)
index 0000000..37d4ce1
--- /dev/null
@@ -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/apps/silcer/intl/intl-compat.c b/apps/silcer/intl/intl-compat.c
new file mode 100644 (file)
index 0000000..b8edaa1
--- /dev/null
@@ -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/apps/silcer/intl/l10nflist.c b/apps/silcer/intl/l10nflist.c
new file mode 100644 (file)
index 0000000..557253e
--- /dev/null
@@ -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;
+}
+
+\f
+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;
+}
+\f
+/* 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/apps/silcer/intl/libgettext.h b/apps/silcer/intl/libgettext.h
new file mode 100644 (file)
index 0000000..553382c
--- /dev/null
@@ -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/apps/silcer/intl/libgnuintl.h b/apps/silcer/intl/libgnuintl.h
new file mode 100644 (file)
index 0000000..577001a
--- /dev/null
@@ -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/apps/silcer/intl/loadinfo.h b/apps/silcer/intl/loadinfo.h
new file mode 100644 (file)
index 0000000..5171a8f
--- /dev/null
@@ -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/apps/silcer/intl/loadmsgcat.c b/apps/silcer/intl/loadmsgcat.c
new file mode 100644 (file)
index 0000000..d589243
--- /dev/null
@@ -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/apps/silcer/intl/localcharset.c b/apps/silcer/intl/localcharset.c
new file mode 100644 (file)
index 0000000..61f8f3e
--- /dev/null
@@ -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/apps/silcer/intl/locale.alias b/apps/silcer/intl/locale.alias
new file mode 100644 (file)
index 0000000..48940f7
--- /dev/null
@@ -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/apps/silcer/intl/localealias.c b/apps/silcer/intl/localealias.c
new file mode 100644 (file)
index 0000000..76f19a9
--- /dev/null
@@ -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/apps/silcer/intl/ngettext.c b/apps/silcer/intl/ngettext.c
new file mode 100644 (file)
index 0000000..8b1fa02
--- /dev/null
@@ -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/apps/silcer/intl/plural.c b/apps/silcer/intl/plural.c
new file mode 100644 (file)
index 0000000..8191335
--- /dev/null
@@ -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
+\f
+/* 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
+\f
+#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"
+\f
+  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/apps/silcer/intl/plural.y b/apps/silcer/intl/plural.y
new file mode 100644 (file)
index 0000000..42ffa0e
--- /dev/null
@@ -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/apps/silcer/intl/ref-add.sin b/apps/silcer/intl/ref-add.sin
new file mode 100644 (file)
index 0000000..167374e
--- /dev/null
@@ -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/apps/silcer/intl/ref-del.sin b/apps/silcer/intl/ref-del.sin
new file mode 100644 (file)
index 0000000..613cf37
--- /dev/null
@@ -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/apps/silcer/intl/textdomain.c b/apps/silcer/intl/textdomain.c
new file mode 100644 (file)
index 0000000..05c2fd7
--- /dev/null
@@ -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/apps/silcer/macros/Makefile.am b/apps/silcer/macros/Makefile.am
new file mode 100644 (file)
index 0000000..cb7c185
--- /dev/null
@@ -0,0 +1,42 @@
+## Please update this variable if any new macros are created
+
+MACROS=                                                \
+  aclocal-include.m4                           \
+  compiler-flags.m4                            \
+  curses.m4                                    \
+  gnome-bonobo-check.m4                                \
+  gnome-fileutils.m4                           \
+  gnome-ghttp-check.m4                         \
+  gnome-gnorba-check.m4                                \
+  gnome-guile-checks.m4                                \
+  gnome-libgtop-check.m4                       \
+  gnome-objc-checks.m4                         \
+  gnome-orbit-check.m4                         \
+  gnome-print-check.m4                         \
+  gnome-pthread-check.m4                       \
+  gnome-support.m4                             \
+  gnome-undelfs.m4                             \
+  gnome-vfs.m4                                 \
+  gnome-x-checks.m4                            \
+  gnome-xml-check.m4                           \
+  gnome.m4                                     \
+  gperf-check.m4                               \
+  linger.m4                                    \
+  need-declaration.m4
+
+EXTRA_DIST=$(MACROS) gnome-common.m4 gnome-gettext.m4 autogen.sh
+MAINTAINERCLEANFILES=macros.dep
+
+@MAINT@macros.dep: Makefile.am
+@MAINT@        @echo '$$(top_srcdir)/aclocal.m4: $(MACROS:%=macros/%)' > $@
+
+if INSIDE_GNOME_COMMON
+gnome_aclocaldir = $(datadir)/aclocal/gnome-macros
+
+gnome-macros.dep: Makefile.am
+       @echo '$$(top_srcdir)/aclocal.m4: $(MACROS:%=$(gnome_aclocaldir)/%)' > $@
+
+gnome_aclocal_DATA = $(MACROS) gnome-macros.dep gnome-common.m4 \
+       gnome-gettext.m4 autogen.sh
+
+endif
diff --git a/apps/silcer/macros/Makefile.in b/apps/silcer/macros/Makefile.in
new file mode 100644 (file)
index 0000000..c1d6089
--- /dev/null
@@ -0,0 +1,305 @@
+# Makefile.in generated automatically by automake 1.5 from Makefile.am.
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AMTAR = @AMTAR@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CXX = @CXX@
+DATADIRNAME = @DATADIRNAME@
+DEPDIR = @DEPDIR@
+EXEEXT = @EXEEXT@
+EXTRA_GNOME_CFLAGS = @EXTRA_GNOME_CFLAGS@
+EXTRA_GNOME_LIBS = @EXTRA_GNOME_LIBS@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOMEGNORBA_LIBS = @GNOMEGNORBA_LIBS@
+GNOMEUI_LIBS = @GNOMEUI_LIBS@
+GNOME_ACLOCAL_DIR = @GNOME_ACLOCAL_DIR@
+GNOME_APPLETS_LIBS = @GNOME_APPLETS_LIBS@
+GNOME_CAPPLET_LIBS = @GNOME_CAPPLET_LIBS@
+GNOME_CONFIG = @GNOME_CONFIG@
+GNOME_DOCKLETS_LIBS = @GNOME_DOCKLETS_LIBS@
+GNOME_INCLUDEDIR = @GNOME_INCLUDEDIR@
+GNOME_LIBDIR = @GNOME_LIBDIR@
+GNOME_LIBS = @GNOME_LIBS@
+GNORBA_CFLAGS = @GNORBA_CFLAGS@
+GNORBA_LIBS = @GNORBA_LIBS@
+GTKXMHTML_LIBS = @GTKXMHTML_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIBICONV = @LIBICONV@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+OBJEXT = @OBJEXT@
+ORBIT_CFLAGS = @ORBIT_CFLAGS@
+ORBIT_CONFIG = @ORBIT_CONFIG@
+ORBIT_IDL = @ORBIT_IDL@
+ORBIT_LIBS = @ORBIT_LIBS@
+PACKAGE = @PACKAGE@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PTHREAD_LIB = @PTHREAD_LIB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XML_I18N_EXTRACT = @XML_I18N_EXTRACT@
+XML_I18N_MERGE = @XML_I18N_MERGE@
+XML_I18N_TOOLS_PERL = @XML_I18N_TOOLS_PERL@
+XML_I18N_UPDATE = @XML_I18N_UPDATE@
+XPM_LIBS = @XPM_LIBS@
+ZVT_LIBS = @ZVT_LIBS@
+am__include = @am__include@
+am__quote = @am__quote@
+cflags_set = @cflags_set@
+cxxflags_set = @cxxflags_set@
+install_sh = @install_sh@
+
+MACROS = \
+  aclocal-include.m4                           \
+  compiler-flags.m4                            \
+  curses.m4                                    \
+  gnome-bonobo-check.m4                                \
+  gnome-fileutils.m4                           \
+  gnome-ghttp-check.m4                         \
+  gnome-gnorba-check.m4                                \
+  gnome-guile-checks.m4                                \
+  gnome-libgtop-check.m4                       \
+  gnome-objc-checks.m4                         \
+  gnome-orbit-check.m4                         \
+  gnome-print-check.m4                         \
+  gnome-pthread-check.m4                       \
+  gnome-support.m4                             \
+  gnome-undelfs.m4                             \
+  gnome-vfs.m4                                 \
+  gnome-x-checks.m4                            \
+  gnome-xml-check.m4                           \
+  gnome.m4                                     \
+  gperf-check.m4                               \
+  linger.m4                                    \
+  need-declaration.m4
+
+
+EXTRA_DIST = $(MACROS) gnome-common.m4 gnome-gettext.m4 autogen.sh
+MAINTAINERCLEANFILES = macros.dep
+
+@INSIDE_GNOME_COMMON_TRUE@gnome_aclocaldir = $(datadir)/aclocal/gnome-macros
+
+@INSIDE_GNOME_COMMON_TRUE@gnome_aclocal_DATA = $(MACROS) gnome-macros.dep gnome-common.m4 \
+@INSIDE_GNOME_COMMON_TRUE@     gnome-gettext.m4 autogen.sh
+
+subdir = macros
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DATA = $(gnome_aclocal_DATA)
+
+DIST_COMMON = Makefile.am Makefile.in
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  macros/Makefile
+Makefile:  $(srcdir)/Makefile.in  $(top_builddir)/config.status
+       cd $(top_builddir) && \
+         CONFIG_HEADERS= CONFIG_LINKS= \
+         CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status
+uninstall-info-am:
+install-gnome_aclocalDATA: $(gnome_aclocal_DATA)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(gnome_aclocaldir)
+       @list='$(gnome_aclocal_DATA)'; for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         f="`echo $$p | sed -e 's|^.*/||'`"; \
+         echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(gnome_aclocaldir)/$$f"; \
+         $(INSTALL_DATA) $$d$$p $(DESTDIR)$(gnome_aclocaldir)/$$f; \
+       done
+
+uninstall-gnome_aclocalDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(gnome_aclocal_DATA)'; for p in $$list; do \
+         f="`echo $$p | sed -e 's|^.*/||'`"; \
+         echo " rm -f $(DESTDIR)$(gnome_aclocaldir)/$$f"; \
+         rm -f $(DESTDIR)$(gnome_aclocaldir)/$$f; \
+       done
+tags: TAGS
+TAGS:
+
+
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+       @for file in $(DISTFILES); do \
+         if test -f $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           $(mkinstalldirs) "$(distdir)/$$dir"; \
+         fi; \
+         if test -d $$d/$$file; then \
+           cp -pR $$d/$$file $(distdir) \
+           || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+
+installdirs:
+       $(mkinstalldirs) $(DESTDIR)$(gnome_aclocaldir)
+
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+       -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-gnome_aclocalDATA
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+uninstall-am: uninstall-gnome_aclocalDATA uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+       distclean-generic distdir dvi dvi-am info info-am install \
+       install-am install-data install-data-am install-exec \
+       install-exec-am install-gnome_aclocalDATA install-info \
+       install-info-am install-man install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic \
+       uninstall uninstall-am uninstall-gnome_aclocalDATA \
+       uninstall-info-am
+
+
+macros.dep: Makefile.am
+       @echo '$$(top_srcdir)/aclocal.m4: $(MACROS:%=macros/%)' > $@
+
+@INSIDE_GNOME_COMMON_TRUE@gnome-macros.dep: Makefile.am
+@INSIDE_GNOME_COMMON_TRUE@     @echo '$$(top_srcdir)/aclocal.m4: $(MACROS:%=$(gnome_aclocaldir)/%)' > $@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/apps/silcer/macros/aclocal-include.m4 b/apps/silcer/macros/aclocal-include.m4
new file mode 100644 (file)
index 0000000..abf6533
--- /dev/null
@@ -0,0 +1,16 @@
+# aclocal-include.m4
+# 
+# This macro adds the name macrodir to the set of directories
+# that `aclocal' searches for macros.  
+
+# serial 1
+
+dnl AM_ACLOCAL_INCLUDE(macrodir)
+AC_DEFUN([AM_ACLOCAL_INCLUDE],
+[
+       AM_CONDITIONAL(INSIDE_GNOME_COMMON, test x = y)
+
+       test -n "$ACLOCAL_FLAGS" && ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
+
+       for k in $1 ; do ACLOCAL="$ACLOCAL -I $k" ; done
+])
diff --git a/apps/silcer/macros/autogen.sh b/apps/silcer/macros/autogen.sh
new file mode 100644 (file)
index 0000000..43d7d3f
--- /dev/null
@@ -0,0 +1,193 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+DIE=0
+
+if [ -n "$GNOME2_PATH" ]; then
+       ACLOCAL_FLAGS="-I $GNOME2_PATH/share/aclocal $ACLOCAL_FLAGS"
+       PATH="$GNOME2_PATH/bin:$PATH"
+       export PATH
+fi
+
+(autoconf --version) < /dev/null > /dev/null 2>&1 || {
+  echo
+  echo "**Error**: You must have \`autoconf' installed to compile Gnome."
+  echo "Download the appropriate package for your distribution,"
+  echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+  DIE=1
+}
+
+(grep "^AM_PROG_XML_I18N_TOOLS" $srcdir/configure.in >/dev/null) && {
+  (xml-i18n-toolize --version) < /dev/null > /dev/null 2>&1 || {
+    echo 
+    echo "**Error**: You must have \`xml-i18n-toolize' installed to compile Gnome."
+    echo "Get ftp://ftp.gnome.org/pub/GNOME/stable/sources/xml-i18n-tools/xml-i18n-tools-0.6.tar.gz"
+    echo "(or a newer version if it is available)"
+    DIE=1
+  }
+}
+
+(grep "^AM_PROG_LIBTOOL" $srcdir/configure.in >/dev/null) && {
+  (libtool --version) < /dev/null > /dev/null 2>&1 || {
+    echo
+    echo "**Error**: You must have \`libtool' installed to compile Gnome."
+    echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz"
+    echo "(or a newer version if it is available)"
+    DIE=1
+  }
+}
+
+#grep "^AM_GNU_GETTEXT" $srcdir/configure.in >/dev/null && {
+#  grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \
+#  (gettext --version) < /dev/null > /dev/null 2>&1 || {
+#    echo
+#    echo "**Error**: You must have \`gettext' installed to compile Gnome."
+#    echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz"
+#    echo "(or a newer version if it is available)"
+#    DIE=1
+#  }
+#}
+
+#grep "^AM_GNOME_GETTEXT" $srcdir/configure.in >/dev/null && {
+#  grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \
+#  (gettext --version) < /dev/null > /dev/null 2>&1 || {
+#    echo
+#    echo "**Error**: You must have \`gettext' installed to compile Gnome."
+#    echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz"
+#    echo "(or a newer version if it is available)"
+#    DIE=1
+#  }
+#}
+
+(automake --version) < /dev/null > /dev/null 2>&1 || {
+  echo
+  echo "**Error**: You must have \`automake' installed to compile Gnome."
+  echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz"
+  echo "(or a newer version if it is available)"
+  DIE=1
+  NO_AUTOMAKE=yes
+}
+
+
+# if no automake, don't bother testing for aclocal
+test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || {
+  echo
+  echo "**Error**: Missing \`aclocal'.  The version of \`automake'"
+  echo "installed doesn't appear recent enough."
+  echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz"
+  echo "(or a newer version if it is available)"
+  DIE=1
+}
+
+if test "$DIE" -eq 1; then
+  exit 1
+fi
+
+if test -z "$*"; then
+  echo "**Warning**: I am going to run \`configure' with no arguments."
+  echo "If you wish to pass any to it, please specify them on the"
+  echo \`$0\'" command line."
+  echo
+fi
+
+case $CC in
+xlc )
+  am_opt=--include-deps;;
+esac
+
+for coin in `find $srcdir -name configure.in -print`
+do 
+  dr=`dirname $coin`
+  if test -f $dr/NO-AUTO-GEN; then
+    echo skipping $dr -- flagged as no auto-gen
+  else
+    echo processing $dr
+    macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin`
+    ( cd $dr
+      macrosdir=`find . -name macros -print`
+      for i in $macrodirs; do
+       if test -f $i/gnome-gettext.m4; then
+         DELETEFILES="$DELETEFILES $i/gnome-gettext.m4"
+       fi
+      done
+
+      echo "deletefiles is $DELETEFILES"
+      aclocalinclude="$ACLOCAL_FLAGS"
+      for k in $aclocalinclude; do
+       if test -d $k; then
+         if [ -f $k/gnome.m4 -a "$GNOME_INTERFACE_VERSION" = "1" ]; then
+           rm -f $DELETEFILES
+         fi
+        fi
+      done
+      for k in $macrodirs; do
+       if test -d $k; then
+          aclocalinclude="$aclocalinclude -I $k"
+         if [ -f $k/gnome.m4 -a "$GNOME_INTERFACE_VERSION" = "1" ]; then
+           rm -f $DELETEFILES
+         fi
+        fi
+      done
+      if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then
+       if grep "sed.*POTFILES" configure.in >/dev/null; then
+         : do nothing -- we still have an old unmodified configure.in
+       else
+         echo "Creating $dr/aclocal.m4 ..."
+         test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+         echo "Running gettextize...  Ignore non-fatal messages."
+         echo "no" | gettextize --force --copy
+         echo "Making $dr/aclocal.m4 writable ..."
+         test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+        fi
+      fi
+      if grep "^AM_GNOME_GETTEXT" configure.in >/dev/null; then
+       echo "Creating $dr/aclocal.m4 ..."
+       test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+       echo "Running gettextize...  Ignore non-fatal messages."
+       echo "no" | gettextize --force --copy
+       echo "Making $dr/aclocal.m4 writable ..."
+       test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+      fi
+      if grep "^AM_PROG_XML_I18N_TOOLS" configure.in >/dev/null; then
+        echo "Running xml-i18n-toolize... Ignore non-fatal messages."
+       xml-i18n-toolize --copy --force --automake
+      fi
+      if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
+       if test -z "$NO_LIBTOOLIZE" ; then 
+         echo "Running libtoolize..."
+         libtoolize --force --copy
+       fi
+      fi
+      echo "Running aclocal $aclocalinclude ..."
+      aclocal $aclocalinclude || {
+       echo
+       echo "**Error**: aclocal failed. This may mean that you have not"
+       echo "installed all of the packages you need, or you may need to"
+       echo "set ACLOCAL_FLAGS to include \"-I \$prefix/share/aclocal\""
+       echo "for the prefix where you installed the packages whose"
+       echo "macros were not found"
+       exit 1
+      }
+
+      if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then
+       echo "Running autoheader..."
+       autoheader || { echo "**Error**: autoheader failed."; exit 1; }
+      fi
+      echo "Running automake --gnu $am_opt ..."
+      automake --add-missing --gnu $am_opt ||
+       { echo "**Error**: automake failed."; exit 1; }
+      echo "Running autoconf ..."
+      autoconf || { echo "**Error**: autoconf failed."; exit 1; }
+    ) || exit 1
+  fi
+done
+
+conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c
+
+if test x$NOCONFIGURE = x; then
+  echo Running $srcdir/configure $conf_flags "$@" ...
+  $srcdir/configure $conf_flags "$@" \
+  && echo Now type \`make\' to compile $PKG_NAME || exit 1
+else
+  echo Skipping configure process.
+fi
diff --git a/apps/silcer/macros/compiler-flags.m4 b/apps/silcer/macros/compiler-flags.m4
new file mode 100644 (file)
index 0000000..63f8e2e
--- /dev/null
@@ -0,0 +1,109 @@
+dnl GNOME_COMPILE_WARNINGS
+dnl Turn on many useful compiler warnings
+dnl For now, only works on GCC
+AC_DEFUN([GNOME_COMPILE_WARNINGS],[
+  AC_ARG_ENABLE(compile-warnings, 
+    [  --enable-compile-warnings=[no/minimum/yes]      Turn on compiler warnings.],,enable_compile_warnings=minimum)
+
+  AC_MSG_CHECKING(what warning flags to pass to the C compiler)
+  warnCFLAGS=
+  if test "x$GCC" != xyes; then
+    enable_compile_warnings=no
+  fi
+
+  if test "x$enable_compile_warnings" != "xno"; then
+    if test "x$GCC" = "xyes"; then
+      case " $CFLAGS " in
+      *[\ \    ]-Wall[\ \      ]*) ;;
+      *) warnCFLAGS="-Wall -Wunused" ;;
+      esac
+
+      ## -W is not all that useful.  And it cannot be controlled
+      ## with individual -Wno-xxx flags, unlike -Wall
+      if test "x$enable_compile_warnings" = "xyes"; then
+       warnCFLAGS="$warnCFLAGS -Wmissing-prototypes -Wmissing-declarations"
+      fi
+    fi
+  fi
+  AC_MSG_RESULT($warnCFLAGS)
+
+  AC_ARG_ENABLE(iso-c,
+    [  --enable-iso-c          Try to warn if code is not ISO C ],,
+    enable_iso_c=no)
+
+  AC_MSG_CHECKING(what language compliance flags to pass to the C compiler)
+  complCFLAGS=
+  if test "x$enable_iso_c" != "xno"; then
+    if test "x$GCC" = "xyes"; then
+      case " $CFLAGS " in
+      *[\ \    ]-ansi[\ \      ]*) ;;
+      *) complCFLAGS="$complCFLAGS -ansi" ;;
+      esac
+
+      case " $CFLAGS " in
+      *[\ \    ]-pedantic[\ \  ]*) ;;
+      *) complCFLAGS="$complCFLAGS -pedantic" ;;
+      esac
+    fi
+  fi
+  AC_MSG_RESULT($complCFLAGS)
+  if test "x$cflags_set" != "xyes"; then
+    CFLAGS="$CFLAGS $warnCFLAGS $complCFLAGS"
+    cflags_set=yes
+    AC_SUBST(cflags_set)
+  fi
+])
+
+dnl For C++, do basically the same thing.
+
+AC_DEFUN([GNOME_CXX_WARNINGS],[
+  AC_ARG_ENABLE(cxx-warnings, 
+    [  --enable-cxx-warnings=[no/minimum/yes]  Turn on compiler warnings.],,enable_cxx_warnings=minimum)
+
+  AC_MSG_CHECKING(what warning flags to pass to the C++ compiler)
+  warnCXXFLAGS=
+  if test "x$GCC" != xyes; then
+    enable_compile_warnings=no
+  fi
+  if test "x$enable_cxx_warnings" != "xno"; then
+    if test "x$GCC" = "xyes"; then
+      case " $CXXFLAGS " in
+      *[\ \    ]-Wall[\ \      ]*) ;;
+      *) warnCXXFLAGS="-Wall -Wno-unused" ;;
+      esac
+
+      ## -W is not all that useful.  And it cannot be controlled
+      ## with individual -Wno-xxx flags, unlike -Wall
+      if test "x$enable_cxx_warnings" = "xyes"; then
+       warnCXXFLAGS="$warnCXXFLAGS -Wmissing-prototypes -Wmissing-declarations -Wshadow -Woverloaded-virtual"
+      fi
+    fi
+  fi
+  AC_MSG_RESULT($warnCXXFLAGS)
+
+   AC_ARG_ENABLE(iso-cxx,
+     [  --enable-iso-cxx          Try to warn if code is not ISO C++ ],,
+     enable_iso_cxx=no)
+
+   AC_MSG_CHECKING(what language compliance flags to pass to the C++ compiler)
+   complCXXFLAGS=
+   if test "x$enable_iso_cxx" != "xno"; then
+     if test "x$GCC" = "xyes"; then
+      case " $CXXFLAGS " in
+      *[\ \    ]-ansi[\ \      ]*) ;;
+      *) complCXXFLAGS="$complCXXFLAGS -ansi" ;;
+      esac
+
+      case " $CXXFLAGS " in
+      *[\ \    ]-pedantic[\ \  ]*) ;;
+      *) complCXXFLAGS="$complCXXFLAGS -pedantic" ;;
+      esac
+     fi
+   fi
+  AC_MSG_RESULT($complCXXFLAGS)
+  if test "x$cxxflags_set" != "xyes"; then
+    CXXFLAGS="$CXXFLAGS $warnCXXFLAGS $complCXXFLAGS"
+    cxxflags_set=yes
+    AC_SUBST(cxxflags_set)
+  fi
+])
diff --git a/apps/silcer/macros/curses.m4 b/apps/silcer/macros/curses.m4
new file mode 100644 (file)
index 0000000..5307e13
--- /dev/null
@@ -0,0 +1,318 @@
+dnl Curses detection: Munged from Midnight Commander's configure.in
+dnl
+dnl What it does:
+dnl =============
+dnl
+dnl - Determine which version of curses is installed on your system
+dnl   and set the -I/-L/-l compiler entries and add a few preprocessor
+dnl   symbols 
+dnl - Do an AC_SUBST on the CURSES_INCLUDEDIR and CURSES_LIBS so that
+dnl   @CURSES_INCLUDEDIR@ and @CURSES_LIBS@ will be available in
+dnl   Makefile.in's
+dnl - Modify the following configure variables (these are the only
+dnl   curses.m4 variables you can access from within configure.in)
+dnl   CURSES_INCLUDEDIR - contains -I's and possibly -DRENAMED_CURSES if
+dnl                       an ncurses.h that's been renamed to curses.h
+dnl                       is found.
+dnl   CURSES_LIBS       - sets -L and -l's appropriately
+dnl   CFLAGS            - if --with-sco, add -D_SVID3 
+dnl   has_curses        - exports result of tests to rest of configure
+dnl
+dnl Usage:
+dnl ======
+dnl 1) Add lines indicated below to acconfig.h
+dnl 2) call AC_CHECK_CURSES after AC_PROG_CC in your configure.in
+dnl 3) Instead of #include <curses.h> you should use the following to
+dnl    properly locate ncurses or curses header file
+dnl
+dnl    #if defined(USE_NCURSES) && !defined(RENAMED_NCURSES)
+dnl    #include <ncurses.h>
+dnl    #else
+dnl    #include <curses.h>
+dnl    #endif
+dnl
+dnl 4) Make sure to add @CURSES_INCLUDEDIR@ to your preprocessor flags
+dnl 5) Make sure to add @CURSES_LIBS@ to your linker flags or LIBS
+dnl
+dnl Notes with automake:
+dnl - call AM_CONDITIONAL(HAS_CURSES, test "$has_curses" = true) from
+dnl   configure.in
+dnl - your Makefile.am can look something like this
+dnl   -----------------------------------------------
+dnl   INCLUDES= blah blah blah $(CURSES_INCLUDEDIR) 
+dnl   if HAS_CURSES
+dnl   CURSES_TARGETS=name_of_curses_prog
+dnl   endif
+dnl   bin_PROGRAMS = other_programs $(CURSES_TARGETS)
+dnl   other_programs_SOURCES = blah blah blah
+dnl   name_of_curses_prog_SOURCES = blah blah blah
+dnl   other_programs_LDADD = blah
+dnl   name_of_curses_prog_LDADD = blah $(CURSES_LIBS)
+dnl   -----------------------------------------------
+dnl
+dnl
+dnl The following lines should be added to acconfig.h:
+dnl ==================================================
+dnl
+dnl /*=== Curses version detection defines ===*/
+dnl /* Found some version of curses that we're going to use */
+dnl #undef HAS_CURSES
+dnl    
+dnl /* Use SunOS SysV curses? */
+dnl #undef USE_SUNOS_CURSES
+dnl 
+dnl /* Use old BSD curses - not used right now */
+dnl #undef USE_BSD_CURSES
+dnl 
+dnl /* Use SystemV curses? */
+dnl #undef USE_SYSV_CURSES
+dnl 
+dnl /* Use Ncurses? */
+dnl #undef USE_NCURSES
+dnl 
+dnl /* If you Curses does not have color define this one */
+dnl #undef NO_COLOR_CURSES
+dnl 
+dnl /* Define if you want to turn on SCO-specific code */
+dnl #undef SCO_FLAVOR
+dnl 
+dnl /* Set to reflect version of ncurses *
+dnl  *   0 = version 1.*
+dnl  *   1 = version 1.9.9g
+dnl  *   2 = version 4.0/4.1 */
+dnl #undef NCURSES_970530
+dnl
+dnl /*=== End new stuff for acconfig.h ===*/
+dnl 
+
+
+AC_DEFUN([AC_CHECK_CURSES],[
+       search_ncurses=true
+       screen_manager=""
+       has_curses=false
+
+       CFLAGS=${CFLAGS--O}
+
+       AC_SUBST(CURSES_LIBS)
+       AC_SUBST(CURSES_INCLUDEDIR)
+
+       AC_ARG_WITH(sco,
+         [  --with-sco              Use this to turn on SCO-specific code],[
+         if test x$withval = xyes; then
+               AC_DEFINE(SCO_FLAVOR)
+               CFLAGS="$CFLAGS -D_SVID3"
+         fi
+       ])
+
+       AC_ARG_WITH(sunos-curses,
+         [  --with-sunos-curses     Used to force SunOS 4.x curses],[
+         if test x$withval = xyes; then
+               AC_USE_SUNOS_CURSES
+         fi
+       ])
+
+       AC_ARG_WITH(osf1-curses,
+         [  --with-osf1-curses      Used to force OSF/1 curses],[
+         if test x$withval = xyes; then
+               AC_USE_OSF1_CURSES
+         fi
+       ])
+
+       AC_ARG_WITH(vcurses,
+         [  --with-vcurses[=incdir] Used to force SysV curses],
+         if test x$withval != xyes; then
+               CURSES_INCLUDEDIR="-I$withval"
+         fi
+         AC_USE_SYSV_CURSES
+       )
+
+       AC_ARG_WITH(ncurses,
+         [  --with-ncurses[=dir]  Compile with ncurses/locate base dir],
+         if test x$withval = xno ; then
+               search_ncurses=false
+         elif test x$withval != xyes ; then
+               CURSES_LIBS="$LIBS -L$withval/lib -lncurses"
+               CURSES_INCLUDEDIR="-I$withval/include"
+               search_ncurses=false
+               screen_manager="ncurses"
+               AC_DEFINE(USE_NCURSES)
+               AC_DEFINE(HAS_CURSES)
+               has_curses=true
+         fi
+       )
+
+       if $search_ncurses
+       then
+               AC_SEARCH_NCURSES()
+       fi
+
+
+])
+
+
+AC_DEFUN([AC_USE_SUNOS_CURSES], [
+       search_ncurses=false
+       screen_manager="SunOS 4.x /usr/5include curses"
+       AC_MSG_RESULT(Using SunOS 4.x /usr/5include curses)
+       AC_DEFINE(USE_SUNOS_CURSES)
+       AC_DEFINE(HAS_CURSES)
+       has_curses=true
+       AC_DEFINE(NO_COLOR_CURSES)
+       AC_DEFINE(USE_SYSV_CURSES)
+       CURSES_INCLUDEDIR="-I/usr/5include"
+       CURSES_LIBS="/usr/5lib/libcurses.a /usr/5lib/libtermcap.a"
+       AC_MSG_RESULT(Please note that some screen refreshs may fail)
+])
+
+AC_DEFUN([AC_USE_OSF1_CURSES], [
+       AC_MSG_RESULT(Using OSF1 curses)
+       search_ncurses=false
+       screen_manager="OSF1 curses"
+       AC_DEFINE(HAS_CURSES)
+       has_curses=true
+       AC_DEFINE(NO_COLOR_CURSES)
+       AC_DEFINE(USE_SYSV_CURSES)
+       CURSES_LIBS="-lcurses"
+])
+
+AC_DEFUN([AC_USE_SYSV_CURSES], [
+       AC_MSG_RESULT(Using SysV curses)
+       AC_DEFINE(HAS_CURSES)
+       has_curses=true
+       AC_DEFINE(USE_SYSV_CURSES)
+       search_ncurses=false
+       screen_manager="SysV/curses"
+       CURSES_LIBS="-lcurses"
+])
+
+dnl AC_ARG_WITH(bsd-curses,
+dnl [--with-bsd-curses         Used to compile with bsd curses, not very fancy],
+dnl    search_ncurses=false
+dnl    screen_manager="Ultrix/cursesX"
+dnl    if test $system = ULTRIX
+dnl    then
+dnl        THIS_CURSES=cursesX
+dnl        else
+dnl        THIS_CURSES=curses
+dnl    fi
+dnl
+dnl    CURSES_LIBS="-l$THIS_CURSES -ltermcap"
+dnl    AC_DEFINE(HAS_CURSES)
+dnl    has_curses=true
+dnl    AC_DEFINE(USE_BSD_CURSES)
+dnl    AC_MSG_RESULT(Please note that some screen refreshs may fail)
+dnl    AC_MSG_WARN(Use of the bsdcurses extension has some)
+dnl    AC_MSG_WARN(display/input problems.)
+dnl    AC_MSG_WARN(Reconsider using xcurses)
+dnl)
+
+       
+dnl
+dnl Parameters: directory filename cureses_LIBS curses_INCLUDEDIR nicename
+dnl
+AC_DEFUN([AC_NCURSES], [
+    if $search_ncurses
+    then
+        if test -f $1/$2
+       then
+           AC_MSG_RESULT(Found ncurses on $1/$2)
+           CURSES_LIBS="$3"
+           CURSES_INCLUDEDIR="$4"
+           search_ncurses=false
+           screen_manager=$5
+            AC_DEFINE(HAS_CURSES)
+            has_curses=true
+           AC_DEFINE(USE_NCURSES)
+       fi
+    fi
+])
+
+AC_DEFUN([AC_SEARCH_NCURSES], [
+    AC_CHECKING("location of ncurses.h file")
+
+    AC_NCURSES(/usr/include, ncurses.h, -lncurses,, "ncurses on /usr/include")
+    AC_NCURSES(/usr/include/ncurses, ncurses.h, -lncurses, -I/usr/include/ncurses, "ncurses on /usr/include/ncurses")
+    AC_NCURSES(/usr/local/include, ncurses.h, -L/usr/local/lib -lncurses, -I/usr/local/include, "ncurses on /usr/local")
+    AC_NCURSES(/usr/local/include/ncurses, ncurses.h, -L/usr/local/lib -L/usr/local/lib/ncurses -lncurses, -I/usr/local/include/ncurses, "ncurses on /usr/local/include/ncurses")
+
+    AC_NCURSES(/usr/local/include/ncurses, curses.h, -L/usr/local/lib -lncurses, -I/usr/local/include/ncurses -DRENAMED_NCURSES, "renamed ncurses on /usr/local/.../ncurses")
+
+    AC_NCURSES(/usr/include/ncurses, curses.h, -lncurses, -I/usr/include/ncurses -DRENAMED_NCURSES, "renamed ncurses on /usr/include/ncurses")
+
+    dnl
+    dnl We couldn't find ncurses, try SysV curses
+    dnl
+    if $search_ncurses 
+    then
+        AC_EGREP_HEADER(init_color, /usr/include/curses.h,
+           AC_USE_SYSV_CURSES)
+       AC_EGREP_CPP(USE_NCURSES,[
+#include <curses.h>
+#ifdef __NCURSES_H
+#undef USE_NCURSES
+USE_NCURSES
+#endif
+],[
+       CURSES_INCLUDEDIR="$CURSES_INCLUDEDIR -DRENAMED_NCURSES"
+        AC_DEFINE(HAS_CURSES)
+       has_curses=true
+        AC_DEFINE(USE_NCURSES)
+        search_ncurses=false
+        screen_manager="ncurses installed as curses"
+])
+    fi
+
+    dnl
+    dnl Try SunOS 4.x /usr/5{lib,include} ncurses
+    dnl The flags USE_SUNOS_CURSES, USE_BSD_CURSES and BUGGY_CURSES
+    dnl should be replaced by a more fine grained selection routine
+    dnl
+    if $search_ncurses
+    then
+       if test -f /usr/5include/curses.h
+       then
+           AC_USE_SUNOS_CURSES
+        fi
+    else
+        # check for ncurses version, to properly ifdef mouse-fix
+       AC_MSG_CHECKING(for ncurses version)
+       ncurses_version=unknown
+cat > conftest.$ac_ext <<EOF
+[#]line __oline__ "configure"
+#include "confdefs.h"
+#ifdef RENAMED_NCURSES
+#include <curses.h>
+#else
+#include <ncurses.h>
+#endif
+#undef VERSION
+VERSION:NCURSES_VERSION
+EOF
+        if (eval "$ac_cpp conftest.$ac_ext") 2>&AC_FD_CC |
+  egrep "VERSION:" >conftest.out 2>&1; then
+changequote(,)dnl
+            ncurses_version=`cat conftest.out|sed -e 's/^[^"]*"//' -e 's/".*//'`
+changequote([,])dnl
+       fi
+       rm -rf conftest*
+        AC_MSG_RESULT($ncurses_version)
+       case "$ncurses_version" in
+changequote(,)dnl
+       4.[01])
+changequote([,])dnl
+            AC_DEFINE(NCURSES_970530,2)
+            ;;
+       1.9.9g)
+            AC_DEFINE(NCURSES_970530,1)
+            ;;
+       1*)
+            AC_DEFINE(NCURSES_970530,0)
+            ;;
+       esac
+    fi
+])
+
+
+
+
+
diff --git a/apps/silcer/macros/gnome-bonobo-check.m4 b/apps/silcer/macros/gnome-bonobo-check.m4
new file mode 100644 (file)
index 0000000..daa109c
--- /dev/null
@@ -0,0 +1,166 @@
+# Configure paths for Bonobo
+# Miguel de Icaza, 99-04-12
+# Stolen from Chris Lahey      99-2-5
+# stolen from Manish Singh again
+# stolen back from Frank Belew
+# stolen from Manish Singh
+# Shamelessly stolen from Owen Taylor
+
+dnl AM_PATH_BONOBO ([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for Bonobo, and define BONOBO_CFLAGS and BONOBO_LIBS
+dnl
+AC_DEFUN([AM_PATH_BONOBO],
+[
+dnl 
+dnl Get the cflags and libraries from the gnome-config script
+dnl
+AC_ARG_WITH(bonobo-prefix,[  --with-bonobo-prefix=PFX   Prefix where Bonobo is installed (optional)],
+            bonobo_prefix="$withval", bonobo_prefix="")
+AC_ARG_WITH(bonobo-exec-prefix,[  --with-bonobo-exec-prefix=PFX Exec prefix where Bonobo is installed (optional)],
+            bonobo_exec_prefix="$withval", bonobo_exec_prefix="")
+AC_ARG_ENABLE(bonobotest, [  --disable-bonobotest       Do not try to compile and run a test Bonobo program],
+                   , enable_bonobotest=yes)
+
+  if test x$bonobo_exec_prefix != x ; then
+     bonobo_args="$bonobo_args --exec-prefix=$bonobo_exec_prefix"
+     if test x${GNOME_CONFIG+set} != xset ; then
+        GNOME_CONFIG=$bonobo_exec_prefix/bin/gnome-config
+     fi
+  fi
+  if test x$bonobo_prefix != x ; then
+     bonobo_args="$bonobo_args --prefix=$bonobo_prefix"
+     if test x${GNOME_CONFIG+set} != xset ; then
+        GNOME_CONFIG=$bonobo_prefix/bin/gnome-config
+     fi
+  fi
+
+  AC_PATH_PROG(GNOME_CONFIG, gnome-config, no)
+  min_bonobo_version=ifelse([$1], ,0.1.0,$1)
+  AC_MSG_CHECKING(for BONOBO - version >= $min_bonobo_version)
+  no_bonobo=""
+  if test "$GNOME_CONFIG" = "no" ; then
+    no_bonobo=yes
+  else
+    BONOBO_CFLAGS=`$GNOME_CONFIG $bonoboconf_args --cflags bonobo bonobox`
+    BONOBO_LIBS=`$GNOME_CONFIG $bonoboconf_args --libs bonobo bonobox`
+
+    bonobo_major_version=`$GNOME_CONFIG $bonobo_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+    bonobo_minor_version=`$GNOME_CONFIG $bonobo_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+    bonobo_micro_version=`$GNOME_CONFIG $bonobo_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+    if test "x$enable_bonobotest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $BONOBO_CFLAGS"
+      LIBS="$LIBS $BONOBO_LIBS"
+dnl
+dnl Now check if the installed BONOBO is sufficiently new. (Also sanity
+dnl checks the results of gnome-config to some extent
+dnl
+      rm -f conf.bonobotest
+      AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <bonobo.h>
+
+static char*
+my_strdup (char *str)
+{
+  char *new_str;
+  
+  if (str)
+    {
+      new_str = malloc ((strlen (str) + 1) * sizeof(char));
+      strcpy (new_str, str);
+    }
+  else
+    new_str = NULL;
+  
+  return new_str;
+}
+
+int main ()
+{
+  int major, minor, micro;
+  char *tmp_version;
+
+  system ("touch conf.bonobotest");
+  bonobo_object_get_type ();
+  return 0;
+}
+
+],, no_bonobo=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_bonobo" = x ; then
+     AC_MSG_RESULT(yes)
+     ifelse([$2], , :, [$2])     
+  else
+     AC_MSG_RESULT(no)
+     if test "$GNOME_CONFIG" = "no" ; then
+       echo "*** The gnome-config script installed by GNOME-LIBS could not be found"
+       echo "*** If BONOBO was installed in PREFIX, make sure PREFIX/bin is in"
+       echo "*** your path, or set the GNOME_CONFIG environment variable to the"
+       echo "*** full path to gnome-config."
+     else
+       if test -f conf.bonobotest ; then
+        :
+       else
+          echo "*** Could not run BONOBO test program, checking why..."
+          CFLAGS="$CFLAGS $BONOBO_CFLAGS"
+          LIBS="$LIBS $BONOBO_LIBS"
+          AC_TRY_LINK([
+#include <stdio.h>
+#include <bonobo/gnome-object.h>
+],      [ return 0; ],
+        [ echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding BONOBO or finding the wrong"
+          echo "*** version of BONOBO. If it is not finding BONOBO, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+         echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
+        [ echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means BONOBO was incorrectly installed"
+          echo "*** or that you have moved BONOBO since it was installed. In the latter case, you"
+          echo "*** may want to edit the gnome-config script: $GNOME_CONFIG" ])
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     BONOBO_CFLAGS=""
+     BONOBO_LIBS=""
+     ifelse([$3], , :, [$3])
+  fi
+  AC_SUBST(BONOBO_CFLAGS)
+  AC_SUBST(BONOBO_LIBS)
+  rm -f conf.bonobotest
+])
+
+AC_DEFUN([BONOBO_CHECK], [
+       AM_PATH_BONOBO(0.1.0,,[AC_MSG_ERROR(BONOBO not found)])
+])
+
+AC_DEFUN([AM_BONOBO_USES_OAF],
+[
+       AC_REQUIRE([AM_PATH_BONOBO])
+
+       AC_MSG_CHECKING(if Bonobo uses OAF)
+       if ( gnome-config --libs bonobo | grep oaf ) > /dev/null 2>&1 ; then
+         using_oaf="yes"
+         AC_DEFINE(BONOBO_USES_OAF)
+       else
+         using_oaf="no"
+       fi
+
+       AC_MSG_RESULT("$using_oaf")
+
+       AM_CONDITIONAL(BONOBO_USES_OAF, test x"using_oaf" = "xyes")
+])
diff --git a/apps/silcer/macros/gnome-common.m4 b/apps/silcer/macros/gnome-common.m4
new file mode 100644 (file)
index 0000000..83bb00d
--- /dev/null
@@ -0,0 +1,14 @@
+# gnome-common.m4
+# 
+# This only for packages that are not in the GNOME CVS tree.
+
+dnl GNOME_COMMON_INIT
+
+AC_DEFUN([GNOME_COMMON_INIT],
+[
+       GNOME_ACLOCAL_DIR="$GNOME_COMMON_MACROS_DIR"
+       AC_SUBST(GNOME_ACLOCAL_DIR)
+
+       ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
+])
+
diff --git a/apps/silcer/macros/gnome-fileutils.m4 b/apps/silcer/macros/gnome-fileutils.m4
new file mode 100644 (file)
index 0000000..7c11a78
--- /dev/null
@@ -0,0 +1,414 @@
+dnl
+dnl GNOME_FILEUTILS_CHECKS
+dnl
+dnl checks that are needed for the diskusage applet.
+dnl
+
+AC_DEFUN([GNOME_FILEUTILS_CHECKS],
+[      
+AC_CHECK_HEADERS(fcntl.h sys/param.h sys/statfs.h sys/fstyp.h \
+mnttab.h mntent.h sys/statvfs.h sys/vfs.h sys/mount.h \
+sys/filsys.h sys/fs_types.h sys/fs/s5param.h)
+
+AC_CHECK_FUNCS(bcopy endgrent endpwent fchdir ftime ftruncate \
+getcwd getmntinfo gettimeofday isascii lchown \
+listmntent memcpy mkfifo strchr strerror strrchr vprintf)
+
+dnl Set some defaults when cross-compiling
+
+if test x$cross_compiling = xyes ; then
+       case "$host_os" in
+       linux*)
+         fu_cv_sys_mounted_getmntent1=yes
+         fu_cv_sys_stat_statfs2_bsize=yes
+         ;;
+       sunos*)
+         fu_cv_sys_stat_statfs4=yes
+         ;;
+       freebsd*)
+         fu_cv_sys_stat_statfs2_bsize=yes
+         ;;
+       osf*)
+         fu_cv_sys_stat_statfs3_osf1=yes
+         ;;
+       esac
+fi
+
+# Determine how to get the list of mounted filesystems.
+list_mounted_fs=
+
+# If the getmntent function is available but not in the standard library,
+# make sure LIBS contains -lsun (on Irix4) or -lseq (on PTX).
+AC_FUNC_GETMNTENT
+
+# This test must precede the ones for getmntent because Unicos-9 is
+# reported to have the getmntent function, but its support is incompatible
+# with other getmntent implementations.
+
+# NOTE: Normally, I wouldn't use a check for system type as I've done for
+# `CRAY' below since that goes against the whole autoconf philosophy.  But
+# I think there is too great a chance that some non-Cray system has a
+# function named listmntent to risk the false positive.
+
+if test -z "$list_mounted_fs"; then
+# Cray UNICOS 9
+AC_MSG_CHECKING([for listmntent of Cray/Unicos-9])
+AC_CACHE_VAL(fu_cv_sys_mounted_cray_listmntent,
+[fu_cv_sys_mounted_cray_listmntent=no
+AC_EGREP_CPP(yes,
+[#ifdef _CRAY
+yes
+#endif
+], [test $ac_cv_func_listmntent = yes \
+&& fu_cv_sys_mounted_cray_listmntent=yes]
+)
+]
+)
+AC_MSG_RESULT($fu_cv_sys_mounted_cray_listmntent)
+if test $fu_cv_sys_mounted_cray_listmntent = yes; then
+list_mounted_fs=found
+AC_DEFINE(MOUNTED_LISTMNTENT)
+fi
+fi
+
+if test $ac_cv_func_getmntent = yes; then
+
+# This system has the getmntent function.
+# Determine whether it's the one-argument variant or the two-argument one.
+
+if test -z "$list_mounted_fs"; then
+# 4.3BSD, SunOS, HP-UX, Dynix, Irix
+AC_MSG_CHECKING([for one-argument getmntent function])
+AC_CACHE_VAL(fu_cv_sys_mounted_getmntent1,
+[test $ac_cv_header_mntent_h = yes \
+&& fu_cv_sys_mounted_getmntent1=yes \
+|| fu_cv_sys_mounted_getmntent1=no])
+AC_MSG_RESULT($fu_cv_sys_mounted_getmntent1)
+if test $fu_cv_sys_mounted_getmntent1 = yes; then
+list_mounted_fs=found
+AC_DEFINE(MOUNTED_GETMNTENT1)
+fi
+fi
+
+if test -z "$list_mounted_fs"; then
+# SVR4
+AC_MSG_CHECKING([for two-argument getmntent function])
+AC_CACHE_VAL(fu_cv_sys_mounted_getmntent2,
+[AC_EGREP_HEADER(getmntent, sys/mnttab.h,
+fu_cv_sys_mounted_getmntent2=yes,
+fu_cv_sys_mounted_getmntent2=no)])
+AC_MSG_RESULT($fu_cv_sys_mounted_getmntent2)
+if test $fu_cv_sys_mounted_getmntent2 = yes; then
+list_mounted_fs=found
+AC_DEFINE(MOUNTED_GETMNTENT2)
+fi
+fi
+
+if test -z "$list_mounted_fs"; then
+AC_MSG_ERROR([could not determine how to read list of mounted filesystems])
+fi
+
+fi
+
+if test -z "$list_mounted_fs"; then
+# DEC Alpha running OSF/1.
+AC_MSG_CHECKING([for getfsstat function])
+AC_CACHE_VAL(fu_cv_sys_mounted_getsstat,
+[AC_TRY_LINK([
+#include <sys/types.h>
+#include <sys/mount.h>
+#include <sys/fs_types.h>],
+[struct statfs *stats;
+int numsys = getfsstat ((struct statfs *)0, 0L, MNT_WAIT); ],
+fu_cv_sys_mounted_getsstat=yes,
+fu_cv_sys_mounted_getsstat=no)])
+AC_MSG_RESULT($fu_cv_sys_mounted_getsstat)
+if test $fu_cv_sys_mounted_getsstat = yes; then
+list_mounted_fs=found
+AC_DEFINE(MOUNTED_GETFSSTAT)
+fi
+fi
+
+if test -z "$list_mounted_fs"; then
+# AIX.
+AC_MSG_CHECKING([for mntctl function and struct vmount])
+AC_CACHE_VAL(fu_cv_sys_mounted_vmount,
+[AC_TRY_CPP([#include <fshelp.h>],
+fu_cv_sys_mounted_vmount=yes,
+fu_cv_sys_mounted_vmount=no)])
+AC_MSG_RESULT($fu_cv_sys_mounted_vmount)
+if test $fu_cv_sys_mounted_vmount = yes; then
+list_mounted_fs=found
+AC_DEFINE(MOUNTED_VMOUNT)
+fi
+fi
+
+if test -z "$list_mounted_fs"; then
+# SVR3
+AC_MSG_CHECKING([for FIXME existence of three headers])
+AC_CACHE_VAL(fu_cv_sys_mounted_fread_fstyp,
+[AC_TRY_CPP([
+#include <sys/statfs.h>
+#include <sys/fstyp.h>
+#include <mnttab.h>],
+fu_cv_sys_mounted_fread_fstyp=yes,
+fu_cv_sys_mounted_fread_fstyp=no)])
+AC_MSG_RESULT($fu_cv_sys_mounted_fread_fstyp)
+if test $fu_cv_sys_mounted_fread_fstyp = yes; then
+list_mounted_fs=found
+AC_DEFINE(MOUNTED_FREAD_FSTYP)
+fi
+fi
+
+if test -z "$list_mounted_fs"; then
+# 4.4BSD and DEC OSF/1.
+AC_MSG_CHECKING([for getmntinfo function])
+AC_CACHE_VAL(fu_cv_sys_mounted_getmntinfo,
+[
+ok=
+if test $ac_cv_func_getmntinfo = yes; then
+AC_EGREP_HEADER(f_type;, sys/mount.h,
+ok=yes)
+fi
+test -n "$ok" \
+&& fu_cv_sys_mounted_getmntinfo=yes \
+|| fu_cv_sys_mounted_getmntinfo=no
+])
+AC_MSG_RESULT($fu_cv_sys_mounted_getmntinfo)
+if test $fu_cv_sys_mounted_getmntinfo = yes; then
+list_mounted_fs=found
+AC_DEFINE(MOUNTED_GETMNTINFO)
+fi
+fi
+
+# FIXME: add a test for netbsd-1.1 here
+
+if test -z "$list_mounted_fs"; then
+# Ultrix
+AC_MSG_CHECKING([for getmnt function])
+AC_CACHE_VAL(fu_cv_sys_mounted_getmnt,
+[AC_TRY_CPP([
+#include <sys/fs_types.h>
+#include <sys/mount.h>],
+fu_cv_sys_mounted_getmnt=yes,
+fu_cv_sys_mounted_getmnt=no)])
+AC_MSG_RESULT($fu_cv_sys_mounted_getmnt)
+if test $fu_cv_sys_mounted_getmnt = yes; then
+list_mounted_fs=found
+AC_DEFINE(MOUNTED_GETMNT)
+fi
+fi
+
+if test -z "$list_mounted_fs"; then
+# SVR2
+AC_MSG_CHECKING([whether it is possible to resort to fread on /etc/mnttab])
+AC_CACHE_VAL(fu_cv_sys_mounted_fread,
+[AC_TRY_CPP([#include <mnttab.h>],
+fu_cv_sys_mounted_fread=yes,
+fu_cv_sys_mounted_fread=no)])
+AC_MSG_RESULT($fu_cv_sys_mounted_fread)
+if test $fu_cv_sys_mounted_fread = yes; then
+list_mounted_fs=found
+AC_DEFINE(MOUNTED_FREAD)
+fi
+fi
+
+if test -z "$list_mounted_fs"; then
+AC_MSG_ERROR([could not determine how to read list of mounted filesystems])
+# FIXME -- no need to abort building the whole package
+# Can't build mountlist.c or anything that needs its functions
+fi
+
+AC_CHECKING(how to get filesystem space usage)
+space=no
+
+# Perform only the link test since it seems there are no variants of the
+# statvfs function.  This check is more than just AC_CHECK_FUNCS(statvfs)
+# because that got a false positive on SCO OSR5.  Adding the declaration
+# of a `struct statvfs' causes this test to fail (as it should) on such
+# systems.  That system is reported to work fine with STAT_STATFS4 which
+# is what it gets when this test fails.
+if test $space = no; then
+# SVR4
+AC_CACHE_CHECK([statvfs function (SVR4)], fu_cv_sys_stat_statvfs,
+[AC_TRY_LINK([#include <sys/types.h>
+#include <sys/statvfs.h>],
+[struct statvfs fsd; statvfs (0, &fsd);],
+fu_cv_sys_stat_statvfs=yes,
+fu_cv_sys_stat_statvfs=no)])
+if test $fu_cv_sys_stat_statvfs = yes; then
+space=yes
+AC_DEFINE(STAT_STATVFS)
+fi
+fi
+
+if test $space = no; then
+# DEC Alpha running OSF/1
+AC_MSG_CHECKING([for 3-argument statfs function (DEC OSF/1)])
+AC_CACHE_VAL(fu_cv_sys_stat_statfs3_osf1,
+[AC_TRY_RUN([
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/mount.h>
+main ()
+{
+struct statfs fsd;
+fsd.f_fsize = 0;
+exit (statfs (".", &fsd, sizeof (struct statfs)));
+}],
+fu_cv_sys_stat_statfs3_osf1=yes,
+fu_cv_sys_stat_statfs3_osf1=no,
+fu_cv_sys_stat_statfs3_osf1=no)])
+AC_MSG_RESULT($fu_cv_sys_stat_statfs3_osf1)
+if test $fu_cv_sys_stat_statfs3_osf1 = yes; then
+space=yes
+AC_DEFINE(STAT_STATFS3_OSF1)
+fi
+fi
+
+if test $space = no; then
+# AIX
+AC_MSG_CHECKING([for two-argument statfs with statfs.bsize dnl
+member (AIX, 4.3BSD)])
+AC_CACHE_VAL(fu_cv_sys_stat_statfs2_bsize,
+[AC_TRY_RUN([
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#ifdef HAVE_SYS_MOUNT_H
+#include <sys/mount.h>
+#endif
+#ifdef HAVE_SYS_VFS_H
+#include <sys/vfs.h>
+#endif
+main ()
+{
+struct statfs fsd;
+fsd.f_bsize = 0;
+exit (statfs (".", &fsd));
+}],
+fu_cv_sys_stat_statfs2_bsize=yes,
+fu_cv_sys_stat_statfs2_bsize=no,
+fu_cv_sys_stat_statfs2_bsize=no)])
+AC_MSG_RESULT($fu_cv_sys_stat_statfs2_bsize)
+if test $fu_cv_sys_stat_statfs2_bsize = yes; then
+space=yes
+AC_DEFINE(STAT_STATFS2_BSIZE)
+fi
+fi
+
+if test $space = no; then
+# SVR3
+AC_MSG_CHECKING([for four-argument statfs (AIX-3.2.5, SVR3)])
+AC_CACHE_VAL(fu_cv_sys_stat_statfs4,
+[AC_TRY_RUN([#include <sys/types.h>
+#include <sys/statfs.h>
+main ()
+{
+struct statfs fsd;
+exit (statfs (".", &fsd, sizeof fsd, 0));
+}],
+fu_cv_sys_stat_statfs4=yes,
+fu_cv_sys_stat_statfs4=no,
+fu_cv_sys_stat_statfs4=no)])
+AC_MSG_RESULT($fu_cv_sys_stat_statfs4)
+if test $fu_cv_sys_stat_statfs4 = yes; then
+space=yes
+AC_DEFINE(STAT_STATFS4)
+fi
+fi
+
+if test $space = no; then
+# 4.4BSD and NetBSD
+AC_MSG_CHECKING([for two-argument statfs with statfs.fsize dnl
+member (4.4BSD and NetBSD)])
+AC_CACHE_VAL(fu_cv_sys_stat_statfs2_fsize,
+[AC_TRY_RUN([#include <sys/types.h>
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#ifdef HAVE_SYS_MOUNT_H
+#include <sys/mount.h>
+#endif
+main ()
+{
+struct statfs fsd;
+fsd.f_fsize = 0;
+exit (statfs (".", &fsd));
+}],
+fu_cv_sys_stat_statfs2_fsize=yes,
+fu_cv_sys_stat_statfs2_fsize=no,
+fu_cv_sys_stat_statfs2_fsize=no)])
+AC_MSG_RESULT($fu_cv_sys_stat_statfs2_fsize)
+if test $fu_cv_sys_stat_statfs2_fsize = yes; then
+space=yes
+AC_DEFINE(STAT_STATFS2_FSIZE)
+fi
+fi
+
+if test $space = no; then
+# Ultrix
+AC_MSG_CHECKING([for two-argument statfs with struct fs_data (Ultrix)])
+AC_CACHE_VAL(fu_cv_sys_stat_fs_data,
+[AC_TRY_RUN([#include <sys/types.h>
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#ifdef HAVE_SYS_MOUNT_H
+#include <sys/mount.h>
+#endif
+#ifdef HAVE_SYS_FS_TYPES_H
+#include <sys/fs_types.h>
+#endif
+main ()
+{
+struct fs_data fsd;
+/* Ultrix's statfs returns 1 for success,
+0 for not mounted, -1 for failure.  */
+exit (statfs (".", &fsd) != 1);
+}],
+fu_cv_sys_stat_fs_data=yes,
+fu_cv_sys_stat_fs_data=no,
+fu_cv_sys_stat_fs_data=no)])
+AC_MSG_RESULT($fu_cv_sys_stat_fs_data)
+if test $fu_cv_sys_stat_fs_data = yes; then
+space=yes
+AC_DEFINE(STAT_STATFS2_FS_DATA)
+fi
+fi
+
+if test $space = no; then
+# SVR2
+AC_TRY_CPP([#include <sys/filsys.h>],
+AC_DEFINE(STAT_READ_FILSYS) space=yes)
+fi
+
+if test -n "$list_mounted_fs" && test $space != no; then
+DF_PROG="df"
+# LIBOBJS="$LIBOBJS fsusage.o"
+# LIBOBJS="$LIBOBJS mountlist.o"
+fi
+
+# Check for SunOS statfs brokenness wrt partitions 2GB and larger.
+# If <sys/vfs.h> exists and struct statfs has a member named f_spare,
+# enable the work-around code in fsusage.c.
+AC_MSG_CHECKING([for statfs that truncates block counts])
+AC_CACHE_VAL(fu_cv_sys_truncating_statfs,
+[AC_TRY_COMPILE([
+#if !defined(sun) && !defined(__sun)
+choke -- this is a workaround for a Sun-specific problem
+#endif
+#include <sys/types.h>
+#include <sys/vfs.h>],
+[struct statfs t; long c = *(t.f_spare);],
+fu_cv_sys_truncating_statfs=yes,
+fu_cv_sys_truncating_statfs=no,
+)])
+if test $fu_cv_sys_truncating_statfs = yes; then
+AC_DEFINE(STATFS_TRUNCATES_BLOCK_COUNTS)
+fi
+AC_MSG_RESULT($fu_cv_sys_truncating_statfs)
+
+AC_CHECKING(for AFS)
+test -d /afs && AC_DEFINE(AFS)
+])
diff --git a/apps/silcer/macros/gnome-ghttp-check.m4 b/apps/silcer/macros/gnome-ghttp-check.m4
new file mode 100644 (file)
index 0000000..0ecacaa
--- /dev/null
@@ -0,0 +1,14 @@
+AC_DEFUN([GNOME_GHTTP_CHECK],[
+       AC_REQUIRE([GNOME_INIT_HOOK])
+       GHTTP_LIB=
+       AC_CHECK_FUNC(connect,,[
+         AC_CHECK_LIB(socket,connect,
+               GHTTP_LIB="-lsocket $GHTTP_LIB",,$GHTTP_LIB)])
+       AC_CHECK_FUNC(gethostbyname,,[
+         AC_CHECK_LIB(nsl,gethostbyname,
+               GHTTP_LIB="-lnsl $GHTTP_LIB",,$GHTTP_LIB)])
+       AC_CHECK_LIB(ghttp, ghttp_request_new, 
+               GHTTP_LIB="-lghttp $GHTTP_LIB",GHTTP_LIB="",-L$gnome_prefix $GHTTP_LIB)
+       AC_SUBST(GHTTP_LIB)
+       AC_PROVIDE([GNOME_GHTTP_CHECK])
+])
diff --git a/apps/silcer/macros/gnome-gnorba-check.m4 b/apps/silcer/macros/gnome-gnorba-check.m4
new file mode 100644 (file)
index 0000000..dbac0a6
--- /dev/null
@@ -0,0 +1,35 @@
+dnl
+dnl GNOME_GNORBA_HOOK (script-if-gnorba-found, failflag)
+dnl
+dnl if failflag is "failure" it aborts if gnorba is not found.
+dnl
+
+AC_DEFUN([GNOME_GNORBA_HOOK],[
+       GNOME_ORBIT_HOOK([],$2)
+       AC_CACHE_CHECK([for gnorba libraries],gnome_cv_gnorba_found,[
+               gnome_cv_gnorba_found=no
+               if test x$gnome_cv_orbit_found = xyes; then
+                       GNORBA_CFLAGS="`gnome-config --cflags gnorba gnomeui`"
+                       GNORBA_LIBS="`gnome-config --libs gnorba gnomeui`"
+                       if test -n "$GNORBA_LIBS"; then
+                               gnome_cv_gnorba_found=yes
+                       fi
+               fi
+       ])
+       AM_CONDITIONAL(HAVE_GNORBA, test x$gnome_cv_gnorba_found = xyes)
+       if test x$gnome_cv_orbit_found = xyes; then
+               $1
+               GNORBA_CFLAGS="`gnome-config --cflags gnorba gnomeui`"
+               GNORBA_LIBS="`gnome-config --libs gnorba gnomeui`"
+               AC_SUBST(GNORBA_CFLAGS)
+               AC_SUBST(GNORBA_LIBS)
+       else
+               if test x$2 = xfailure; then
+                       AC_MSG_ERROR(gnorba library not installed or installation problem)
+               fi
+       fi
+])
+
+AC_DEFUN([GNOME_GNORBA_CHECK], [
+       GNOME_GNORBA_HOOK([],failure)
+])
diff --git a/apps/silcer/macros/gnome-guile-checks.m4 b/apps/silcer/macros/gnome-guile-checks.m4
new file mode 100644 (file)
index 0000000..1086d30
--- /dev/null
@@ -0,0 +1,119 @@
+dnl
+dnl GNOME_CHECK_GUILE (failflag)
+dnl
+dnl if failflag is "fail" then GNOME_CHECK_GUILE will abort if guile is not found.
+dnl
+
+AC_DEFUN([GNOME_CHECK_GUILE],
+[
+       saved_ldflags="$LDFLAGS"
+       saved_cppflags="$CPPFLAGS"
+       LDFLAGS="$LDFLAGS $GNOME_LIBDIR"
+
+       AC_CHECK_LIB(qthreads,qt_null,[
+               QTTHREADS_LIB="-lqthreads"
+       ],[
+               AC_CHECK_LIB(qt, qt_null, QTTHREADS_LIB="-lqt")
+       ],$LIBS)
+       AC_SUBST(QTTHREADS_LIB)
+
+       AC_CHECK_LIB(termcap,main,TERMCAP_LIB="-ltermcap")
+       AC_CHECK_LIB(readline,main,READLINE_LIB="-lreadline",,$TERMCAP_LIB)
+
+       AC_SUBST(TERMCAP_LIB)
+       AC_SUBST(READLINE_LIB)
+
+       if test "x$cross_compiling" = "xyes" ; then
+         name_build_guile="$target_alias-guile-config"
+       else
+         name_build_guile="guile-config"
+       fi
+
+       AC_CHECK_PROG(BUILD_GUILE, $name_build_guile, yes, no)
+
+       if test "x$BUILD_GUILE" = "xyes"; then
+           AC_MSG_CHECKING(whether $name_build_guile works)
+           if test x`$name_build_guile --version >/dev/null 2>&1 || \
+               echo no` = xno; then
+               BUILD_GUILE=no
+           fi
+           AC_MSG_RESULT($BUILD_GUILE)
+       else
+
+           if test "x$cross_compiling" = "xyes" ; then
+               name_build_guile="$target_alias-build-guile"
+           else        
+               name_build_guile="build-guile"
+           fi
+
+           AC_CHECK_PROG(BUILD_GUILE, $name_build_guile, yes, no)
+
+           if test "x$BUILD_GUILE" = "xyes"; then
+               AC_MSG_CHECKING(whether $name_build_guile works)
+               if test x`$name_build_guile --version >/dev/null 2>&1 || \
+                   echo no` = xno; then
+                   BUILD_GUILE=no
+               fi
+               AC_MSG_RESULT($BUILD_GUILE)
+           fi
+       fi
+
+       AC_CHECK_LIB(m, sin)
+
+       if test "x$BUILD_GUILE" = "xyes"; then
+               AC_MSG_CHECKING(for guile libraries)
+               GUILE_LIBS="`$name_build_guile link`"
+               AC_MSG_RESULT($GUILE_LIBS)
+               AC_MSG_CHECKING(for guile headers)
+               GUILE_INCS="`$name_build_guile compile`"
+               AC_MSG_RESULT($GUILE_INCS)
+       else
+               GUILE_LIBS="$GNOME_LIBDIR"
+               GUILE_INCS="$GNOME_INCLUDEDIR"
+               AC_CHECK_LIB(rx, main, GUILE_LIBS="-lrx $GUILE_LIBS")
+               AC_CHECK_LIB(qt, qt_null, GUILE_LIBS="-lqt $GUILE_LIBS")
+               AC_CHECK_LIB(dl, dlopen, GUILE_LIBS="-ldl $GUILE_LIBS")
+               AC_CHECK_LIB(nsl, t_accept, GUILE_LIBS="$GUILE_LIBS -lnsl")
+               AC_CHECK_LIB(socket, socket, GUILE_LIBS="$GUILE_LIBS -lsocket")
+               GUILE_LIBS="-lguile $GUILE_LIBS $QTTHREADS_LIB $READLINE_LIB $TERMCAP_LIB"
+       fi
+
+       AC_SUBST(GUILE_LIBS)
+       AC_SUBST(GUILE_INCS)
+
+       saved_LIBS="$LIBS"
+       LIBS="$LIBS $GUILE_LIBS"
+       CPPFLAGS="$saved_cppflags $GUILE_INCS"
+
+       AC_MSG_CHECKING(whether guile works)
+       AC_TRY_LINK([
+               #include <libguile.h>
+               #include <guile/gh.h>
+       ],[
+               gh_eval_str("(newline)");
+               scm_boot_guile(0,NULL,NULL,NULL);
+       ],[
+               ac_cv_guile_found=yes
+               AC_DEFINE(HAVE_GUILE)
+       ],[
+               ac_cv_guile_found=no
+       ])
+       AC_MSG_RESULT($ac_cv_guile_found)
+
+       if test x$ac_cv_guile_found = xno ; then
+               if test x$1 = xfail ; then
+                 AC_MSG_ERROR(Can not find Guile on this system)
+               else
+                 AC_MSG_WARN(Can not find Guile on this system)
+               fi
+               ac_cv_guile_found=no
+               GUILE_LIBS= GUILE_INCS=
+       fi
+
+       LIBS="$saved_LIBS"
+       LDFLAGS="$saved_ldflags"
+       CPPFLAGS="$saved_cppflags"
+
+       AC_SUBST(GUILE_LIBS)
+       AM_CONDITIONAL(GUILE, test x$ac_cv_guile_found = xyes)
+])
diff --git a/apps/silcer/macros/gnome-libgtop-check.m4 b/apps/silcer/macros/gnome-libgtop-check.m4
new file mode 100644 (file)
index 0000000..1b4e174
--- /dev/null
@@ -0,0 +1,217 @@
+dnl
+dnl LIBGTOP_CHECK_TYPE
+dnl
+dnl Improved version of AC_CHECK_TYPE which takes into account
+dnl that we need to #include some other header files on some
+dnl systems to get some types.
+
+dnl AC_LIBGTOP_CHECK_TYPE(TYPE, DEFAULT)
+AC_DEFUN([AC_LIBGTOP_CHECK_TYPE],
+[AC_REQUIRE([AC_HEADER_STDC])dnl
+AC_MSG_CHECKING(for $1)
+AC_CACHE_VAL(ac_cv_type_$1,
+[AC_EGREP_CPP(dnl
+changequote(<<,>>)dnl
+<<(^|[^a-zA-Z_0-9])$1[^a-zA-Z_0-9]>>dnl
+changequote([,]), [#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+
+/* For Tru64 */
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+], ac_cv_type_$1=yes, ac_cv_type_$1=no)])dnl
+AC_MSG_RESULT($ac_cv_type_$1)
+if test $ac_cv_type_$1 = no; then
+  AC_DEFINE($1, $2)
+fi
+])
+
+dnl
+dnl GNOME_LIBGTOP_TYPES
+dnl
+dnl some typechecks for libgtop.
+dnl
+
+AC_DEFUN([GNOME_LIBGTOP_TYPES],
+[
+       AC_CHECK_HEADERS(sys/bitypes.h)
+       AC_LIBGTOP_CHECK_TYPE(u_int64_t, unsigned long long int)
+       AC_LIBGTOP_CHECK_TYPE(int64_t, signed long long int)
+])
+
+dnl
+dnl GNOME_LIBGTOP_HOOK (minversion, script-if-libgtop-enabled, failflag)
+dnl
+dnl if failflag is "fail" then GNOME_LIBGTOP_HOOK will abort if LibGTop
+dnl is not found. 
+dnl
+
+AC_DEFUN([GNOME_LIBGTOP_HOOK],
+[      
+       AC_REQUIRE([GNOME_LIBGTOP_TYPES])
+
+       AC_SUBST(LIBGTOP_LIBDIR)
+       AC_SUBST(LIBGTOP_INCLUDEDIR)
+       AC_SUBST(LIBGTOP_EXTRA_LIBS)
+       AC_SUBST(LIBGTOP_LIBS)
+       AC_SUBST(LIBGTOP_INCS)
+       AC_SUBST(LIBGTOP_NAMES_LIBS)
+       AC_SUBST(LIBGTOP_NAMES_INCS)
+       AC_SUBST(LIBGTOP_MAJOR_VERSION)
+       AC_SUBST(LIBGTOP_MINOR_VERSION)
+       AC_SUBST(LIBGTOP_MICRO_VERSION)
+       AC_SUBST(LIBGTOP_VERSION)
+       AC_SUBST(LIBGTOP_VERSION_CODE)
+       AC_SUBST(LIBGTOP_SERVER_VERSION)
+       AC_SUBST(LIBGTOP_INTERFACE_AGE)
+       AC_SUBST(LIBGTOP_BINARY_AGE)
+       AC_SUBST(LIBGTOP_BINDIR)
+       AC_SUBST(LIBGTOP_SERVER)
+
+       dnl Get the cflags and libraries from the libgtop-config script
+       dnl
+       AC_ARG_WITH(libgtop,
+       [  --with-libgtop=PFX      Prefix where LIBGTOP is installed (optional)],
+       libgtop_config_prefix="$withval", libgtop_config_prefix="")
+       AC_ARG_WITH(libgtop-exec,
+       [  --with-libgtop-exec=PFX Exec prefix where LIBGTOP is installed (optional)],
+       libgtop_config_exec_prefix="$withval", libgtop_config_exec_prefix="")
+
+       if test x$libgtop_config_exec_prefix != x ; then
+         libgtop_config_args="$libgtop_config_args --exec-prefix=$libgtop_config_exec_prefix"
+         if test x${LIBGTOP_CONFIG+set} != xset ; then
+           LIBGTOP_CONFIG=$libgtop_config_exec_prefix/bin/libgtop-config
+         fi
+       fi
+       if test x$libgtop_config_prefix != x ; then
+         libgtop_config_args="$libgtop_config_args --prefix=$libgtop_config_prefix"
+         if test x${LIBGTOP_CONFIG+set} != xset ; then
+           LIBGTOP_CONFIG=$libgtop_config_prefix/bin/libgtop-config
+         fi
+       fi
+
+       AC_PATH_PROG(LIBGTOP_CONFIG, libgtop-config, no)
+       dnl IMPORTANT NOTICE:
+       dnl   If you increase this number here, this means that *ALL*
+       dnl   modules will require the new version, even if they explicitly
+       dnl   give a lower number in their `configure.in' !!!
+       real_min_libgtop_version=1.0.0
+       min_libgtop_version=ifelse([$1], ,$real_min_libgtop_version,$1)
+       dnl I know, the following code looks really ugly, but if you want
+       dnl to make changes, please test it with a brain-dead /bin/sh and
+       dnl with a brain-dead /bin/test (not all shells/tests support the
+       dnl `<' operator to compare strings, that's why I convert everything
+       dnl into numbers and test them).
+       min_libgtop_major=`echo $min_libgtop_version | \
+         sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+       min_libgtop_minor=`echo $min_libgtop_version | \
+         sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+       min_libgtop_micro=`echo $min_libgtop_version | \
+         sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+       test x$min_libgtop_micro = x && min_libgtop_micro=0
+       real_min_libgtop_major=`echo $real_min_libgtop_version | \
+         sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+       real_min_libgtop_minor=`echo $real_min_libgtop_version | \
+         sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+       real_min_libgtop_micro=`echo $real_min_libgtop_version | \
+         sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+       test x$real_min_libgtop_micro = x && real_min_libgtop_micro=0
+       dnl You cannot require a version less then $real_min_libgtop_version,
+       dnl so you don't need to update each `configure.in' when it's increased.
+       if test $real_min_libgtop_major -gt $min_libgtop_major ; then
+         min_libgtop_major=$real_min_libgtop_major
+         min_libgtop_minor=$real_min_libgtop_minor
+         min_libgtop_micro=$real_min_libgtop_micro
+       elif test $real_min_libgtop_major = $min_libgtop_major ; then
+         if test $real_min_libgtop_minor -gt $min_libgtop_minor ; then
+           min_libgtop_minor=$real_min_libgtop_minor
+           min_libgtop_micro=$real_min_libgtop_micro
+         elif test $real_min_libgtop_minor = $min_libgtop_minor ; then
+           if test $real_min_libgtop_micro -gt $min_libgtop_micro ; then
+             min_libgtop_micro=$real_min_libgtop_micro
+           fi
+         fi
+       fi
+       min_libgtop_version="$min_libgtop_major.$min_libgtop_minor.$min_libgtop_micro"
+       AC_MSG_CHECKING(for libgtop - version >= $min_libgtop_version)
+       no_libgtop=""
+       if test "$LIBGTOP_CONFIG" = "no" ; then
+         no_libgtop=yes
+       else
+         configfile=`$LIBGTOP_CONFIG --config`
+         libgtop_major_version=`$LIBGTOP_CONFIG --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+         libgtop_minor_version=`$LIBGTOP_CONFIG --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+         libgtop_micro_version=`$LIBGTOP_CONFIG --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+         if test $libgtop_major_version != $min_libgtop_major ; then 
+           no_libgtop=mismatch
+         else 
+           test $libgtop_minor_version -lt $min_libgtop_minor && no_libgtop=yes
+           if test $libgtop_minor_version = $min_libgtop_minor ; then
+             test $libgtop_micro_version -lt $min_libgtop_micro && no_libgtop=yes
+           fi
+         fi
+         . $configfile
+       fi
+       if test x$no_libgtop = x ; then
+         AC_DEFINE(HAVE_LIBGTOP)
+         AC_DEFINE_UNQUOTED(LIBGTOP_VERSION, "$LIBGTOP_VERSION")
+         AC_DEFINE_UNQUOTED(LIBGTOP_VERSION_CODE, $LIBGTOP_VERSION_CODE)
+         AC_DEFINE_UNQUOTED(LIBGTOP_MAJOR_VERSION, $LIBGTOP_MAJOR_VERSION)
+         AC_DEFINE_UNQUOTED(LIBGTOP_MINOR_VERSION, $LIBGTOP_MINOR_VERSION)
+         AC_DEFINE_UNQUOTED(LIBGTOP_MICRO_VERSION, $LIBGTOP_MICRO_VERSION)
+         AC_DEFINE_UNQUOTED(LIBGTOP_SERVER_VERSION, $LIBGTOP_SERVER_VERSION)
+         AC_MSG_RESULT(yes)
+         dnl Note that an empty true branch is not valid sh syntax.
+         ifelse([$2], [], :, [$2])
+       else
+         AC_MSG_RESULT(no)
+         if test "$no_libgtop"x = mismatchx; then
+           AC_MSG_ERROR(LibGTop major version mismatch $libgtop_major_version != $min_libgtop_major)
+         fi
+         if test "x$3" = "xfail"; then
+           AC_MSG_ERROR(LibGTop >= $min_libgtop_version not found)
+         else
+           AC_MSG_WARN(LibGTop >= $min_libgtop_version not found)
+         fi
+       fi
+
+       AM_CONDITIONAL(HAVE_LIBGTOP, test x$no_libgtop != xyes)
+])
+
+AC_DEFUN([GNOME_INIT_LIBGTOP],[
+       GNOME_LIBGTOP_HOOK($1,[ifelse([$3], [], :, [$3])],$2)
+])
+
+dnl
+dnl GNOME_LIBGTOP_DOCU
+dnl
+dnl checks whether the documentation of LibGTop is installed
+dnl
+
+AC_DEFUN([GNOME_LIBGTOP_DOCU],
+[
+       AC_REQUIRE([GNOME_LIBGTOP_HOOK])
+
+       helpdir="$LIBGTOP_DATADIR/gnome/help/libgtop"
+
+       AC_MSG_CHECKING(whether you have the LibGTop Documentation)
+
+       if test -f "$helpdir/C/topic.dat" ; then
+         have_libgtop_docu=yes
+         AC_DEFINE(HAVE_LIBGTOP_DOCU)
+       else
+         have_libgtop_docu=no
+       fi
+
+       AC_MSG_RESULT($have_libgtop_docu)
+
+       AM_CONDITIONAL(HAVE_LIBGTOP_DOCU, test x$have_libgtop_docu = xyes)
+])
+
diff --git a/apps/silcer/macros/gnome-objc-checks.m4 b/apps/silcer/macros/gnome-objc-checks.m4
new file mode 100644 (file)
index 0000000..c69acb0
--- /dev/null
@@ -0,0 +1,83 @@
+AC_DEFUN([GNOME_CHECK_OBJC],
+[
+dnl Look for an ObjC compiler.
+dnl FIXME: extend list of possible names of ObjC compilers.
+  AC_CHECK_PROGS(OBJC, $OBJC egcs, "")
+  if test "x$OBJC" = "x" ; then
+    AC_CHECK_PROGS(OBJC, $OBJC egcc, "")
+    if test "x$OBJC" = "x" ; then
+      AC_CHECK_PROGS(OBJC, $OBJC gcc, "")
+    fi
+  fi
+
+  AC_REQUIRE([GNOME_PTHREAD_CHECK])
+
+  OBJC_LIBS="-lobjc $PTHREAD_LIB"
+  AC_CHECK_FUNC(sched_yield,,[
+    AC_CHECK_LIB(rt,sched_yield,
+      OBJC_LIBS="$OBJC_LIBS -lrt",[
+      AC_CHECK_LIB(posix4,sched_yield,
+        OBJC_LIBS="$OBJC_LIBS -lposix4",, 
+        $OBJC_LIBS)],
+      $OBJC_LIBS)])
+  AC_SUBST(OBJC_LIBS)
+
+  AC_CACHE_CHECK([if Objective C compiler ($OBJC) works],
+                ac_cv_prog_objc_works, [
+    if test -n "$OBJC"; then
+      cat > conftest.m <<EOF
+#include <objc/Object.h>
+@interface myRandomObj : Object
+{
+}
+@end
+@implementation myRandomObj
+@end
+int main () {
+  /* No, you are not seeing double.  Remember that square brackets
+     are the autoconf m4 quotes.  */
+  id myid = [[myRandomObj alloc]];
+  [[myid free]];
+  return 0;
+}
+EOF
+
+      $OBJC $CFLAGS -o conftest $LDFLAGS conftest.m $OBJC_LIBS 1>&AC_FD_CC 2>&1
+      result=$?
+      rm -f conftest*
+
+      if test $result -eq 0; then
+        ac_cv_prog_objc_works=yes
+      fi
+    else
+      ac_cv_prog_objc_works=no
+    fi
+  ])
+
+  AM_CONDITIONAL(OBJECTIVE_C, test x$ac_cv_prog_objc_works = xyes)
+  dnl Also set the shell variable OBJECTIVE_C to "yes" or "no".
+  OBJECTIVE_C=$ac_cv_prog_objc_works
+])
+
+AC_DEFUN([GNOME_INIT_OBJC],
+[
+       AC_MSG_CHECKING(for an obGnomeConf.sh)
+       my_gnome_libdir=`$GNOME_CONFIG --libdir`
+       if test -f $my_gnome_libdir/obGnomeConf.sh; then
+           . $my_gnome_libdir/obGnomeConf.sh
+           AC_MSG_RESULT(found $my_gnome_libdir)
+           ac_cv_have_gnome_objc=yes
+       else
+           AC_MSG_RESULT(not found)
+           AC_MSG_WARN(Could not find the obGnomeConf.sh file that is generated by gnome-objc install)
+           ac_cv_have_gnome_objc=no
+       fi
+       
+       dnl Add a conditional on whether or not we have gnome-objc
+       AM_CONDITIONAL(HAVE_GNOME_OBJC, test x$ac_cv_have_gnome_objc = xyes)
+       HAVE_GNOME_OBJC=$ac_cv_have_gnome_objc
+
+       AC_SUBST(OBGNOME_INCLUDEDIR)
+       AC_SUBST(OBGNOME_LIBS)
+       AC_SUBST(OBGTK_LIBS)
+])
diff --git a/apps/silcer/macros/gnome-orbit-check.m4 b/apps/silcer/macros/gnome-orbit-check.m4
new file mode 100644 (file)
index 0000000..54bf33a
--- /dev/null
@@ -0,0 +1,33 @@
+dnl
+dnl GNOME_ORBIT_HOOK (script-if-orbit-found, failflag)
+dnl
+dnl if failflag is "failure" it aborts if orbit is not found.
+dnl
+
+AC_DEFUN([GNOME_ORBIT_HOOK],[
+       AC_PATH_PROG(ORBIT_CONFIG,orbit-config,no)
+       AC_PATH_PROG(ORBIT_IDL,orbit-idl,no)
+       AC_CACHE_CHECK([for working ORBit environment],gnome_cv_orbit_found,[
+               if test x$ORBIT_CONFIG = xno -o x$ORBIT_IDL = xno; then
+                       gnome_cv_orbit_found=no
+               else
+                       gnome_cv_orbit_found=yes
+               fi
+       ])
+       AM_CONDITIONAL(HAVE_ORBIT, test x$gnome_cv_orbit_found = xyes)
+       if test x$gnome_cv_orbit_found = xyes; then
+               $1
+               ORBIT_CFLAGS=`orbit-config --cflags client server`
+               ORBIT_LIBS=`orbit-config --use-service=name --libs client server`
+               AC_SUBST(ORBIT_CFLAGS)
+               AC_SUBST(ORBIT_LIBS)
+       else
+               if test x$2 = xfailure; then
+                       AC_MSG_ERROR(ORBit not installed or installation problem)
+               fi
+       fi
+])
+
+AC_DEFUN([GNOME_ORBIT_CHECK], [
+       GNOME_ORBIT_HOOK([],failure)
+])
diff --git a/apps/silcer/macros/gnome-print-check.m4 b/apps/silcer/macros/gnome-print-check.m4
new file mode 100644 (file)
index 0000000..c5f0fe3
--- /dev/null
@@ -0,0 +1,63 @@
+# Configure paths for GNOME-PRINT
+# Chris Lahey  99-2-5
+# stolen from Manish Singh again
+# stolen back from Frank Belew
+# stolen from Manish Singh
+# Shamelessly stolen from Owen Taylor
+
+dnl AM_PATH_GNOME_PRINT([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for GNOME-PRINT, and define GNOME_PRINT_CFLAGS and GNOME_PRINT_LIBS
+dnl
+AC_DEFUN([AM_PATH_GNOME_PRINT],
+[
+  min_version=ifelse([$1],,0.21,$1)
+
+  gnome_print_ok=""
+
+  AC_PATH_PROG(GNOME_CONFIG, gnome-config, no)
+  if test "$GNOME_CONFIG" = "no" ; then
+    AC_MSG_RESULT(gnome-config is missing, check your gnome installation)
+  else
+    AC_MSG_CHECKING(for GNOME-PRINT - version >= $min_version)
+    if `$GNOME_CONFIG --libs print > /dev/null 2>&1`; then
+      rqmajor=$(echo "$1" | sed -e 's/cvs-//' | sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\1/')
+      rqminor=$(echo "$1" | sed -e 's/cvs-//' | sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\2/')
+      major=$($GNOME_CONFIG --modversion print | sed -e 's/gnome-print-//' | sed -e 's/cvs-//' | sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\1/')
+      minor=$($GNOME_CONFIG --modversion print | sed -e 's/gnome-print-//' | sed -e 's/cvs-//' | sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\2/')
+      if test "$major" -ge "$rqmajor"; then
+        if test "$major" -gt "$rqmajor"; then
+          AC_MSG_RESULT("found $major.$minor")
+          gnome_print_ok="yes"
+        else
+          if test "$minor" -ge "$rqminor"; then
+            AC_MSG_RESULT("found $major.$minor")
+            gnome_print_ok="yes"
+          else
+            AC_MSG_RESULT("you have $major.$minor")
+          fi
+        fi
+      else
+        AC_MSG_RESULT("you have $major.$minor")
+      fi
+    else
+      AC_MSG_RESULT("did not find any version")
+    fi
+  fi
+
+  if test "x$gnome_print_ok" != "x" ; then
+    GNOME_PRINT_CFLAGS=`$GNOME_CONFIG --cflags print`
+    GNOME_PRINT_LIBS=`$GNOME_CONFIG --libs print`
+    ifelse([$2], , :, [$2])
+  else
+     GNOME_PRINT_CFLAGS=""
+     GNOME_PRINT_LIBS=""
+     ifelse([$3], , :, [$3])
+  fi
+
+  AC_SUBST(GNOME_PRINT_CFLAGS)
+  AC_SUBST(GNOME_PRINT_LIBS)
+])
+
+AC_DEFUN([GNOME_PRINT_CHECK], [
+       AM_PATH_GNOME_PRINT($1,,[AC_MSG_ERROR(GNOME-PRINT not found or wrong version)])
+])
diff --git a/apps/silcer/macros/gnome-pthread-check.m4 b/apps/silcer/macros/gnome-pthread-check.m4
new file mode 100644 (file)
index 0000000..a4eb3b4
--- /dev/null
@@ -0,0 +1,16 @@
+dnl
+dnl And better, use gthreads instead...
+dnl
+
+AC_DEFUN([GNOME_PTHREAD_CHECK],[
+       PTHREAD_LIB=""
+       AC_CHECK_LIB(pthread, pthread_create, PTHREAD_LIB="-lpthread",
+               [AC_CHECK_LIB(pthreads, pthread_create, PTHREAD_LIB="-lpthreads",
+                   [AC_CHECK_LIB(c_r, pthread_create, PTHREAD_LIB="-lc_r",
+                       [AC_CHECK_FUNC(pthread_create)]
+                   )]
+               )]
+       )
+       AC_SUBST(PTHREAD_LIB)
+       AC_PROVIDE([GNOME_PTHREAD_CHECK])
+])
diff --git a/apps/silcer/macros/gnome-support.m4 b/apps/silcer/macros/gnome-support.m4
new file mode 100644 (file)
index 0000000..2c1d049
--- /dev/null
@@ -0,0 +1,68 @@
+dnl GNOME_SUPPORT_CHECKS
+dnl    Check for various support functions needed by the standard
+dnl    Gnome libraries.  Sets LIBOBJS, might define some macros.
+dnl    This should only be used when building the Gnome libs; 
+dnl    Gnome clients should not need this macro.
+AC_DEFUN([GNOME_SUPPORT_CHECKS],[
+  # we need an `awk' to build `gnomesupport.h'
+  AC_REQUIRE([AC_PROG_AWK])
+
+  # this should go away soon
+  need_gnome_support=yes
+
+  save_LIBOBJS="$LIBOBJS"
+  LIBOBJS=
+
+  AC_CHECK_FUNCS(getopt_long,,LIBOBJS="$LIBOBJS getopt.o getopt1.o")
+
+  # for `scandir'
+  AC_HEADER_DIRENT
+
+  # copied from `configure.in' of `libiberty'
+  vars="program_invocation_short_name program_invocation_name sys_errlist"
+  for v in $vars; do
+    AC_MSG_CHECKING([for $v])
+    AC_CACHE_VAL(gnome_cv_var_$v,
+      [AC_TRY_LINK([int *p;], [extern int $v; p = &$v;],
+                  [eval "gnome_cv_var_$v=yes"],
+                  [eval "gnome_cv_var_$v=no"])])
+    if eval "test \"`echo '$gnome_cv_var_'$v`\" = yes"; then
+      AC_MSG_RESULT(yes)
+      n=HAVE_`echo $v | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+      AC_DEFINE_UNQUOTED($n)
+    else
+      AC_MSG_RESULT(no)
+    fi
+  done
+
+  AC_REPLACE_FUNCS(memmove mkstemp scandir strcasecmp strerror strndup strnlen)
+  AC_REPLACE_FUNCS(strtok_r strtod strtol strtoul vasprintf vsnprintf)
+
+  AC_CHECK_FUNCS(realpath,,LIBOBJS="$LIBOBJS canonicalize.o")
+
+  # to include `error.c' error.c has some HAVE_* checks
+  AC_CHECK_FUNCS(vprintf doprnt strerror_r)
+  AM_FUNC_ERROR_AT_LINE
+
+  # This is required if we declare setreuid () and setregid ().
+  AC_TYPE_UID_T
+
+  # see if we need to declare some functions.  Solaris is notorious for
+  # putting functions into the `libc' but not listing them in the headers
+  AC_CHECK_HEADERS(string.h strings.h stdlib.h unistd.h dirent.h)
+  GCC_NEED_DECLARATIONS(gethostname setreuid setregid getpagesize)
+  GCC_NEED_DECLARATION(scandir,[
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+])
+
+  # Turn our LIBOBJS into libtool objects.  This is gross, but it
+  # requires changes to autoconf before it goes away.
+  LTLIBOBJS=`echo "$LIBOBJS" | sed 's/\.o/.lo/g'`
+  AC_SUBST(need_gnome_support)
+  AC_SUBST(LTLIBOBJS)
+
+  LIBOBJS="$save_LIBOBJS"
+  AM_CONDITIONAL(BUILD_GNOME_SUPPORT, test "$need_gnome_support" = yes)
+])
diff --git a/apps/silcer/macros/gnome-undelfs.m4 b/apps/silcer/macros/gnome-undelfs.m4
new file mode 100644 (file)
index 0000000..c8ea6f4
--- /dev/null
@@ -0,0 +1,20 @@
+dnl GNOME_UNDELFS_CHECKS
+dnl    Check for ext2fs undel support.
+dnl    Set shell variable ext2fs_undel to "yes" if we have it,
+dnl    "no" otherwise.  May define USE_EXT2FSLIB for cpp.
+dnl    Will set EXT2FS_UNDEL_LIBS to required libraries.
+
+AC_DEFUN([GNOME_UNDELFS_CHECKS], [
+  AC_CHECK_HEADERS(ext2fs/ext2fs.h linux/ext2_fs.h)
+  ext2fs_undel=no
+  EXT2FS_UNDEL_LIBS=
+  if test x$ac_cv_header_ext2fs_ext2fs_h = xyes
+  then
+    if test x$ac_cv_header_linux_ext2_fs_h = xyes
+    then
+      AC_DEFINE(USE_EXT2FSLIB)
+      ext2fs_undel=yes
+      EXT2FS_UNDEL_LIBS="-lext2fs -lcom_err"
+    fi
+  fi
+])
diff --git a/apps/silcer/macros/gnome-vfs.m4 b/apps/silcer/macros/gnome-vfs.m4
new file mode 100644 (file)
index 0000000..8ca361f
--- /dev/null
@@ -0,0 +1,120 @@
+dnl GNOME_VFS_CHECKS
+dnl   Check for various functions needed by libvfs.
+dnl   This has various effects:
+dnl     Sets GNOME_VFS_LIBS to libraries required
+dnl     Sets termnet  to true or false depending on whether it is required.
+dnl        If yes, defines USE_TERMNET.
+dnl     Sets vfs_flags to "pretty" list of vfs implementations we include.
+dnl     Sets shell variable use_vfs to yes (default, --with-vfs) or
+dnl        "no" (--without-vfs).
+dnl     Calls AC_SUBST(mcserv), which is either empty or "mcserv".
+
+dnl Private define
+AC_DEFUN([GNOME_WITH_VFS],[
+  dnl FIXME: network checks should probably be in their own macro.
+  AC_CHECK_LIB(nsl, t_accept)
+  AC_CHECK_LIB(socket, socket)
+
+  have_socket=no
+  AC_CHECK_FUNCS(socket, have_socket=yes)
+  if test $have_socket = no; then
+    # socket is not in the default libraries.  See if it's in some other.
+    for lib in bsd socket inet; do
+      AC_CHECK_LIB($lib, socket, [
+         LIBS="$LIBS -l$lib"
+         have_socket=yes
+         AC_DEFINE(HAVE_SOCKET)
+         break])
+    done
+  fi
+
+  have_gethostbyname=no
+  AC_CHECK_FUNC(gethostbyname, have_gethostbyname=yes)
+  if test $have_gethostbyname = no; then
+    # gethostbyname is not in the default libraries.  See if it's in some other.
+    for lib in bsd socket inet; do
+      AC_CHECK_LIB($lib, gethostbyname, [LIBS="$LIBS -l$lib"; have_gethostbyname=yes; break])
+    done
+  fi
+
+  vfs_flags="tarfs"
+  use_net_code=false
+  if test $have_socket = yes; then
+      AC_STRUCT_LINGER
+      AC_CHECK_FUNCS(pmap_set, , [
+        AC_CHECK_LIB(rpc, pmap_set, [
+          LIBS="-lrpc $LIBS"
+         AC_DEFINE(HAVE_PMAP_SET)
+         ])])
+      AC_CHECK_FUNCS(pmap_getport pmap_getmaps rresvport)
+      dnl add for source routing support setsockopt
+      AC_CHECK_HEADERS(rpc/pmap_clnt.h)
+      vfs_flags="$vfs_flags, mcfs, ftpfs, fish"
+      use_net_code=true
+  fi
+
+  dnl
+  dnl Samba support
+  dnl
+  smbfs=""
+  SAMBAFILES=""
+  AC_ARG_WITH(samba,
+         [--with-samba             Support smb virtual file system],[
+         if test "x$withval" != "xno"; then
+                 AC_DEFINE(WITH_SMBFS)
+                 vfs_flags="$vfs_flags, smbfs"
+                 smbfs="smbfs.o"
+                 SAMBAFILES="\$(SAMBAFILES)"
+         fi
+  ])
+  AC_SUBST(smbfs)
+  AC_SUBST(SAMBAFILES)
+  
+  dnl
+  dnl The termnet support
+  dnl
+  termnet=false
+  AC_ARG_WITH(termnet,
+         [--with-termnet             If you want a termified net support],[
+         if test x$withval = xyes; then
+                 AC_DEFINE(USE_TERMNET)
+                 termnet=true          
+         fi
+  ])
+
+  TERMNET=""
+  AC_DEFINE(USE_VFS)
+  if $use_net_code; then
+     AC_DEFINE(USE_NETCODE)
+  fi
+  mcserv=
+  if test $have_socket = yes; then
+     mcserv="mcserv"
+     if $termnet; then
+       TERMNET="-ltermnet"
+     fi
+  fi
+
+  AC_SUBST(TERMNET)
+  AC_SUBST(mcserv)
+
+dnl FIXME:
+dnl GNOME_VFS_LIBS=
+
+])
+
+AC_DEFUN([GNOME_VFS_CHECKS],[
+       use_vfs=yes
+       AC_ARG_WITH(vfs,
+               [--with-vfs                Compile with the VFS code],
+               use_vfs=$withval
+       )
+       case $use_vfs in
+               yes)    GNOME_WITH_VFS;;
+               no)     use_vfs=no;;
+               *)      use_vfs=no;;
+                       dnl Should we issue a warning?
+       esac
+])
+
+
diff --git a/apps/silcer/macros/gnome-x-checks.m4 b/apps/silcer/macros/gnome-x-checks.m4
new file mode 100644 (file)
index 0000000..1e397ef
--- /dev/null
@@ -0,0 +1,80 @@
+dnl GNOME_X_CHECKS
+dnl
+dnl Basic X11 related checks for X11.  At the end, the following will be
+dnl defined/changed:
+dnl   GTK_{CFLAGS,LIBS}      From AM_PATH_GTK
+dnl   CPPFLAGS              Will include $X_CFLAGS
+dnl   GNOME_HAVE_SM         `true' or `false' depending on whether session
+dnl                          management is available.  It is available if
+dnl                          both -lSM and X11/SM/SMlib.h exist.  (Some
+dnl                          Solaris boxes have the library but not the header)
+dnl   XPM_LIBS               -lXpm if Xpm library is present, otherwise ""
+dnl
+dnl The following configure cache variables are defined (but not used):
+dnl   gnome_cv_passdown_{x_libs,X_LIBS,X_CFLAGS}
+dnl
+AC_DEFUN([GNOME_X_CHECKS],
+[
+       AM_PATH_GTK(1.2.0,,AC_MSG_ERROR(GTK not installed, or gtk-config not in path))
+       dnl Hope that GTK_CFLAGS have only -I and -D.  Otherwise, we could
+       dnl   test -z "$x_includes" || CPPFLAGS="$CPPFLAGS -I$x_includes"
+       dnl
+       dnl Use CPPFLAGS instead of CFLAGS because AC_CHECK_HEADERS uses
+       dnl CPPFLAGS, not CFLAGS
+        CPPFLAGS="$CPPFLAGS $GTK_CFLAGS"
+
+        saved_ldflags="$LDFLAGS"
+        LDFLAGS="$LDFLAGS $GTK_LIBS"
+
+       gnome_cv_passdown_x_libs="$GTK_LIBS"
+       gnome_cv_passdown_X_LIBS="$GTK_LIBS"
+       gnome_cv_passdown_X_CFLAGS="$GTK_CFLAGS"
+       gnome_cv_passdown_GTK_LIBS="$GTK_LIBS"
+
+        LDFLAGS="$saved_ldflags $GTK_LIBS"
+
+dnl We are requiring GTK >= 1.1.1, which means this will be fine anyhow.
+       USE_DEVGTK=true
+
+dnl    AC_MSG_CHECKING([whether to use features from (unstable) GTK+ 1.1.x])
+dnl    AC_EGREP_CPP(answer_affirmatively,
+dnl    [#include <gtk/gtkfeatures.h>
+dnl    #ifdef GTK_HAVE_FEATURES_1_1_0
+dnl       answer_affirmatively
+dnl    #endif
+dnl    ], dev_gtk=yes, dev_gtk=no)
+dnl    if test "$dev_gtk" = "yes"; then
+dnl       USE_DEVGTK=true
+dnl    fi
+dnl    AC_MSG_RESULT("$dev_gtk")
+
+       GNOME_HAVE_SM=true
+       case "$GTK_LIBS" in
+        *-lSM*)
+           dnl Already found it.
+           ;;
+        *)
+           dnl Assume that if we have -lSM then we also have -lICE.
+           AC_CHECK_LIB(SM, SmcSaveYourselfDone,
+               [GTK_LIBS="-lSM -lICE $GTK_LIBS"],GNOME_HAVE_SM=false,
+               $x_libs -lICE)
+           ;;
+       esac
+
+       if test "$GNOME_HAVE_SM" = true; then
+          AC_CHECK_HEADERS(X11/SM/SMlib.h,,GNOME_HAVE_SM=false)
+       fi
+
+       if test "$GNOME_HAVE_SM" = true; then
+          AC_DEFINE(HAVE_LIBSM)
+       fi
+
+       XPM_LIBS=""
+       AC_CHECK_LIB(Xpm, XpmFreeXpmImage, [XPM_LIBS="-lXpm"], , $x_libs)
+       AC_SUBST(XPM_LIBS)
+
+       AC_REQUIRE([GNOME_PTHREAD_CHECK])
+        LDFLAGS="$saved_ldflags"
+
+       AC_PROVIDE([GNOME_X_CHECKS])
+])
diff --git a/apps/silcer/macros/gnome-xml-check.m4 b/apps/silcer/macros/gnome-xml-check.m4
new file mode 100644 (file)
index 0000000..1caad10
--- /dev/null
@@ -0,0 +1,32 @@
+dnl
+dnl GNOME_XML_HOOK (script-if-xml-found, failflag)
+dnl
+dnl If failflag is "failure", script aborts due to lack of XML
+dnl 
+dnl Check for availability of the libxml library
+dnl the XML parser uses libz if available too
+dnl
+
+AC_DEFUN([GNOME_XML_HOOK],[
+       AC_PATH_PROG(GNOME_CONFIG,gnome-config,no)
+       if test "$GNOME_CONFIG" = no; then
+               if test x$2 = xfailure; then
+                       AC_MSG_ERROR(Could not find gnome-config)
+               fi
+       fi
+       GNOME_XML_CFLAGS=`$GNOME_CONFIG --cflags xml`
+       AC_SUBST(GNOME_XML_CFLAGS)
+       AC_CHECK_LIB(xml, xmlNewDoc, [
+               $1
+               GNOME_XML_LIB=`$GNOME_CONFIG --libs xml`
+       ], [
+               if test x$2 = xfailure; then 
+                       AC_MSG_ERROR(Could not link sample xml program)
+               fi
+       ], `$GNOME_CONFIG --libs xml`)
+       AC_SUBST(GNOME_XML_LIB)
+])
+
+AC_DEFUN([GNOME_XML_CHECK], [
+       GNOME_XML_HOOK([],failure)
+])
diff --git a/apps/silcer/macros/gnome.m4 b/apps/silcer/macros/gnome.m4
new file mode 100644 (file)
index 0000000..659c22c
--- /dev/null
@@ -0,0 +1,128 @@
+dnl
+dnl GNOME_INIT_HOOK (script-if-gnome-enabled, [failflag], [additional-inits])
+dnl
+dnl if failflag is "fail" then GNOME_INIT_HOOK will abort if gnomeConf.sh
+dnl is not found. 
+dnl
+
+AC_DEFUN([GNOME_INIT_HOOK],[
+       AC_SUBST(GNOME_LIBS)
+       AC_SUBST(GNOMEUI_LIBS)
+       AC_SUBST(GNOMEGNORBA_LIBS)
+       AC_SUBST(GTKXMHTML_LIBS)
+       AC_SUBST(ZVT_LIBS)
+       AC_SUBST(GNOME_LIBDIR)
+       AC_SUBST(GNOME_INCLUDEDIR)
+
+       AC_ARG_WITH(gnome-includes,
+       [  --with-gnome-includes   Specify location of GNOME headers],[
+       CFLAGS="$CFLAGS -I$withval"
+       ])
+       
+       AC_ARG_WITH(gnome-libs,
+       [  --with-gnome-libs       Specify location of GNOME libs],[
+       LDFLAGS="$LDFLAGS -L$withval"
+       gnome_prefix=$withval
+       ])
+
+       AC_ARG_WITH(gnome,
+       [  --with-gnome            Specify prefix for GNOME files],
+               if test x$withval = xyes; then
+                       want_gnome=yes
+                       dnl Note that an empty true branch is not
+                       dnl valid sh syntax.
+                       ifelse([$1], [], :, [$1])
+               else
+                       if test "x$withval" = xno; then
+                               want_gnome=no
+                       else
+                               want_gnome=yes
+                               LDFLAGS="$LDFLAGS -L$withval/lib"
+                               CFLAGS="$CFLAGS -I$withval/include"
+                               gnome_prefix=$withval/lib
+                       fi
+               fi,
+               want_gnome=yes)
+
+       if test "x$want_gnome" = xyes; then
+
+           AC_PATH_PROG(GNOME_CONFIG,gnome-config,no)
+           if test "$GNOME_CONFIG" = "no"; then
+             no_gnome_config="yes"
+           else
+             AC_MSG_CHECKING(if $GNOME_CONFIG works)
+             if $GNOME_CONFIG --libs-only-l gnome >/dev/null 2>&1; then
+               AC_MSG_RESULT(yes)
+               GNOME_GNORBA_HOOK([],$2)
+               GNOME_LIBS="`$GNOME_CONFIG --libs-only-l gnome`"
+               GNOMEUI_LIBS="`$GNOME_CONFIG --libs-only-l gnomeui`"
+               GNOMEGNORBA_LIBS="`$GNOME_CONFIG --libs-only-l gnorba gnomeui`"
+               GTKXMHTML_LIBS="`$GNOME_CONFIG --libs-only-l gtkxmhtml`"
+               ZVT_LIBS="`$GNOME_CONFIG --libs-only-l zvt`"
+               GNOME_LIBDIR="`$GNOME_CONFIG --libs-only-L gnorba gnomeui`"
+               GNOME_INCLUDEDIR="`$GNOME_CONFIG --cflags gnorba gnomeui`"
+                $1
+             else
+               AC_MSG_RESULT(no)
+               no_gnome_config="yes"
+              fi
+            fi
+
+           if test x$exec_prefix = xNONE; then
+               if test x$prefix = xNONE; then
+                   gnome_prefix=$ac_default_prefix/lib
+               else
+                   gnome_prefix=$prefix/lib
+               fi
+           else
+               gnome_prefix=`eval echo \`echo $libdir\``
+           fi
+       
+           if test "$no_gnome_config" = "yes"; then
+              AC_MSG_CHECKING(for gnomeConf.sh file in $gnome_prefix)
+             if test -f $gnome_prefix/gnomeConf.sh; then
+               AC_MSG_RESULT(found)
+               echo "loading gnome configuration from" \
+                    "$gnome_prefix/gnomeConf.sh"
+               . $gnome_prefix/gnomeConf.sh
+               $1
+             else
+               AC_MSG_RESULT(not found)
+               if test x$2 = xfail; then
+                 AC_MSG_ERROR(Could not find the gnomeConf.sh file that is generated by gnome-libs install)
+               fi
+             fi
+            fi
+       fi
+
+       if test -n "$3"; then
+         n="$3"
+         for i in $n; do
+           AC_MSG_CHECKING(extra library \"$i\")
+           case $i in 
+             applets)
+               AC_SUBST(GNOME_APPLETS_LIBS)
+               GNOME_APPLETS_LIBS=`$GNOME_CONFIG --libs-only-l applets`
+               AC_MSG_RESULT($GNOME_APPLETS_LIBS);;
+             docklets)
+               AC_SUBST(GNOME_DOCKLETS_LIBS)
+               GNOME_DOCKLETS_LIBS=`$GNOME_CONFIG --libs-only-l docklets`
+               AC_MSG_RESULT($GNOME_DOCKLETS_LIBS);;
+             capplet)
+               AC_SUBST(GNOME_CAPPLET_LIBS)
+               GNOME_CAPPLET_LIBS=`$GNOME_CONFIG --libs-only-l capplet`
+               AC_MSG_RESULT($GNOME_CAPPLET_LIBS);;
+             *)
+               AC_MSG_RESULT(unknown library)
+           esac
+         done
+       fi
+])
+
+dnl
+dnl GNOME_INIT ([additional-inits])
+dnl
+
+AC_DEFUN([GNOME_INIT],[
+       GNOME_INIT_HOOK([],fail,$1)
+])
diff --git a/apps/silcer/macros/gperf-check.m4 b/apps/silcer/macros/gperf-check.m4
new file mode 100644 (file)
index 0000000..1b73d3f
--- /dev/null
@@ -0,0 +1,79 @@
+dnl
+dnl AC_PROG_GPERF (MINIMUM-VERSION)
+dnl
+dnl Check for availability of gperf.
+dnl Abort if not found or if current version is not up to par.
+dnl
+
+AC_DEFUN([AC_PROG_GPERF],[
+       AC_PATH_PROG(GPERF, gperf, no)
+       if test "$GPERF" = no; then
+               AC_MSG_ERROR(Could not find gperf)
+       fi
+       min_gperf_version=ifelse([$1], ,2.7,$1)
+       AC_MSG_CHECKING(for gperf - version >= $min_gperf_version)
+       gperf_major_version=`$GPERF --version | \
+               sed 's/GNU gperf \([[0-9]]*\).\([[0-9]]*\)/\1/'`
+       gperf_minor_version=`$GPERF --version | \
+               sed 's/GNU gperf \([[0-9]]*\).\([[0-9]]*\)/\2/'`
+       no_gperf=""
+dnl
+dnl Now check if the installed gperf is sufficiently new.
+dnl
+       AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static char*
+my_strdup (char *str)
+{
+  char *new_str;
+  
+  if (str)
+    {
+      new_str = malloc ((strlen (str) + 1) * sizeof(char));
+      strcpy (new_str, str);
+    }
+  else
+    new_str = NULL;
+  
+  return new_str;
+}
+
+int 
+main ()
+{
+  char  *tmp_version;
+  
+  int    major;
+  int    minor;
+
+  /* HP/UX 9 (%@#!) writes to sscanf strings */
+  tmp_version = my_strdup("$min_gperf_version");
+  if (sscanf(tmp_version, "%d.%d", &major, &minor) != 2) {
+    printf ("%s, bad version string\n", "$min_gperf_version");
+    exit (1);
+  }
+
+  if (($gperf_major_version > major) ||
+      (($gperf_major_version == major) && ($gperf_minor_version >= minor))) {
+    return 0;
+  } else {
+    printf ("\n");
+    printf ("*** An old version of gperf ($gperf_major_version.$gperf_minor_version) was found.\n");
+    printf ("*** You need a version of gperf newer than %d.%d.%d.  The latest version of\n",
+              major, minor);
+    printf ("*** gperf is always available from ftp://ftp.gnu.org.\n");
+    printf ("***\n");
+    return 1;
+  }
+}
+],,no_gperf=yes,[/bin/true])
+       if test "x$no_gperf" = x ; then
+               AC_MSG_RESULT(yes)
+       else
+               AC_MSG_RESULT(no)
+       fi
+
+])
diff --git a/apps/silcer/macros/linger.m4 b/apps/silcer/macros/linger.m4
new file mode 100644 (file)
index 0000000..1dfb89d
--- /dev/null
@@ -0,0 +1,28 @@
+dnl
+dnl Check for struct linger
+dnl
+AC_DEFUN([AC_STRUCT_LINGER], [
+av_struct_linger=no
+AC_MSG_CHECKING(struct linger is available)
+AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/socket.h>
+
+struct linger li;
+
+main ()
+{
+    li.l_onoff = 1;
+    li.l_linger = 120;
+    exit (0);
+}
+],[
+AC_DEFINE(HAVE_STRUCT_LINGER)
+av_struct_linger=yes
+],[
+av_struct_linger=no
+],[
+av_struct_linger=no
+])
+AC_MSG_RESULT($av_struct_linger)
+])
diff --git a/apps/silcer/macros/need-declaration.m4 b/apps/silcer/macros/need-declaration.m4
new file mode 100644 (file)
index 0000000..8a217b8
--- /dev/null
@@ -0,0 +1,42 @@
+dnl See whether we need a declaration for a function.
+dnl GCC_NEED_DECLARATION(FUNCTION [, EXTRA-HEADER-FILES])
+AC_DEFUN([GCC_NEED_DECLARATION],
+[AC_MSG_CHECKING([whether $1 must be declared])
+AC_CACHE_VAL(gcc_cv_decl_needed_$1,
+[AC_TRY_COMPILE([
+#include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+$2],
+[char *(*pfn) = (char *(*)) $1],
+eval "gcc_cv_decl_needed_$1=no", eval "gcc_cv_decl_needed_$1=yes")])
+if eval "test \"`echo '$gcc_cv_decl_needed_'$1`\" = yes"; then
+  AC_MSG_RESULT(yes)
+  gcc_need_declarations="$gcc_need_declarations $1"
+  gcc_tr_decl=NEED_DECLARATION_`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  AC_DEFINE_UNQUOTED($gcc_tr_decl)
+else
+  AC_MSG_RESULT(no)
+fi
+])dnl
+
+dnl Check multiple functions to see whether each needs a declaration.
+dnl GCC_NEED_DECLARATIONS(FUNCTION... [, EXTRA-HEADER-FILES])
+AC_DEFUN([GCC_NEED_DECLARATIONS],
+[for ac_func in $1
+do
+GCC_NEED_DECLARATION($ac_func, $2)
+done
+]
+)
diff --git a/apps/silcer/missing b/apps/silcer/missing
new file mode 100755 (executable)
index 0000000..0a7fb5a
--- /dev/null
@@ -0,0 +1,283 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 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.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+case "$1" in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]"
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing 0.3 - GNU automake"
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+  aclocal)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case "$f" in
+      *:*) touch_files="$touch_files "`echo "$f" |
+                                      sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+          sed 's/\.am$/.in/' |
+          while read f; do touch "$f"; done
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.y)
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.c
+           fi
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.h
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f y.tab.h ]; then
+       echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+       echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.l)
+           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" lex.yy.c
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+       echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+        you modified a dependency of a manual page.  You may need the
+        \`Help2man' package in order for those modifications to take
+        effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+       file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+    fi
+    if [ -f "$file" ]; then
+       touch $file
+    else
+       test -z "$file" || exec >$file
+       echo ".ab help2man is required to generate this page"
+       exit 1
+    fi
+    ;;
+
+  makeinfo)
+    if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
+       # We have makeinfo, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+    fi
+    touch $file
+    ;;
+
+  tar)
+    shift
+    if test -n "$run"; then
+      echo 1>&2 "ERROR: \`tar' requires --run"
+      exit 1
+    fi
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar ${1+"$@"} && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar ${1+"$@"} && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+       case "$firstarg" in
+       *o*)
+           firstarg=`echo "$firstarg" | sed s/o//`
+           tar "$firstarg" ${1+"$@"} && exit 0
+           ;;
+       esac
+       case "$firstarg" in
+       *h*)
+           firstarg=`echo "$firstarg" | sed s/h//`
+           tar "$firstarg" ${1+"$@"} && exit 0
+           ;;
+       esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+         system.  You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequirements for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
diff --git a/apps/silcer/mkinstalldirs b/apps/silcer/mkinstalldirs
new file mode 100755 (executable)
index 0000000..6b3b5fc
--- /dev/null
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id$
+
+errstatus=0
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp"
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+         errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/apps/silcer/pixmaps/glade-group.xpm b/apps/silcer/pixmaps/glade-group.xpm
new file mode 100644 (file)
index 0000000..44a7a2c
--- /dev/null
@@ -0,0 +1,29 @@
+/* XPM */
+static char * glade_group_xpm[] = {
+"16 16 10 1",
+"      c None",
+".     c #020204",
+"+     c #826E54",
+"@     c #9A8A76",
+"#     c #AD9E89",
+"$     c #BAAE98",
+"%     c #E0D9CF",
+"&     c #D2CAC0",
+"*     c #C6BEB0",
+"=     c #EDE9DF",
+"                ",
+" ....           ",
+".++@#.          ",
+".+##$.......    ",
+".....%&&**$#.   ",
+".==%%&&**$$#.   ",
+".=%%&&*$$$##.   ",
+".%%&&**$$##@.   ",
+".%&&*$$$##@@.   ",
+".&&**$$##@@+.   ",
+"..*$$$##@@++.   ",
+" ...........    ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/apps/silcer/po/ChangeLog b/apps/silcer/po/ChangeLog
new file mode 100644 (file)
index 0000000..9401553
--- /dev/null
@@ -0,0 +1,48 @@
+2001-11-17  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.39.
+
+2001-11-17  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.39.
+
+2001-11-17  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.39.
+
+2001-11-17  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.39.
+
+2001-11-17  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.39.
+
+2001-11-17  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.39.
+
+2001-11-17  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.39.
+
+2001-11-17  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.39.
+
+2001-11-17  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.39.
+
+2001-11-17  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.39.
+
+2001-11-17  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.39.
+
+2001-11-17  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.39.
+
diff --git a/apps/silcer/po/Makefile.in.in b/apps/silcer/po/Makefile.in.in
new file mode 100644 (file)
index 0000000..0636f0c
--- /dev/null
@@ -0,0 +1,210 @@
+# 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@
+XML_I18N_UPDATE = @XML_I18N_UPDATE@
+XML_I18N_EXTRACT = @XML_I18N_EXTRACT@
+
+MSGMERGE = XML_I18N_EXTRACT=$(XML_I18N_EXTRACT) $(XML_I18N_UPDATE) --dist
+GENPOT   = XML_I18N_EXTRACT=$(XML_I18N_EXTRACT) $(XML_I18N_UPDATE) --pot
+
+
+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 = ChangeLog 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
+       $(GENPOT)
+
+
+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$$//'`; \
+         cp $$lang.po $$lang.old.po; \
+         echo "$$lang:"; \
+         if $(MSGMERGE) $$lang ; then \
+           rm -f $$lang.old.po; \
+         else \
+           echo "msgmerge for $$cat failed!"; \
+           mv $$lang.old.po $$lang.po; \
+         fi; \
+       done
+       $(MAKE) update-gmo
+
+.po: Makefile
+       $(MAKE)  $(PACKAGE).pot;
+       PATH=`pwd`/../src:$$PATH; \
+       echo; printf "$*: "; \
+       if $(MSGMERGE) $*; then \
+         rm -f $*.old.po; \
+         else \
+           echo "msgmerge for * failed!"; \
+           mv $*.old.po $*.po; \
+       fi; \
+       msgfmt --statistics $*.po; echo;
+
+
+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
+
+# 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/apps/silcer/po/POTFILES.in b/apps/silcer/po/POTFILES.in
new file mode 100644 (file)
index 0000000..ab2d29e
--- /dev/null
@@ -0,0 +1,6 @@
+# List of source files containing translatable strings.
+
+src/main.c
+src/interface.c
+src/callbacks.c
+src/support.c
diff --git a/apps/silcer/silcer.png b/apps/silcer/silcer.png
new file mode 100644 (file)
index 0000000..c80c08d
Binary files /dev/null and b/apps/silcer/silcer.png differ
diff --git a/apps/silcer/src/Makefile.am b/apps/silcer/src/Makefile.am
new file mode 100644 (file)
index 0000000..42e5f17
--- /dev/null
@@ -0,0 +1,53 @@
+#
+#  Makefile.am
+#
+#  Author: Pekka Riikonen <priikone@silcnet.org>
+#
+#  Copyright (C) 2001 Pekka Riikonen
+#
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+
+silc_top_srcdir = ../../
+
+bin_PROGRAMS = silcer
+silcer_SOURCES = silcer.cc             \
+               silcerapp.cc            \
+               silcerbasewin.cc        \
+               silcerchatview.cc       \
+               xtext.c                 \
+               gtkurl.c                \
+               gtkspell.c              \
+               SilcerMainDlg.cc
+
+silcer_LDADD = @EXTRA_GNOME_LIBS@ -lxml \
+       -L$(silc_top_srcdir)/lib -lsilcclient -lsilc
+silcer_LDFLAGS =
+
+INCLUDES = @EXTRA_GNOME_CFLAGS@ -DENABLE_NLS \
+       -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
+       -DDATADIR=\"$(datadir)\" \
+       -I$(top_srcdir)/intl \
+       -I$(silc_top_srcdir)/lib/silccore \
+       -I$(silc_top_srcdir)/lib/silccrypt \
+        -I$(silc_top_srcdir)/lib/silcmath \
+        -I$(silc_top_srcdir)/lib/silcmath/mpi \
+       -I$(silc_top_srcdir)/lib/silcske \
+       -I$(silc_top_srcdir)/lib/silcsim \
+       -I$(silc_top_srcdir)/lib/silcutil \
+       -I$(silc_top_srcdir)/lib/silcsftp \
+       -I$(silc_top_srcdir)/lib/silcclient \
+       -I$(silc_top_srcdir)/lib/contrib \
+        -I$(silc_top_srcdir)/includes \
+        -I$(silc_top_srcdir)/doc \
+       -I$(silc_top_srcdir)/lib/trq
+
+EXTRA_DIST = 
diff --git a/apps/silcer/src/Makefile.in b/apps/silcer/src/Makefile.in
new file mode 100644 (file)
index 0000000..4aeecae
--- /dev/null
@@ -0,0 +1,437 @@
+# Makefile.in generated automatically by automake 1.5 from Makefile.am.
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+#
+#  Makefile.am
+#
+#  Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
+#
+#  Copyright (C) 2000 - 2001 Pekka Riikonen
+#
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AMTAR = @AMTAR@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CXX = @CXX@
+DATADIRNAME = @DATADIRNAME@
+DEPDIR = @DEPDIR@
+EXEEXT = @EXEEXT@
+EXTRA_GNOME_CFLAGS = @EXTRA_GNOME_CFLAGS@
+EXTRA_GNOME_LIBS = @EXTRA_GNOME_LIBS@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOMEGNORBA_LIBS = @GNOMEGNORBA_LIBS@
+GNOMEUI_LIBS = @GNOMEUI_LIBS@
+GNOME_ACLOCAL_DIR = @GNOME_ACLOCAL_DIR@
+GNOME_APPLETS_LIBS = @GNOME_APPLETS_LIBS@
+GNOME_CAPPLET_LIBS = @GNOME_CAPPLET_LIBS@
+GNOME_CONFIG = @GNOME_CONFIG@
+GNOME_DOCKLETS_LIBS = @GNOME_DOCKLETS_LIBS@
+GNOME_INCLUDEDIR = @GNOME_INCLUDEDIR@
+GNOME_LIBDIR = @GNOME_LIBDIR@
+GNOME_LIBS = @GNOME_LIBS@
+GNORBA_CFLAGS = @GNORBA_CFLAGS@
+GNORBA_LIBS = @GNORBA_LIBS@
+GTKXMHTML_LIBS = @GTKXMHTML_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIBICONV = @LIBICONV@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+OBJEXT = @OBJEXT@
+ORBIT_CFLAGS = @ORBIT_CFLAGS@
+ORBIT_CONFIG = @ORBIT_CONFIG@
+ORBIT_IDL = @ORBIT_IDL@
+ORBIT_LIBS = @ORBIT_LIBS@
+PACKAGE = @PACKAGE@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PTHREAD_LIB = @PTHREAD_LIB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XML_I18N_EXTRACT = @XML_I18N_EXTRACT@
+XML_I18N_MERGE = @XML_I18N_MERGE@
+XML_I18N_TOOLS_PERL = @XML_I18N_TOOLS_PERL@
+XML_I18N_UPDATE = @XML_I18N_UPDATE@
+XPM_LIBS = @XPM_LIBS@
+ZVT_LIBS = @ZVT_LIBS@
+am__include = @am__include@
+am__quote = @am__quote@
+cflags_set = @cflags_set@
+cxxflags_set = @cxxflags_set@
+install_sh = @install_sh@
+
+bin_PROGRAMS = silcer
+silcer_SOURCES = silcer.cc             \
+               silcerapp.cc            \
+               silcerbasewin.cc        \
+               silcerchatview.cc       \
+               xtext.c                 \
+               gtkurl.c                \
+               gtkspell.c              \
+               SilcerMainDlg.cc
+
+
+silcer_LDADD = @EXTRA_GNOME_LIBS@ -lxml \
+       -L/home/priikone/silc/lib -lsilcclient -lsilc
+
+silcer_LDFLAGS = 
+
+silc_top_srcdir = /home/priikone/silc
+
+INCLUDES = @EXTRA_GNOME_CFLAGS@ -DENABLE_NLS \
+       -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
+       -DDATADIR=\"$(datadir)\" \
+       -I$(top_srcdir)/intl \
+       -I$(silc_top_srcdir)/lib/silccore \
+       -I$(silc_top_srcdir)/lib/silccrypt \
+        -I$(silc_top_srcdir)/lib/silcmath \
+        -I$(silc_top_srcdir)/lib/silcmath/mpi \
+       -I$(silc_top_srcdir)/lib/silcske \
+       -I$(silc_top_srcdir)/lib/silcsim \
+       -I$(silc_top_srcdir)/lib/silcutil \
+       -I$(silc_top_srcdir)/lib/silcsftp \
+       -I$(silc_top_srcdir)/lib/silcclient \
+       -I$(silc_top_srcdir)/lib/contrib \
+        -I$(silc_top_srcdir)/includes \
+        -I$(silc_top_srcdir)/doc \
+       -I$(silc_top_srcdir)/lib/trq
+
+
+EXTRA_DIST = 
+subdir = src
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+bin_PROGRAMS = silcer$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS)
+
+am_silcer_OBJECTS = silcer.$(OBJEXT) silcerapp.$(OBJEXT) \
+       silcerbasewin.$(OBJEXT) silcerchatview.$(OBJEXT) \
+       xtext.$(OBJEXT) gtkurl.$(OBJEXT) gtkspell.$(OBJEXT) \
+       SilcerMainDlg.$(OBJEXT)
+silcer_OBJECTS = $(am_silcer_OBJECTS)
+silcer_DEPENDENCIES =
+
+DEFS = @DEFS@
+DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/SilcerMainDlg.Po $(DEPDIR)/gtkspell.Po \
+@AMDEP_TRUE@   $(DEPDIR)/gtkurl.Po $(DEPDIR)/silcer.Po \
+@AMDEP_TRUE@   $(DEPDIR)/silcerapp.Po $(DEPDIR)/silcerbasewin.Po \
+@AMDEP_TRUE@   $(DEPDIR)/silcerchatview.Po $(DEPDIR)/xtext.Po
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CFLAGS = @CFLAGS@
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+       -o $@
+CXXFLAGS = @CXXFLAGS@
+DIST_SOURCES = $(silcer_SOURCES)
+DIST_COMMON = Makefile.am Makefile.in
+SOURCES = $(silcer_SOURCES)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .o .obj
+$(srcdir)/Makefile.in:  Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  src/Makefile
+Makefile:  $(srcdir)/Makefile.in  $(top_builddir)/config.status
+       cd $(top_builddir) && \
+         CONFIG_HEADERS= CONFIG_LINKS= \
+         CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+         if test -f $$p \
+         ; then \
+           f=`echo $$p1|sed '$(transform);s/$$/$(EXEEXT)/'`; \
+          echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$f"; \
+          $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$f; \
+         else :; fi; \
+       done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         f=`echo $$p|sed 's/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+         echo " rm -f $(DESTDIR)$(bindir)/$$f"; \
+         rm -f $(DESTDIR)$(bindir)/$$f; \
+       done
+
+clean-binPROGRAMS:
+       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+silcer$(EXEEXT): $(silcer_OBJECTS) $(silcer_DEPENDENCIES) 
+       @rm -f silcer$(EXEEXT)
+       $(CXXLINK) $(silcer_LDFLAGS) $(silcer_OBJECTS) $(silcer_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT) core *.core
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/SilcerMainDlg.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/gtkspell.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/gtkurl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/silcer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/silcerapp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/silcerbasewin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/silcerchatview.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/xtext.Po@am__quote@
+
+distclean-depend:
+       -rm -rf $(DEPDIR)
+
+.c.o:
+@AMDEP_TRUE@   source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@   depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@   $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+       $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$<
+
+.c.obj:
+@AMDEP_TRUE@   source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@   depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@   $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+       $(COMPILE) -c `cygpath -w $<`
+CCDEPMODE = @CCDEPMODE@
+
+.cc.o:
+@AMDEP_TRUE@   source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@   depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@   $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+       $(CXXCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$<
+
+.cc.obj:
+@AMDEP_TRUE@   source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@   depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@   $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+       $(CXXCOMPILE) -c -o $@ `cygpath -w $<`
+CXXDEPMODE = @CXXDEPMODE@
+uninstall-info-am:
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+         || etags $(ETAGS_ARGS) $$tags  $$unique $(LISP)
+
+GTAGS:
+       here=`CDPATH=: && cd $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
+
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+       @for file in $(DISTFILES); do \
+         if test -f $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           $(mkinstalldirs) "$(distdir)/$$dir"; \
+         fi; \
+         if test -d $$d/$$file; then \
+           cp -pR $$d/$$file $(distdir) \
+           || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+
+installdirs:
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
+
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-compile distclean-depend \
+       distclean-generic distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+.PHONY: GTAGS all all-am check check-am clean clean-binPROGRAMS \
+       clean-generic distclean distclean-compile distclean-depend \
+       distclean-generic distclean-tags distdir dvi dvi-am info \
+       info-am install install-am install-binPROGRAMS install-data \
+       install-data-am install-exec install-exec-am install-info \
+       install-info-am install-man install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic tags uninstall uninstall-am \
+       uninstall-binPROGRAMS uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/apps/silcer/src/SilcerMainDlg.cc b/apps/silcer/src/SilcerMainDlg.cc
new file mode 100644 (file)
index 0000000..7cc91c3
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+
+  SilcerMainDlg.cc 
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2001 Pekka Riikonen
+
+  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; version 2 of the License.
+
+  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.
+
+*/
+
+#include "silcerapp.hh"
+#include "silcerchatview.hh"
+#include "SilcerMainDlg.hh"
+#include "gtkspell.h"
+
+#include <libgnomeui/gnome-window-icon.h>   
+#include <libgnome/gnome-help.h>
+#include <gtk--/style.h>
+#include <gnome--/href.h>
+#include <gtk--/text.h>
+#include <gtk--/toolbar.h>
+#include <gtk--/notebook.h>
+
+static char *parse_command(const char *buffer)
+{
+  char *ret;
+  char *cp = (char *)buffer;
+  int len;
+
+  len = strcspn((const char *)cp, " ");
+  ret = silc_to_upper(cp + 1);
+  ret[len - 1] = 0;
+  return ret;
+}
+
+SilcerMainDlg::SilcerMainDlg(void) : SilcerBaseDialog("SilcerMainDlg")
+{
+  _thisWindow->realize();
+
+  // Get intput box and set it for input
+  _InputBox = getWidget<Gtk::Text>("SilcerMainDlgInputBox");
+  _InputBox->key_press_event.connect(slot(this,
+                                         &SilcerMainDlg::InputBoxKeyPress));
+  _Completer = g_completion_new(NULL);
+
+  // Get output box and create new chat view box
+  _OutputBox = getWidget<Gtk::HBox>("SilcerMainDlgOutputBox");
+  _ChatView = new SilcerChatView(_thisWindow, _OutputBox, false);
+
+  // Show only icons on toolbar
+  getWidget<Gtk::Toolbar>("SilcerMainDlgToolbar")->
+    set_style(GTK_TOOLBAR_ICONS);
+
+  // Hide tabs, since they are not used currently!
+  getWidget<Gtk::Notebook>("SilcerMainDlgTab")->set_show_tabs(false);
+
+  _thisWindow->show();
+}
+
+SilcerMainDlg::~SilcerMainDlg(void)
+{
+
+}
+
+void SilcerMainDlg::print(const string message)
+{
+  _ChatView->render(message, "", "", BLUE);
+}
+
+void SilcerMainDlg::print(const string message, const string nickname)
+{
+  _ChatView->render(message, nickname, "", BLUE2);
+}
+
+gint SilcerMainDlg::InputBoxKeyPress(GdkEventKey *key)
+{
+  string msg;
+
+  switch (key->keyval) {
+  case GDK_space:
+    if (gtkspell_running())
+      gtkspell_check_all(_InputBox->gtkobj());
+    break;
+
+  case GDK_Return:
+  case GDK_KP_Enter:
+    if (key->state & GDK_SHIFT_MASK) {
+      key->state ^= GDK_SHIFT_MASK;
+      return 0;
+    }
+
+    // Parse message to see whether it is command
+    msg = _InputBox->get_chars(0, -1);
+    if (msg.empty()) {
+      _InputBox->delete_text(0, -1);
+      gtk_signal_emit_stop_by_name(GTK_OBJECT(_InputBox->gtkobj()), 
+                                  "key_press_event");
+      break;
+    }
+
+    if (msg.at(0) == '/') {
+      // Command
+      SilcClientCommand *cmd;
+      SilcClientCommandContext ctx;
+      char *tmpcmd;
+      uint32 argc = 0;
+      unsigned char **argv;
+      uint32 *argv_lens, *argv_types;
+
+      // Parse arguments
+      tmpcmd = parse_command(msg.c_str());
+      cmd = silc_client_command_find((const char *)tmpcmd);
+      silc_free(tmpcmd);
+      if (cmd == NULL)
+       break;
+
+      silc_parse_command_line((unsigned char *)msg.c_str(), &argv, &argv_lens,
+                             &argv_types, &argc, cmd->max_args);
+
+      ctx = silc_client_command_alloc();
+      ctx->client = silc_client;
+      ctx->conn = silc_client_conn;
+      ctx->command = cmd;
+      ctx->argc = argc;
+      ctx->argv = argv;
+      ctx->argv_lens = argv_lens;
+      ctx->argv_types = argv_types;
+      
+      // Execute the command
+      (*cmd->cb)(ctx, NULL);
+    } else {
+      // Channel message
+      if (silc_client_conn->current_channel) {
+       print(msg);
+       silc_client_send_channel_message(silc_client, 
+                                        silc_client_conn,
+                                        silc_client_conn->current_channel, 
+                                        NULL,
+                                        0, (unsigned char *)msg.c_str(), 
+                                        msg.length(), TRUE);
+      }
+    }
+
+    _InputBox->delete_text(0, -1);
+    gtk_signal_emit_stop_by_name(GTK_OBJECT(_InputBox->gtkobj()), 
+                                "key_press_event");
+    break;
+
+  case GDK_Tab:
+    {
+      // Word completion
+      msg = _InputBox->get_chars(0, -1);
+
+      if (!msg.empty()) {
+       string lastword;
+
+       // Search for the last whitespace
+       string::size_type n = msg.find_last_of(" ");
+       if (n != string::npos)
+         lastword = msg.substr(n+1);
+       else
+         lastword = msg;
+       
+       // Try and autocomplete
+       gchar *prefix;
+       g_completion_complete(_Completer, (char*)lastword.c_str(), &prefix);
+       if (prefix != NULL){
+         // Replace the last word in the message and update
+         if (n != string::npos)
+           msg.replace(msg.find_last_of(" ")+1, msg.length(), prefix);
+         else
+           msg = string(prefix);
+         g_free(prefix);
+         
+         // Update text
+         _InputBox->delete_text(0, -1);
+         _InputBox->insert(msg);
+       }
+
+       gtk_signal_emit_stop_by_name(GTK_OBJECT(_InputBox->gtkobj()), 
+                                    "key_press_event");
+       return 1;
+      }
+    }
+    break;
+
+  default:
+    break;
+  }
+
+  return 0;
+}
diff --git a/apps/silcer/src/SilcerMainDlg.hh b/apps/silcer/src/SilcerMainDlg.hh
new file mode 100644 (file)
index 0000000..9005706
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+
+  SilcerMainDlg.hh
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2001 Pekka Riikonen
+
+  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; version 2 of the License.
+
+  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.
+
+*/
+
+#ifndef SILCERMAINDLG_HH
+#define SILCERMAINDLG_HH
+
+#include "silcerbasewin.hh"
+#include "silcerchatview.hh"
+#include <gnome--/color-picker.h>
+#include <gtk--/spinbutton.h>
+#include <gtk--/notebook.h>
+#include <gtk--/text.h>
+
+class SilcerMainDlg : public SilcerBaseDialog
+{
+public:
+  SilcerMainDlg(void);
+  ~SilcerMainDlg(void);
+
+  // Print message to output box
+  void print(const string message);
+  void print(const string message, const string nickname);
+
+protected:
+  // Events
+  gint InputBoxKeyPress(GdkEventKey *key);
+
+private:
+  SilcerChatView *_ChatView;
+  GCompletion *_Completer;
+  Gtk::HBox *_OutputBox;
+  Gtk::Text *_InputBox;
+  Gtk::Notebook *_Tab;
+};
+
+#endif /* SILCERMAINDLG */
diff --git a/apps/silcer/src/gtkspell.c b/apps/silcer/src/gtkspell.c
new file mode 100644 (file)
index 0000000..6555e74
--- /dev/null
@@ -0,0 +1,639 @@
+/* gtkspell - a spell-checking addon for GtkText
+ * Copyright (c) 2000 Evan Martin.
+ * vim: ts=4 sw=4
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ * 
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ */
+
+#include <gtk/gtk.h>
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <unistd.h>   
+#include <stdio.h>    
+#include <signal.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#define GTKSPELL_USE_GNOME
+
+#ifdef GTKSPELL_USE_GNOME
+#include <gnome.h>
+#endif /* GTKSPELL_USE_GNOME */
+
+#include "gtkspell.h"
+
+/* TODO:
+ * handle dictionary changes
+ * asynchronous lookups
+ */
+
+/* size of the text buffer used in various word-processing routines. */
+#define BUFSIZE 1024
+/* number of suggestions to display on each menu. */
+#define MENUCOUNT 10
+#define BUGEMAIL "gtkspell-devel@lists.sourceforge.net"
+
+/* because we keep only one copy of the spell program running, 
+ * all ispell-related variables can be static.  
+ */
+static pid_t spell_pid = -1;
+static int fd_write[2] = {0}, fd_read[2] = {0};
+static int signal_set_up = 0;
+
+/* FIXME? */
+static GdkColor highlight = { 0, 255*256, 0, 0 };
+
+static void entry_insert_cb(GtkText *gtktext, 
+               gchar *newtext, guint len, guint *ppos, gpointer d);
+static void set_up_signal();
+
+int gtkspell_running() {
+       return (spell_pid > 0);
+}
+
+static void error_print(const char *fmt, ...) {
+       va_list ap;
+       va_start(ap, fmt);
+       fprintf(stderr, "gtkspell: ");
+       vfprintf(stderr, fmt, ap);
+       va_end(ap);
+}
+
+/* functions to interface with pipe */
+static void writetext(char *text) {
+       write(fd_write[1], text, strlen(text));
+}
+static int readpipe(char *buf, int bufsize) {
+       int len;
+       len = read(fd_read[0], buf, bufsize-1);
+       if (len < 0) {
+               error_print("read: %s\n", strerror(errno));
+               return -1;
+       } else if (len == 0) {
+               error_print("pipe closed.\n");
+               return -1;
+       } else if (len == bufsize-1) {
+               error_print("buffer overflowed?\n");
+       }
+
+       buf[len] = 0;
+       return len;
+}
+static int readline(char *buf) {
+       return readpipe(buf, BUFSIZE);
+}
+
+static int readresponse(char *buf) {
+       int len;
+       len = readpipe(buf, BUFSIZE);
+
+       /* all ispell responses of any reasonable length should end in \n\n.
+        * depending on the speed of the spell checker, this may require more
+        * reading. */
+       if (len >= 2 && (buf[len-1] != '\n' || buf[len-2] != '\n')) {
+               len += readpipe(buf+len, BUFSIZE-len);
+       }
+
+       /* now we can remove all of the the trailing newlines. */
+       while (len > 0 && buf[len-1] == '\n')
+               buf[--len] = 0;
+
+       return len;
+}
+
+
+void gtkspell_stop() {
+       if (gtkspell_running()) {
+               kill(spell_pid, SIGHUP); 
+               spell_pid = 0;
+               close(fd_read[0]);
+               close(fd_write[1]);
+       }
+}
+
+int gtkspell_start(char *path, char * args[]) {
+       int fd_error[2];
+       char buf[BUFSIZE];
+
+       if (gtkspell_running()) {
+               error_print("gtkspell_start called while already running.\n");
+               gtkspell_stop();
+       }
+
+       if (!signal_set_up) {
+               set_up_signal();
+               signal_set_up = 1;
+       }
+
+       pipe(fd_write);
+       pipe(fd_read);
+       pipe(fd_error);
+
+       spell_pid = fork();
+       if (spell_pid < 0) {
+               error_print("fork: %s\n", strerror(errno));
+               return -1;
+       } else if (spell_pid == 0) {
+               dup2(fd_write[0], 0);
+               close(fd_write[0]);
+               close(fd_write[1]);
+
+               dup2(fd_read[1], 1);
+               close(fd_read[0]);
+               close(fd_read[1]);
+
+               dup2(fd_error[1], 2);
+               close(fd_error[0]);
+               close(fd_error[1]);
+
+               if (path == NULL) {
+                       if (execvp(args[0], args) < 0) 
+                               error_print("execvp('%s'): %s\n", args[0], strerror(errno));
+               } else {
+                       if (execv(path, args) < 0) 
+                               error_print("execv('%s'): %s\n", path, strerror(errno));
+               }
+               /* if we get here, we failed.
+                * send some text on the pipe to indicate status.
+                */
+               write(0, "!", 1); /* stdout _is_ the pipe. */
+
+               _exit(0);
+       } else {
+               /* there are at least two ways to fail:
+                * - the exec() can fail
+                * - the exec() can succeed, but the program can dump the help screen
+                * we must check for both.
+                */
+               fd_set rfds;
+               struct timeval tv;
+               
+               close(fd_write[0]);
+               close(fd_read[1]);
+
+               FD_ZERO(&rfds);
+               FD_SET(fd_error[0], &rfds);
+               FD_SET(fd_read[0], &rfds);
+               tv.tv_sec = 2;
+               tv.tv_usec = 0;
+
+               if (select(MAX(fd_error[0], fd_read[0])+1, 
+                                       &rfds, NULL, NULL, &tv) < 0) {
+                       /* FIXME: is this needed? */
+                       error_print("Timed out waiting for spell command.\n");
+                       gtkspell_stop();
+                       return -1;
+               }
+
+               if (FD_ISSET(fd_error[0], &rfds)) { /* stderr readable? */
+                       error_print("Spell command printed on stderr -- probably failed.\n");
+                       gtkspell_stop();
+                       return -1;
+               }
+
+               /* we're done with stderr, now. */
+               close(fd_error[0]);
+               close(fd_error[1]);
+
+               /* otherwise, fd_read[0] is set. */
+               readline(buf);
+
+               /* ispell should print something like this:
+                * @(#) International Ispell Version 3.1.20 10/10/95
+                * if it doesn't, it's an error. */
+               if (buf[0] != '@') {
+                       gtkspell_stop();
+                       return -1;
+               }
+       }
+
+       /* put ispell into terse mode.  
+        * this makes it not respond on correctly spelled words. */
+       sprintf(buf, "!\n");
+       writetext(buf);
+       return 0;
+}
+
+static GList* misspelled_suggest(char *word) {
+       char buf[BUFSIZE];
+       char *newword;
+       GList *l = NULL;
+       int count;
+
+       sprintf(buf, "^%s\n", word); /* guard against ispell control chars */
+       writetext(buf);
+       readresponse(buf);
+
+       switch (buf[0]) { /* first char is ispell command. */
+               case 0: /* no response: word is ok. */
+                       return NULL;
+               case '&': /* misspelled, with suggestions */
+                       /* & <orig> <count> <ofs>: <miss>, <miss>, <guess>, ... */
+                       strtok(buf, " "); /* & */
+                       newword = strtok(NULL, " "); /* orig */
+                       l = g_list_append(l, g_strdup(newword));
+                       newword = strtok(NULL, " "); /* count */
+                       count = atoi(newword);
+                       strtok(NULL, " "); /* ofs: */
+
+                       while ((newword = strtok(NULL, ",")) != NULL) {
+                               int len = strlen(newword);
+                               if (newword[len-1] == ' ' || newword[len-1] == '\n') 
+                                       newword[len-1] = 0;
+                               if (count == 0) {
+                                       g_list_append(l, NULL); /* signal the "suggestions" */
+                               }
+                               /* add it to the list, skipping the initial space. */
+                               l = g_list_append(l, 
+                                               g_strdup(newword[0] == ' ' ? newword+1 : newword));
+
+                               count--;
+                       }
+                       return l;
+
+               case '#': /* misspelled, no suggestions */
+               case '?': /* ispell is guessing. */
+                       /* # <orig> <ofs> */
+                       strtok(buf, " "); /* & */
+                       newword = strtok(NULL, " "); /* orig */
+                       l = g_list_append(l, g_strdup(newword));
+                       return l;
+               default:
+                       error_print("Unsupported spell command '%c'.\n"
+                                       "This is a bug; mail " BUGEMAIL " about it.\n", buf[0]);
+                       error_print("Input [%s]\nOutput [%s]\n", word, buf);
+
+       }
+       return NULL;
+}
+
+static int misspelled_test(char *word) {
+       char buf[BUFSIZE];
+       sprintf(buf, "^%s\n", word); /* guard against ispell control chars */
+       writetext(buf);
+       readresponse(buf);
+
+       if (buf[0] == 0) {
+               return 0;
+       } else if (buf[0] == '&' || buf[0] == '#' || buf[0] == '?') {
+               return 1;
+       }
+       
+       error_print("Unsupported spell command '%c'.\n"
+                       "This is a bug; mail " BUGEMAIL " about it.\n", buf[0]);
+       error_print("Input [%s]\nOutput [%s]\n", word, buf);
+       return -1;
+}
+
+static gboolean iswordsep(char c) {
+       return !isalpha(c) && c != '\'';
+}
+
+static gboolean get_word_from_pos(GtkText* gtktext, int pos, char* buf, 
+               int *pstart, int *pend) {
+       gint start, end;
+
+       if (iswordsep(GTK_TEXT_INDEX(gtktext, pos))) return FALSE;
+
+       for (start = pos; start >= 0; --start) {
+               if (iswordsep(GTK_TEXT_INDEX(gtktext, start))) break;
+       }
+       start++;
+
+       for (end = pos; end <= gtk_text_get_length(gtktext); end++) {
+               if (iswordsep(GTK_TEXT_INDEX(gtktext, end))) break;
+       }
+
+       if (buf) {
+               for (pos = start; pos < end; pos++) 
+                       buf[pos-start] = GTK_TEXT_INDEX(gtktext, pos);
+               buf[pos-start] = 0;
+       }
+
+       if (pstart) *pstart = start;
+       if (pend) *pend = end;
+
+       return TRUE;
+}
+
+static gboolean get_curword(GtkText* gtktext, char* buf, 
+               int *pstart, int *pend) {
+       int pos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
+       return get_word_from_pos(gtktext, pos, buf, pstart, pend);
+}
+
+static void change_color(GtkText *gtktext, 
+               int start, int end, GdkColor *color) {
+       char *newtext = gtk_editable_get_chars(GTK_EDITABLE(gtktext), start, end);
+       gtk_text_freeze(gtktext);
+       gtk_signal_handler_block_by_func(GTK_OBJECT(gtktext), 
+                       GTK_SIGNAL_FUNC(entry_insert_cb), NULL);
+       
+       gtk_text_set_point(gtktext, start);
+       gtk_text_forward_delete(gtktext, end-start);
+
+       if (newtext && end-start > 0)
+               gtk_text_insert(gtktext, NULL, color, NULL, newtext, end-start);
+
+       gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtktext), 
+                       GTK_SIGNAL_FUNC(entry_insert_cb), NULL);
+       gtk_text_thaw(gtktext);
+       g_free(newtext);
+}
+
+static gboolean check_at(GtkText *gtktext, int from_pos) {
+       int start, end;
+       char buf[BUFSIZE];
+
+       if (!get_word_from_pos(gtktext, from_pos, buf, &start, &end)) {
+               return FALSE;
+       }
+
+       if (misspelled_test(buf)) {
+               if (highlight.pixel == 0) {
+                       /* add an entry for the highlight in the color map. */
+                       GdkColormap *gc = gtk_widget_get_colormap(GTK_WIDGET(gtktext));
+                       gdk_colormap_alloc_color(gc, &highlight, FALSE, TRUE);;
+               }
+               change_color(gtktext, start, end, &highlight);
+               return TRUE;
+       } else { 
+               change_color(gtktext, start, end, 
+                               &(GTK_WIDGET(gtktext)->style->fg[0]));
+               return FALSE;
+       }
+}
+
+void gtkspell_check_all(GtkText *gtktext) {
+       guint origpos;
+       guint pos = 0;
+       guint len;
+       float adj_value;
+       
+       if (!gtkspell_running()) return;
+       
+       len = gtk_text_get_length(gtktext);
+
+       adj_value = gtktext->vadj->value;
+       gtk_text_freeze(gtktext);
+       origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
+       while (pos < len) {
+               while (pos < len && iswordsep(GTK_TEXT_INDEX(gtktext, pos)))
+                       pos++;
+               while (pos < len && !iswordsep(GTK_TEXT_INDEX(gtktext, pos)))
+                       pos++;
+               if (pos > 0)
+                       check_at(gtktext, pos-1);
+       }
+       gtk_text_thaw(gtktext);
+       gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos);
+}
+
+static void entry_insert_cb(GtkText *gtktext, 
+               gchar *newtext, guint len, guint *ppos, gpointer d) {
+       int origpos;
+
+       if (!gtkspell_running()) return;
+
+       gtk_signal_handler_block_by_func(GTK_OBJECT(gtktext),
+                                                                        GTK_SIGNAL_FUNC(entry_insert_cb),
+                                                                        NULL);
+       gtk_text_insert(GTK_TEXT(gtktext), NULL,
+                       &(GTK_WIDGET(gtktext)->style->fg[0]), NULL, newtext, len);
+       gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtktext),
+                                                                        GTK_SIGNAL_FUNC(entry_insert_cb),
+                                                                        NULL);
+       gtk_signal_emit_stop_by_name(GTK_OBJECT(gtktext), "insert-text");
+       *ppos += len;
+
+       origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
+
+       if (iswordsep(newtext[0])) {
+               /* did we just end a word? */
+               if (*ppos >= 2) check_at(gtktext, *ppos-2);
+
+               /* did we just split a word? */
+               if (*ppos < gtk_text_get_length(gtktext))
+                       check_at(gtktext, *ppos+1);
+       } else {
+               /* check as they type, *except* if they're typing at the end (the most
+                * common case.
+                */
+               if (*ppos < gtk_text_get_length(gtktext) && 
+                               !iswordsep(GTK_TEXT_INDEX(gtktext, *ppos)))
+                       check_at(gtktext, *ppos-1);
+       }
+
+       gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos);
+       gtk_editable_select_region(GTK_EDITABLE(gtktext), origpos, origpos);
+}
+
+static void entry_delete_cb(GtkText *gtktext,
+               gint start, gint end, gpointer d) {
+       int origpos;
+
+       if (!gtkspell_running()) return;
+
+       origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
+       check_at(gtktext, start-1);
+       gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos);
+       gtk_editable_select_region(GTK_EDITABLE(gtktext), origpos, origpos);
+       /* this is to *UNDO* the selection, in case they were holding shift
+        * while hitting backspace. */
+}
+
+static void replace_word(GtkWidget *w, gpointer d) {
+       int start, end;
+       char *newword;
+       char buf[BUFSIZE];
+
+       /* we don't save their position, 
+        * because the cursor is moved by the click. */
+
+       gtk_text_freeze(GTK_TEXT(d));
+
+       gtk_label_get(GTK_LABEL(GTK_BIN(w)->child), &newword);
+       get_curword(GTK_TEXT(d), buf, &start, &end);
+
+       gtk_text_set_point(GTK_TEXT(d), end);
+       gtk_text_backward_delete(GTK_TEXT(d), end-start);
+       gtk_text_insert(GTK_TEXT(d), NULL, NULL, NULL, newword, strlen(newword));
+
+       gtk_text_thaw(GTK_TEXT(d));
+}
+
+static GtkMenu *make_menu(GList *l, GtkText *gtktext) {
+       GtkWidget *menu, *item;
+       char *caption;
+       menu = gtk_menu_new(); {
+               caption = g_strdup_printf("Not in dictionary: %s", (char*)l->data);
+               item = gtk_menu_item_new_with_label(caption);
+               /* I'd like to make it so this item is never selectable, like
+                * the menu titles in the GNOME panel... unfortunately, the GNOME
+                * panel creates their own custom widget to do this! */
+               gtk_widget_show(item);
+               gtk_menu_append(GTK_MENU(menu), item);
+
+               item = gtk_menu_item_new();
+               gtk_widget_show(item);
+               gtk_menu_append(GTK_MENU(menu), item);
+
+               l = l->next;
+               if (l == NULL) {
+                       item = gtk_menu_item_new_with_label("(no suggestions)");
+                       gtk_widget_show(item);
+                       gtk_menu_append(GTK_MENU(menu), item);
+               } else {
+                       GtkWidget *curmenu = menu;
+                       int count = 0;
+                       do {
+                               if (l->data == NULL && l->next != NULL) {
+                                       count = 0;
+                                       curmenu = gtk_menu_new();
+                                       item = gtk_menu_item_new_with_label("Other Possibilities...");
+                                       gtk_widget_show(item);
+                                       gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), curmenu);
+                                       gtk_menu_append(GTK_MENU(curmenu), item);
+                                       l = l->next;
+                               } else if (count > MENUCOUNT) {
+                                       count -= MENUCOUNT;
+                                       item = gtk_menu_item_new_with_label("More...");
+                                       gtk_widget_show(item);
+                                       gtk_menu_append(GTK_MENU(curmenu), item);
+                                       curmenu = gtk_menu_new();
+                                       gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), curmenu);
+                               }
+                               item = gtk_menu_item_new_with_label((char*)l->data);
+                               gtk_signal_connect(GTK_OBJECT(item), "activate",
+                                               GTK_SIGNAL_FUNC(replace_word), gtktext);
+                               gtk_widget_show(item);
+                               gtk_menu_append(GTK_MENU(curmenu), item);
+                               count++;
+                       } while ((l = l->next) != NULL);
+               }
+       }
+       return GTK_MENU(menu);
+}
+
+static void popup_menu(GtkText *gtktext, GdkEventButton *eb) {
+       char buf[BUFSIZE];
+       GList *list, *l;
+
+       get_curword(gtktext, buf, NULL, NULL);
+
+       list = misspelled_suggest(buf);
+       if (list != NULL) {
+               gtk_menu_popup(make_menu(list, gtktext), NULL, NULL, NULL, NULL,
+                               eb->button, eb->time);
+               for (l = list; l != NULL; l = l->next)
+                       g_free(l->data);
+               g_list_free(list);
+       }
+}
+
+/* ok, this is pretty wacky:
+ * we need to let the right-mouse-click go through, so it moves the cursor, 
+ * but we *can't* let it go through, because GtkText interprets rightclicks as
+ * weird selection modifiers.
+ *
+ * so what do we do?  forge rightclicks as leftclicks, then popup the menu. 
+ * HACK HACK HACK. 
+ */
+static gint button_press_intercept_cb(GtkText *gtktext, GdkEvent *e, gpointer d) {
+       GdkEventButton *eb;
+       gboolean retval;
+
+       if (!gtkspell_running()) return FALSE;
+
+       if (e->type != GDK_BUTTON_PRESS) return FALSE;
+       eb = (GdkEventButton*) e;
+
+       if (eb->button != 3) return FALSE;
+
+       /* forge the leftclick */
+       eb->button = 1;
+
+       gtk_signal_handler_block_by_func(GTK_OBJECT(gtktext), 
+                       GTK_SIGNAL_FUNC(button_press_intercept_cb), d);
+       gtk_signal_emit_by_name(GTK_OBJECT(gtktext), "button-press-event",
+                       e, &retval);
+       gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtktext), 
+                       GTK_SIGNAL_FUNC(button_press_intercept_cb), d);
+       gtk_signal_emit_stop_by_name(GTK_OBJECT(gtktext), "button-press-event");
+
+       /* now do the menu wackiness */
+       popup_menu(gtktext, eb);
+       return TRUE;
+}
+
+void gtkspell_uncheck_all(GtkText *gtktext) {
+       int origpos;
+       char *text;
+       float adj_value;
+
+       adj_value = gtktext->vadj->value;
+       gtk_text_freeze(gtktext);
+       origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
+       text = gtk_editable_get_chars(GTK_EDITABLE(gtktext), 0, -1);
+       gtk_text_set_point(gtktext, 0);
+       gtk_text_forward_delete(gtktext, gtk_text_get_length(gtktext));
+       gtk_text_insert(gtktext, NULL, NULL, NULL, text, strlen(text));
+       gtk_text_thaw(gtktext);
+
+       gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos);
+       gtk_adjustment_set_value(gtktext->vadj, adj_value);
+}
+
+void gtkspell_attach(GtkText *gtktext) {
+       gtk_signal_connect(GTK_OBJECT(gtktext), "insert-text",
+               GTK_SIGNAL_FUNC(entry_insert_cb), NULL);
+       gtk_signal_connect_after(GTK_OBJECT(gtktext), "delete-text",
+               GTK_SIGNAL_FUNC(entry_delete_cb), NULL);
+       gtk_signal_connect(GTK_OBJECT(gtktext), "button-press-event",
+                       GTK_SIGNAL_FUNC(button_press_intercept_cb), NULL);
+}
+
+void gtkspell_detach(GtkText *gtktext) {
+       gtk_signal_disconnect_by_func(GTK_OBJECT(gtktext),
+               GTK_SIGNAL_FUNC(entry_insert_cb), NULL);
+       gtk_signal_disconnect_by_func(GTK_OBJECT(gtktext),
+               GTK_SIGNAL_FUNC(entry_delete_cb), NULL);
+       gtk_signal_disconnect_by_func(GTK_OBJECT(gtktext), 
+                       GTK_SIGNAL_FUNC(button_press_intercept_cb), NULL);
+
+       gtkspell_uncheck_all(gtktext);
+}
+
+static void sigchld(int param) {
+       if (gtkspell_running() &&
+               (waitpid(spell_pid, NULL, WNOHANG) == spell_pid)) {
+               spell_pid = 0;
+       } else {
+               /* a default SIGCHLD handler.
+                * what else to do here? */
+               waitpid(-1, NULL, WNOHANG);
+       }
+}
+
+static void set_up_signal() {
+       struct sigaction sigact;
+       memset(&sigact, 0, sizeof(struct sigaction));
+
+       sigact.sa_handler = sigchld;
+       sigaction(SIGCHLD, &sigact, NULL);
+}
diff --git a/apps/silcer/src/gtkspell.h b/apps/silcer/src/gtkspell.h
new file mode 100644 (file)
index 0000000..df099a7
--- /dev/null
@@ -0,0 +1,107 @@
+/* gtkspell - a spell-checking addon for GtkText
+ * Copyright (c) 2000 Evan Martin.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ * 
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ */
+
+#ifndef __gtkspell_h__
+#define __gtkspell_h__
+
+BEGIN_GNOME_DECLS
+
+/* PLEASE NOTE that this API is unstable and subject to change. */
+#define GTKSPELL_VERSION "0.3.2"
+
+extern int gtkspell_start(char *path, char *args[]);
+/* Spawns the spell checking program.
+ *
+ * Arguments:
+ *  - "path" should be the full path to the spell checking program, or NULL
+ *    if you want to search the PATH for args[0].
+ *  - "args" should be a array of arguments to the spell checking program.
+ *    The first element should be the name of the program.
+ *    You should give the argument to run the spell checking program in the
+ *    "embedded" mode.  for ispell, this is "-a".
+ *    The last element should be NULL.
+ * Return:
+ *  0 on success, and -1 on error.
+ *
+ * Example:
+ *  char *args[] = { "ispell", "-a", NULL };
+ *  if (gtkspell_start(NULL, args) < 0) {
+ *     fprintf(stderr, "Unable to start GtkSpell.\n");
+ *     return -1;
+ *  }
+ *
+ */
+
+
+extern void gtkspell_stop();
+/* Stop the spellchecking program.
+ * This kills the spell checker's process and frees memory.
+ */
+
+extern int gtkspell_running();
+/* Is gtkspell running?
+ *
+ * Return:
+ *     nonzero if it running
+ *     zero if is not running
+ *
+ * Example:
+ *  if (gtkspell_running())
+ *     printf("gtkspell is running.\n");
+ */
+
+extern void gtkspell_attach(GtkText *text);
+/* Attach GtkSpell to a GtkText Widget.
+ * This enables checking as you type and the popup menu.
+ *
+ * Arguments:
+ *  - "text" is the widget to which GtkSpell should attach.
+ *
+ * Example:
+ *  GtkWidget *text;
+ *  text = gtk_text_new(NULL, NULL); 
+ *  gtk_text_set_editable(GTK_TEXT(text), TRUE);
+ *  gtkspell_attach(GTK_TEXT(text));
+ */  
+
+void gtkspell_detach(GtkText *gtktext);
+/* Detach GtkSpell from a GtkText widget.
+ * 
+ * Arguments:
+ *  - "text" is the widget from which GtkSpell should detach.
+ * 
+ */ 
+
+void gtkspell_check_all(GtkText *gtktext);
+/* Check and highlight the misspelled words.
+ * Note that the popup menu will not work unless you gtkspell_attach().
+ *
+ * Arguments:
+ *  - "text" is the widget to check.
+ */
+
+void gtkspell_uncheck_all(GtkText *gtktext);
+/* Remove all of the highlighting from the widget.
+ *
+ * Arguments:
+ *  - "text" is the widget to check.
+ */
+
+END_GNOME_DECLS
+
+#endif /* __gtkspell_h__ */
diff --git a/apps/silcer/src/gtkurl.c b/apps/silcer/src/gtkurl.c
new file mode 100644 (file)
index 0000000..567c379
--- /dev/null
@@ -0,0 +1,587 @@
+/* GtkUrl - A addon for GtkText that enables colored and clickable URLs
+ * Copyright (C) 2001 Benedikt Roth <Benedikt.Roth@bratislav.de>  
+ *   Based on code from 
+ *   gtkspell - a spell-checking addon for GtkText
+ *   Copyright (c) 2000 Evan Martin.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ * 
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ */
+
+#define GTKURL_USE_GNOME
+
+#include <gtk/gtk.h>
+#ifdef GTKURL_USE_GNOME
+#include <gnome.h>
+#endif /* GTKURL_USE_GNOME */
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <unistd.h>
+
+#include "gtkurl.h"
+
+/* FIXME? */
+static GdkColor highlight = { 0, 0, 0, 255*256 };
+
+enum {
+  GTKURL_NO_URL,
+  GTKURL_URL,
+  GTKURL_HOST
+};
+
+
+static void entry_insert_cb(GtkText *gtktext, gchar *newtext, guint len, guint *ppos, gpointer d);
+static void entry_delete_cb(GtkText *gtktext, gint start, gint end, gpointer d);
+static gint button_press_intercept_cb(GtkText *gtktext, GdkEvent *e, gpointer d);
+
+static void popup_menu(GtkText *gtktext, GdkEventButton *eb);
+static GtkMenu *make_menu(gchar *url);
+
+static gboolean visit_url_gnome_cb( GtkWidget *widget, gpointer *data);
+static int my_poptParseArgvString(const char * s, int * argcPtr, char *** argvPtr);
+static gboolean visit_url_cmd_cb( GtkWidget *widget, gpointer *data);
+
+static gboolean check_at(GtkText *gtktext, gint from_pos);
+static gchar *get_word_from_pos(GtkText* gtktext, gint pos, gint *pstart, gint *pend);
+static gchar *get_curword(GtkText* gtktext, gint *pstart, gint *pend);
+
+static void change_color(GtkText *gtktext, gint start, gint end, GdkColor *color);
+
+static gboolean iswordsep(gchar c);
+static gint is_url(gchar* word);
+
+
+
+void gtkurl_attach(GtkText *gtktext)
+{
+   gtk_signal_connect(GTK_OBJECT(gtktext), "insert-text",
+                    GTK_SIGNAL_FUNC(entry_insert_cb), NULL);
+   gtk_signal_connect_after(GTK_OBJECT(gtktext), "delete-text",
+                           GTK_SIGNAL_FUNC(entry_delete_cb), NULL);
+   gtk_signal_connect(GTK_OBJECT(gtktext), "button-press-event",
+                     GTK_SIGNAL_FUNC(button_press_intercept_cb), NULL);
+}
+
+
+void gtkurl_detach(GtkText *gtktext)
+{
+  gtk_signal_disconnect_by_func(GTK_OBJECT(gtktext),
+                               GTK_SIGNAL_FUNC(entry_insert_cb), NULL);
+  gtk_signal_disconnect_by_func(GTK_OBJECT(gtktext),
+                               GTK_SIGNAL_FUNC(entry_delete_cb), NULL);
+  gtk_signal_disconnect_by_func(GTK_OBJECT(gtktext), 
+                               GTK_SIGNAL_FUNC(button_press_intercept_cb), NULL);
+  
+  gtkurl_uncheck_all(gtktext);
+}
+
+
+void gtkurl_check_all(GtkText *gtktext)
+{
+  guint origpos;
+  guint pos = 0;
+  guint len;
+  float adj_value;
+
+  len = gtk_text_get_length(gtktext);
+  
+  adj_value = gtktext->vadj->value;
+  gtk_text_freeze(gtktext);
+  origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
+
+  while (pos < len) 
+    { 
+      while (pos < len && iswordsep(GTK_TEXT_INDEX(gtktext, pos)))
+       pos++;
+      while (pos < len && !iswordsep(GTK_TEXT_INDEX(gtktext, pos)))
+       pos++;
+      if (pos > 0)
+       check_at(gtktext, pos-1);
+    }
+
+  gtk_text_thaw(gtktext);
+  gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos);
+}
+
+
+void gtkurl_uncheck_all(GtkText *gtktext)
+{
+  gint origpos;
+  gchar *text;
+  gfloat adj_value;
+
+  adj_value = gtktext->vadj->value;
+  gtk_text_freeze(gtktext);
+  origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
+  text = gtk_editable_get_chars(GTK_EDITABLE(gtktext), 0, -1);
+  gtk_text_set_point(gtktext, 0);
+  gtk_text_forward_delete(gtktext, gtk_text_get_length(gtktext));
+  gtk_text_insert(gtktext, NULL, NULL, NULL, text, strlen(text));
+  gtk_text_thaw(gtktext);
+
+  gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos);
+  gtk_adjustment_set_value(gtktext->vadj, adj_value);
+}
+
+
+static void entry_insert_cb(GtkText *gtktext, gchar *newtext, guint len, guint *ppos, gpointer d)
+{
+  gint origpos;
+
+  gtk_signal_handler_block_by_func(GTK_OBJECT(gtktext),
+                                  GTK_SIGNAL_FUNC(entry_insert_cb), 
+                                  NULL );
+  
+  gtk_text_insert(GTK_TEXT(gtktext), NULL,
+                 &(GTK_WIDGET(gtktext)->style->fg[0]), NULL, newtext, len);
+
+  gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtktext),
+                                    GTK_SIGNAL_FUNC(entry_insert_cb),
+                                    NULL);
+  
+  gtk_signal_emit_stop_by_name(GTK_OBJECT(gtktext), "insert-text");
+  *ppos += len;
+
+  origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
+
+  if (iswordsep(newtext[0])) 
+    {
+      /* did we just end a word? */
+      if (*ppos >= 2) check_at(gtktext, *ppos-2);
+      
+      /* did we just split a word? */
+      if (*ppos < gtk_text_get_length(gtktext))
+       check_at(gtktext, *ppos+1);
+    } 
+  else 
+    {
+      /* check as they type, *except* if they're typing at the end (the most
+       * common case.
+       */
+      if (*ppos < gtk_text_get_length(gtktext) && !iswordsep(GTK_TEXT_INDEX(gtktext, *ppos)))
+       check_at(gtktext, *ppos-1);
+    }
+
+  gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos);
+  gtk_editable_select_region(GTK_EDITABLE(gtktext), origpos, origpos);
+}
+
+
+static void entry_delete_cb(GtkText *gtktext, gint start, gint end, gpointer d)
+{
+  gint origpos;
+  
+  origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
+  check_at(gtktext, start-1);
+  gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos);
+  gtk_editable_select_region(GTK_EDITABLE(gtktext), origpos, origpos);
+  /* this is to *UNDO* the selection, in case they were holding shift
+   * while hitting backspace. */
+}
+
+
+/* ok, this is pretty wacky:
+ * we need to let the right-mouse-click go through, so it moves the cursor, 
+ * but we *can't* let it go through, because GtkText interprets rightclicks as
+ * weird selection modifiers.
+ *
+ * so what do we do?  forge rightclicks as leftclicks, then popup the menu. 
+ * HACK HACK HACK. 
+ */
+static gint button_press_intercept_cb(GtkText *gtktext, GdkEvent *e, gpointer d)
+{
+  GdkEventButton *eb;
+  gboolean retval;
+  
+  if (e->type != GDK_BUTTON_PRESS) return FALSE;
+  eb = (GdkEventButton*) e;
+
+  if (eb->button != 3)
+    return FALSE;
+
+  /* forge the leftclick */
+  eb->button = 1;
+
+  gtk_signal_handler_block_by_func(GTK_OBJECT(gtktext), 
+                                  GTK_SIGNAL_FUNC(button_press_intercept_cb), d);
+  gtk_signal_emit_by_name(GTK_OBJECT(gtktext), "button-press-event",
+                         e, &retval);
+  gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtktext), 
+                                    GTK_SIGNAL_FUNC(button_press_intercept_cb), d);
+  gtk_signal_emit_stop_by_name(GTK_OBJECT(gtktext), "button-press-event");
+
+  /* now do the menu wackiness */
+  popup_menu(gtktext, eb);
+  return TRUE;
+}
+
+
+static void popup_menu(GtkText *gtktext, GdkEventButton *eb)
+{
+  gchar *buf;
+  
+  buf = get_curword(gtktext, NULL, NULL);
+  
+  gtk_menu_popup(make_menu(buf), NULL, NULL, NULL, NULL,
+                eb->button, eb->time);
+}
+
+
+static GtkMenu *make_menu(gchar *url)
+{
+  GtkWidget *menu, *item;
+  gchar *caption;
+  gchar *s = "http://";
+  gchar *cmd;
+
+  switch( is_url(url) )
+    {
+    case GTKURL_URL:
+      url = g_strdup_printf("%s", url);
+      break;
+    case GTKURL_HOST: 
+      url = g_strdup_printf("%s%s", s, url);
+      break;
+    }    
+
+  menu = gtk_menu_new(); 
+  
+  caption = g_strdup_printf("%s", url);
+  item = gtk_menu_item_new_with_label(caption);
+  g_free(caption);
+  gtk_widget_set_sensitive( GTK_WIDGET(item), FALSE);
+  /* I'd like to make it so this item is never selectable, like
+   * the menu titles in the GNOME panel... unfortunately, the GNOME
+   * panel creates their own custom widget to do this! */
+  gtk_widget_show(item);
+  gtk_menu_append(GTK_MENU(menu), item);
+  
+  item = gtk_menu_item_new();
+  gtk_widget_show(item);
+  gtk_menu_append(GTK_MENU(menu), item);
+
+#ifdef GTKURL_USE_GNOME
+  item = gtk_menu_item_new_with_label(_("Open with GNOME URL Handler"));
+  gtk_signal_connect(GTK_OBJECT(item), "activate", 
+                    GTK_SIGNAL_FUNC(visit_url_gnome_cb), g_strdup(url) );
+  gtk_menu_append(GTK_MENU(menu), item);
+  gtk_widget_show(item);
+#endif /* GTKURL_USE_GNOME */
+    
+  item = gtk_menu_item_new_with_label(_("Open with Netscape (Existing)"));
+  cmd = g_strdup_printf("netscape -remote 'openURL(%s)'", url);
+  gtk_signal_connect(GTK_OBJECT(item), "activate",
+                    GTK_SIGNAL_FUNC(visit_url_cmd_cb), g_strdup(cmd) );
+  g_free(cmd);
+  gtk_menu_append(GTK_MENU(menu), item);
+  gtk_widget_show(item);
+
+  item = gtk_menu_item_new_with_label(_("Open with Netscape (New Window)"));
+  cmd = g_strdup_printf("netscape -remote 'openURL(%s,new-window)'", url);
+  gtk_signal_connect(GTK_OBJECT(item), "activate",
+                    GTK_SIGNAL_FUNC(visit_url_cmd_cb), g_strdup(cmd) );
+  g_free(cmd);
+  gtk_menu_append(GTK_MENU(menu), item);
+  gtk_widget_show(item);
+
+  item = gtk_menu_item_new_with_label(_("Open with Netscape (Run New)"));
+  cmd = g_strdup_printf("netscape %s", url);
+  gtk_signal_connect(GTK_OBJECT(item), "activate",
+                    GTK_SIGNAL_FUNC(visit_url_cmd_cb), g_strdup(cmd) );
+  g_free(cmd);
+  gtk_menu_append(GTK_MENU(menu), item);
+  gtk_widget_show(item);
+
+  g_free(url);
+  
+  return GTK_MENU(menu);
+}
+
+
+#ifdef GTKURL_USE_GNOME
+static gboolean visit_url_gnome_cb( GtkWidget *widget, gpointer *data)
+{
+  gnome_url_show((gchar *) data);
+  g_free(data);
+  return(TRUE);
+}
+#endif /* GTKURL_USE_GNOME */
+
+
+/* this is taken from gnome-libs 1.2.4 */
+#define POPT_ARGV_ARRAY_GROW_DELTA 5
+
+static int my_poptParseArgvString(const char * s, int * argcPtr, char *** argvPtr)
+{
+    char * buf, * bufStart, * dst;
+    const char * src;
+    char quote = '\0';
+    int argvAlloced = POPT_ARGV_ARRAY_GROW_DELTA;
+    char ** argv = malloc(sizeof(*argv) * argvAlloced);
+    const char ** argv2;
+    int argc = 0;
+    int i, buflen;
+
+    buflen = strlen(s) + 1;
+    bufStart = buf = alloca(buflen);
+    memset(buf, '\0', buflen);
+
+    src = s;
+    argv[argc] = buf;
+
+    while (*src) {
+       if (quote == *src) {
+           quote = '\0';
+       } else if (quote) {
+           if (*src == '\\') {
+               src++;
+               if (!*src) {
+                   free(argv);
+                   return 1;
+               }
+               if (*src != quote) *buf++ = '\\';
+           }
+           *buf++ = *src;
+       } else if (isspace(*src)) {
+           if (*argv[argc]) {
+               buf++, argc++;
+               if (argc == argvAlloced) {
+                   argvAlloced += POPT_ARGV_ARRAY_GROW_DELTA;
+                   argv = realloc(argv, sizeof(*argv) * argvAlloced);
+               }
+               argv[argc] = buf;
+           }
+       } else switch (*src) {
+         case '"':
+         case '\'':
+           quote = *src;
+           break;
+         case '\\':
+           src++;
+           if (!*src) {
+               free(argv);
+               return 1;
+           }
+           /* fallthrough */
+         default:
+           *buf++ = *src;
+       }
+
+       src++;
+    }
+
+    if (strlen(argv[argc])) {
+       argc++, buf++;
+    }
+
+    dst = malloc((argc + 1) * sizeof(*argv) + (buf - bufStart));
+    argv2 = (void *) dst;
+    dst += (argc + 1) * sizeof(*argv);
+    memcpy(argv2, argv, argc * sizeof(*argv));
+    argv2[argc] = NULL;
+    memcpy(dst, bufStart, buf - bufStart);
+
+    for (i = 0; i < argc; i++) {
+       argv2[i] = dst + (argv[i] - bufStart);
+    }
+
+    free(argv);
+
+    *argvPtr = (char **)argv2; /* XXX don't change the API */
+    *argcPtr = argc;
+
+    return 0;
+}
+
+
+static gboolean visit_url_cmd_cb( GtkWidget *widget, gpointer *data)
+{
+  int pid;
+  char **argv;
+  int argc;
+
+  if (my_poptParseArgvString ( (const char *)data, &argc, &argv) != 0)
+    return -1;
+
+  pid = fork ();
+  if (pid == -1)
+    return -1;
+  if (pid == 0)
+    {
+      execvp (argv[0], argv);
+      _exit (0);
+    } else
+      {
+       free (argv);
+       return pid;
+      }
+  
+  g_free(data);
+
+  return(TRUE);
+}
+
+
+static gboolean check_at(GtkText *gtktext, gint from_pos)
+{
+  gint start, end;
+  gchar *buf;
+  
+  if ( ! (buf = get_word_from_pos(gtktext, from_pos, &start, &end)) ) 
+      return FALSE;
+  
+  if ( is_url(buf) ) 
+    {
+      if (highlight.pixel == 0) 
+       {
+         /* add an entry for the highlight in the color map. */
+         GdkColormap *gc = gtk_widget_get_colormap(GTK_WIDGET(gtktext));
+         gdk_colormap_alloc_color(gc, &highlight, FALSE, TRUE);;
+       }
+      change_color(gtktext, start, end, &highlight);
+      return(TRUE);
+    } 
+  else 
+    { 
+      change_color(gtktext, start, end, &(GTK_WIDGET(gtktext)->style->fg[0]));
+      return(FALSE);
+    }
+}
+
+
+static gchar *get_word_from_pos(GtkText* gtktext, gint pos, gint *pstart, gint *pend)
+{
+  GString *word = g_string_new("");
+  gint start, end;
+  gchar ch;
+  
+  if (iswordsep(GTK_TEXT_INDEX(gtktext, pos))) 
+    return(NULL);
+
+  /* Get start and end position from the word */
+  for (start = pos; start >= 0; --start) 
+    if (iswordsep(GTK_TEXT_INDEX(gtktext, start))) 
+      break;
+  start++;
+  
+  for (end = pos; end < gtk_text_get_length(gtktext); end++) 
+    if (iswordsep(GTK_TEXT_INDEX(gtktext, end)) )
+      break;
+
+  /* Be sure to not include punctation marks etc. */
+  for ( ;end>start; end-- )
+    {
+      ch = GTK_TEXT_INDEX(gtktext, end-1); 
+      if( isalpha(ch) || isdigit(ch) || ch == ':' )
+       break;
+    }
+
+  /* Get the word (everyting between start and end */
+  for (pos = start; pos < end; pos++)
+    g_string_append_c( word, GTK_TEXT_INDEX(gtktext, pos) );
+
+  if (pstart) 
+    *pstart = start;
+  if (pend) 
+    *pend = end;
+  
+  return(word->str);
+}
+
+
+static gchar *get_curword(GtkText* gtktext, gint *pstart, gint *pend)
+{
+  gint pos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
+  return(get_word_from_pos(gtktext, pos, pstart, pend));
+}
+
+
+static void change_color(GtkText *gtktext, gint start, gint end, GdkColor *color)
+{
+  gchar *newtext;
+
+  /* So we don't need spaces at the very end of the text */
+  if ( end == gtk_text_get_length(GTK_TEXT(gtktext))+1 )
+    end--;
+
+  newtext = gtk_editable_get_chars(GTK_EDITABLE(gtktext), start, end);
+    
+  gtk_text_freeze(gtktext);
+  gtk_signal_handler_block_by_func(GTK_OBJECT(gtktext),  
+                                  GTK_SIGNAL_FUNC(entry_insert_cb), NULL); 
+       
+  gtk_text_set_point(gtktext, start);
+  gtk_text_forward_delete(gtktext, end-start);
+
+  if (newtext && end-start > 0)
+    gtk_text_insert(gtktext, NULL, color, NULL, newtext, end-start); 
+
+  gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtktext), 
+                                    GTK_SIGNAL_FUNC(entry_insert_cb), NULL); 
+  gtk_text_thaw(gtktext);
+  g_free(newtext);
+}
+
+
+static gboolean iswordsep(gchar c)
+{
+/*     return !isalpha(c) && c != '\''; */
+  return( isspace(c) );
+}
+
+
+static gint is_url(gchar* word)
+{
+     gint len;
+     if (!word)
+         return GTKURL_NO_URL;
+
+   len = strlen (word);
+
+   if (!strncasecmp (word, "irc://", 6))
+      return GTKURL_URL;
+
+   if (!strncasecmp (word, "irc.", 4))
+      return GTKURL_URL;
+
+   if (!strncasecmp (word, "ftp.", 4))
+      return GTKURL_URL;
+
+   if (!strncasecmp (word, "ftp:", 4))
+      return GTKURL_URL;
+
+   if (!strncasecmp (word, "www.", 4))
+      return GTKURL_URL;
+
+   if (!strncasecmp (word, "http:", 5))
+      return GTKURL_URL;
+
+   if (!strncasecmp (word, "https:", 6))
+      return GTKURL_URL;
+
+   if (!strncasecmp (word + len - 4, ".org", 4))
+      return GTKURL_HOST;
+
+   if (!strncasecmp (word + len - 4, ".net", 4))
+      return GTKURL_HOST;
+
+   if (!strncasecmp (word + len - 4, ".com", 4))
+      return GTKURL_HOST;
+
+   if (!strncasecmp (word + len - 4, ".edu", 4))
+      return GTKURL_HOST;
+
+   return GTKURL_NO_URL;
+}
diff --git a/apps/silcer/src/gtkurl.h b/apps/silcer/src/gtkurl.h
new file mode 100644 (file)
index 0000000..ccf76d7
--- /dev/null
@@ -0,0 +1,69 @@
+/* GtkUrl - A addon for GtkText that enables colored and clickable URLs
+ * Copyright (C) 2001 Benedikt Roth <Benedikt.Roth@bratislav.de>  
+ *   Based on code from 
+ *   gtkspell - a spell-checking addon for GtkText
+ *   Copyright (c) 2000 Evan Martin.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ * 
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ */
+
+#ifndef __GTKSPELL_h__
+#define __GTKSPELL_h__
+
+BEGIN_GNOME_DECLS
+
+#define GTKURL_VERSION "0.1"
+
+/* Attach GtkURL to a GtkText Widget.
+ * This enables URL-checking as you type and the popup menu.
+ *
+ * Arguments:
+ *  - "text" is the widget to which GtkURL should attach.
+ *
+ * Example:
+ *  GtkWidget *text;
+ *  text = gtk_text_new(NULL, NULL); 
+ *  gtk_text_set_editable(GTK_TEXT(text), TRUE);
+ *  gtkurl_attach(GTK_TEXT(text));
+ */  
+void gtkurl_attach(GtkText *text);
+
+
+/* Detach GtkUrl from a GtkText widget.
+ * 
+ * Arguments:
+ *  - "text" is the widget from which GtkUrl should detach.
+ */ 
+void gtkurl_detach(GtkText *text);
+
+
+/* Highlight all urls
+ * Note that the popup menu will not work unless you gtkurl_attach().
+ *
+ * Arguments:
+ *  - "text" is the widget to check.
+ */
+void gtkurl_check_all(GtkText *text);
+
+/* Remove all of the highlighting from the widget.
+ *
+ * Arguments:
+ *  - "text" is the widget to check.
+ */
+void gtkurl_uncheck_all(GtkText *gtktext);
+
+END_GNOME_DECLS
+
+#endif /* __GTKURL_H__ */
diff --git a/apps/silcer/src/silcer.cc b/apps/silcer/src/silcer.cc
new file mode 100644 (file)
index 0000000..c8ca8cc
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+
+  silcer.cc 
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2001 Pekka Riikonen
+
+  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; version 2 of the License.
+
+  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.
+
+*/
+
+#include <fstream>
+#include <glade/glade-xml.h>
+#include <sigc++/object_slot.h>
+#include <gnome--/client.h>
+#include <gnome--/main.h>
+#include <libgnome/gnome-i18n.h>
+#include "silcerapp.hh"
+
+int main (int argc, char** argv)
+{
+#ifdef ENABLE_LNS
+  // Load translation
+  bindtextdomain(ConfigManager::get_PACKAGE(), GNOMELOCALEDIR);
+  textdomain(ConfigManager::get_PACKAGE());
+#endif
+  
+  new SilcerApp(argc, argv);
+  Silcer_App->run();
+
+  return 0;
+}
diff --git a/apps/silcer/src/silcer_gladehelper.hh b/apps/silcer/src/silcer_gladehelper.hh
new file mode 100644 (file)
index 0000000..4e3e321
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+
+  silcer_gladehelper.hh 
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2001 Pekka Riikonen
+
+  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; version 2 of the License.
+
+  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.
+
+*/
+
+#ifndef SILCER_GLADEHELPER_HH
+#define SILCER_GLADEHELPER_HH
+
+#include <glade/glade-xml.h>
+#include <gtk/gtkobject.h>
+#include <gtk--/base.h>
+
+template<class T> T *SilcerGetWidget(GladeXML* obj, const char *name)
+{
+  T *widget = 
+    static_cast<T *>(Gtk::wrap_auto((GtkObject *)
+                                   glade_xml_get_widget(obj, name)));
+  if (!widget)
+    g_error("Could not find widget `%s'", name);
+  return widget;
+}
+
+#endif /* SILCER_GLADEHELPER_HH */
diff --git a/apps/silcer/src/silcerapp.cc b/apps/silcer/src/silcerapp.cc
new file mode 100644 (file)
index 0000000..b73ceb4
--- /dev/null
@@ -0,0 +1,283 @@
+/*
+
+  silcerapp.cc 
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2001 Pekka Riikonen
+
+  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; version 2 of the License.
+
+  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.
+
+*/
+
+#include "silcerapp.hh"
+#include "gtkspell.h"
+
+#include <sys/utsname.h>
+#include <glade/glade.h>
+#include <libgnome/gnome-triggers.h>
+#include <libgnome/gnome-util.h>
+#include <libgnomeui/gnome-window-icon.h>
+#include <gnome--/client.h>
+
+// Pointer to the application
+SilcerApp *Silcer_App;
+string package = "silcer";
+string version = "1.0";
+
+SilcClient silc_client;
+SilcClientConnection silc_client_conn;
+
+static int 
+silc_create_key_pair(char *pkcs_name, int bits, char *path,
+                    char *identifier, 
+                    SilcPublicKey *ret_pub_key,
+                    SilcPrivateKey *ret_prv_key)
+{
+  SilcPKCS pkcs;
+  SilcPublicKey pub_key;
+  SilcPrivateKey prv_key;
+  SilcRng rng;
+  unsigned char *key;
+  uint32 key_len;
+  char pkfile[256], prvfile[256];
+
+  if (!pkcs_name || !path)
+    return FALSE;
+
+  if (!bits)
+    bits = 1024;
+
+  rng = silc_rng_alloc();
+  silc_rng_init(rng);
+  silc_rng_global_init(rng);
+
+  /* Generate keys */
+  silc_pkcs_alloc((const unsigned char *)pkcs_name, &pkcs);
+  pkcs->pkcs->init(pkcs->context, bits, rng);
+
+  /* Save public key into file */
+  key = silc_pkcs_get_public_key(pkcs, &key_len);
+  pub_key = silc_pkcs_public_key_alloc(pkcs->pkcs->name, identifier,
+                                       key, key_len);
+  *ret_pub_key = pub_key;
+
+  memset(key, 0, sizeof(key_len));
+  silc_free(key);
+
+  /* Save private key into file */
+  key = silc_pkcs_get_private_key(pkcs, &key_len);
+  prv_key = silc_pkcs_private_key_alloc(pkcs->pkcs->name, key, key_len);
+  *ret_prv_key = prv_key;
+
+  memset(key, 0, sizeof(key_len));
+  silc_free(key);
+
+  silc_rng_free(rng);
+  silc_pkcs_free(pkcs);
+
+  return TRUE;
+}
+
+static
+void silc_op_say(SilcClient client, SilcClientConnection conn, 
+                 SilcClientMessageType type, char *msg, ...)
+{
+  va_list va;
+  char *str;
+
+  va_start(va, msg);
+  str = g_strdup_vprintf(msg, va);
+  Silcer_App->_MainDialog->print((string)str);
+  g_free(str);
+  va_end(va);
+}
+
+static
+void silc_channel_message(SilcClient client, SilcClientConnection conn, 
+                         SilcClientEntry sender, SilcChannelEntry channel, 
+                         SilcMessageFlags flags, char *msg)
+{
+  Silcer_App->_MainDialog->print((string)msg, (string)sender->nickname);
+}
+
+static
+void silc_private_message(SilcClient client, SilcClientConnection conn,
+                         SilcClientEntry sender, SilcMessageFlags flags,
+                         char *msg)
+{
+  Silcer_App->_MainDialog->print((string)msg);
+}
+
+static
+void silc_notify(SilcClient client, SilcClientConnection conn, 
+                SilcNotifyType type, ...)
+{
+  va_list va;
+  
+  va_start(va, type);
+  Silcer_App->_MainDialog->print((string)va_arg(va, char *));
+  va_end(va);
+}
+
+static
+void silc_connect(SilcClient client, SilcClientConnection conn, int success)
+{
+  silc_client_conn = conn;
+}
+
+static
+void silc_disconnect(SilcClient client, SilcClientConnection conn)
+{
+  silc_client_conn = NULL;
+}
+
+static
+void silc_auth_meth(SilcClient client, 
+                   SilcClientConnection conn,
+                   char *hostname, uint16 port,
+                   SilcGetAuthMeth completion, void *context)
+{
+  completion(TRUE, SILC_AUTH_NONE, NULL, 0, context);
+}
+
+static
+void silc_verify_public_key(SilcClient client, SilcClientConnection conn,
+                           SilcSocketType conn_type, unsigned char *pk, 
+                           uint32 pk_len, SilcSKEPKType pk_type,
+                           SilcVerifyPublicKey completion, void *context)
+{
+  completion(TRUE, context);
+}
+
+static
+void silc_command(SilcClient client, SilcClientConnection conn, 
+                 SilcClientCommandContext cmd_context, int success,
+                 SilcCommand command)
+{
+
+}
+
+static
+void silc_command_reply(SilcClient client, SilcClientConnection conn,
+                       SilcCommandPayload cmd_payload, int success,
+                       SilcCommand command, SilcCommandStatus status, ...)
+{
+
+}
+
+/* SILC client operations */
+SilcClientOperations ops = {
+  silc_op_say,
+  silc_channel_message,
+  silc_private_message,
+  silc_notify,
+  silc_command,
+  silc_command_reply,
+  silc_connect,
+  silc_disconnect,
+  silc_auth_meth,
+  silc_verify_public_key,
+  NULL,
+  NULL,
+  NULL,
+  NULL
+};
+
+SILC_TASK_CALLBACK(connect_client)
+{
+  SilcClient client = (SilcClient)context;
+  silc_client_connect_to_server(client, 706, "silc.silcnet.org", NULL);
+}
+
+SilcerApp::SilcerApp(int argc, char **argv)
+  : _GnomeApp(package, version, argc, argv),
+  _gclient(Gnome::Client::master_client())
+{
+  // Save application pointer
+  Silcer_App = this;
+
+  // Initialize SILC stuff
+  silc_debug = TRUE;
+  silc_debug_hexdump = TRUE;
+  silc_log_set_debug_string("*client*,*net*,*ske*");
+
+  // Initialize SILC Client Library */
+  silc_client = silc_client_alloc(&ops, NULL, NULL, "SILC-1.0-0.6.2");
+  silc_client->realname = "pekka riikonen";
+  silc_client->username = "priikone";
+  silc_client->hostname = "mun.oma.kone";
+  silc_cipher_register_default();
+  silc_pkcs_register_default();
+  silc_hash_register_default();
+  silc_hmac_register_default();
+  silc_create_key_pair("rsa", 1024, "kk", "UN=priikone, "
+                      "HN=pelle.kuo.fi.ssh.com", 
+                      &silc_client->public_key, &silc_client->private_key);
+  silc_client_init(silc_client);
+
+  // Setup SILC scheduler as timeout task
+  Gnome::Main::timeout.connect(slot(this, &SilcerApp::silc_scheduler), 50);
+
+  silc_schedule_task_add(silc_client->schedule, 0, connect_client, 
+                        silc_client, 0, 1, SILC_TASK_TIMEOUT, 
+                        SILC_TASK_PRI_NORMAL); 
+
+   // Initialize glade
+  glade_gnome_init();
+
+  // Locate glade files
+  if (!g_file_exists(string(_SourceDir + "SilcerMainDlg.glade").c_str()))
+    _SourceDir = "./";
+  if (!g_file_exists(string(_SourceDir + "SilcerMainDlg.glade").c_str()))
+    _SourceDir = "./ui/";
+  if (!g_file_exists(string(_SourceDir + "SilcerMainDlg.glade").c_str()))
+    _SourceDir = "./src/";
+  if (!g_file_exists(string(_SourceDir + "SilcerMainDlg.glade").c_str())) {
+    g_error("Could not find SilcerMainDlg.glade");
+    exit(-1);
+  }
+
+  _MainDialog = new SilcerMainDlg();
+}
+
+SilcerApp::~SilcerApp()
+{
+  delete _MainDialog;
+}
+
+void SilcerApp::run()
+{
+  // Let the gnome app start processing messages
+  Gnome::Main::run();
+}
+
+void SilcerApp::quit()
+{
+  // Stop gtk/gnome message loop
+  Gnome::Main::quit();
+  delete Silcer_App;
+}
+
+GladeXML *SilcerApp::load_resource(const char *name)
+{
+  return glade_xml_new(string(_SourceDir + name + ".glade").c_str(), name);
+}
+
+GladeXML *SilcerApp::load_resource(const char *name, const char *filename)
+{
+  return glade_xml_new(string(_SourceDir + filename + ".glade").c_str(), name);
+}
+
+gint SilcerApp::silc_scheduler()
+{
+  silc_client_run_one(silc_client);
+  return 1;
+}
diff --git a/apps/silcer/src/silcerapp.hh b/apps/silcer/src/silcerapp.hh
new file mode 100644 (file)
index 0000000..64ea503
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+
+  silcerapp.hh 
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2001 Pekka Riikonen
+
+  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; version 2 of the License.
+
+  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.
+
+*/
+
+#ifndef SILCERAPP_HH
+#define SILCERAPP_HH
+
+#include "SilcerMainDlg.hh"
+#include "silcer_gladehelper.hh"
+
+extern "C" {
+#define CXX
+#include "silcincludes.h"
+#include "clientlibincludes.h"
+}
+
+#include <fstream>
+#include <glade/glade-xml.h>
+#include <sigc++/object_slot.h>
+#include <gnome--/client.h>
+#include <gnome--/main.h>
+
+// Forward declarations
+class SilcerApp;
+
+// Global pointer for the application
+extern SilcerApp *Silcer_App;
+
+// Global pointer to the SILC Client Library object
+extern SilcClient silc_client;
+extern SilcClientConnection silc_client_conn;
+
+// Silcer class
+class SilcerApp : public SigC::Object
+{
+public:
+  SilcerApp(int argc, char **argv);
+  ~SilcerApp();
+
+  SilcerMainDlg *_MainDialog;
+
+  void run();
+  void quit();
+  GladeXML* load_resource(const char *name);
+  GladeXML* load_resource(const char *name, const char *filename);
+
+protected:
+  gint silc_scheduler();
+
+private:
+  Gnome::Main _GnomeApp;
+  Gnome::Client *_gclient;
+  string _SourceDir;
+  string _pix_path;
+};
+
+#endif /* SILCERAPP_HH */
diff --git a/apps/silcer/src/silcerbasewin.cc b/apps/silcer/src/silcerbasewin.cc
new file mode 100644 (file)
index 0000000..342a45f
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+
+  silcerbasewin.cc 
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2001 Pekka Riikonen
+
+  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; version 2 of the License.
+
+  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.
+
+*/
+
+#include "silcerbasewin.hh"
+#include "silcerapp.hh"
+
+SilcerBaseWindow::SilcerBaseWindow(const char *widgetname)
+{ 
+  _thisGH = Silcer_App->load_resource(widgetname); 
+  _thisWindow = SilcerGetWidget<Gtk::Window>(_thisGH, widgetname);
+  reference();
+}
+
+void SilcerBaseWindow::set_dynamic()
+{
+  SigC::Object::set_dynamic();
+  set_sink();
+}
+
+void SilcerBaseWindow::close()
+{
+  unreference();
+}
+
+SilcerBaseWindow::~SilcerBaseWindow()
+{
+  evtDestroy();
+  _thisWindow->destroy();
+  gtk_object_unref(GTK_OBJECT(_thisGH));
+}
+
+SilcerBaseDialog::SilcerBaseDialog(const char *widgetname, 
+                                  gboolean close_hides)
+  : SilcerBaseWindow(widgetname)
+{
+  _thisDialog = static_cast<Gnome::Dialog*>(_thisWindow);
+  _thisDialog->close_hides(close_hides);
+  if (!close_hides)
+    _thisDialog->close.connect(slot(this, &SilcerBaseDialog::on_Dialog_close));
+}
+
+gboolean SilcerBaseDialog::on_Dialog_close()
+{
+  _thisWindow->destroy();
+  return true;
+}
+
+SilcerBaseWidget::SilcerBaseWidget(const char *widgetname, 
+                                  const char* filename)
+{ 
+  _thisGH = Silcer_App->load_resource(widgetname, filename); 
+  _thisWidget = SilcerGetWidget<Gtk::Widget>(_thisGH, widgetname);
+  reference();
+}
+
+void SilcerBaseWidget::set_dynamic()
+{
+  SigC::Object::set_dynamic();
+  set_sink();
+}
+
+void SilcerBaseWidget::close()
+{
+  unreference();
+}
+
+SilcerBaseWidget::~SilcerBaseWidget()
+{
+  evtDestroy();
+  _thisWidget->destroy();
+  gtk_object_unref(GTK_OBJECT(_thisGH));
+}
diff --git a/apps/silcer/src/silcerbasewin.hh b/apps/silcer/src/silcerbasewin.hh
new file mode 100644 (file)
index 0000000..fe60715
--- /dev/null
@@ -0,0 +1,199 @@
+/*
+
+  silcerbasewin.hh 
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2001 Pekka Riikonen
+
+  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; version 2 of the License.
+
+  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.
+
+*/
+
+#ifndef SILCERBASEWIN_HH
+#define SILCERBASEWIN_HH
+
+#include "silcer_gladehelper.hh"
+
+extern "C" {
+#define CXX
+#include "silcincludes.h"
+#include "clientlibincludes.h"
+}
+
+#include <sigc++/signal_system.h>
+#include <sigc++/object_slot.h>
+#include <sigc++/marshal.h>
+#include <glade/glade-xml.h>
+#include <gtk--/box.h>
+#include <gtk--/button.h>
+#include <gtk--/checkbutton.h>
+#include <gtk--/ctree.h>
+#include <gtk--/entry.h>
+#include <gtk--/eventbox.h>
+#include <gtk--/frame.h>
+#include <gtk--/label.h>
+#include <gtk--/menuitem.h>
+#include <gtk--/optionmenu.h>
+#include <gtk--/text.h>
+#include <gtk--/widget.h>
+#include <gtk--/window.h>
+#include <gnome--/dialog.h>
+#include <gnome--/entry.h>
+#include <gnome--/pixmap.h>
+#include <gnome--/pixmapmenuitem.h>
+
+using namespace SigC;
+
+class SilcerBaseWindow : public SigC::Object
+{
+public:
+  SilcerBaseWindow(const char *widgetname);
+  virtual ~SilcerBaseWindow();
+
+  void show() { _thisWindow->show(); }
+  void hide() { _thisWindow->hide(); }
+  virtual void close(); 
+  // Object extender
+  virtual void set_dynamic();
+  // Destruction signal
+  Signal0<void, Marshal<void> > evtDestroy;
+
+protected:
+  SilcerBaseWindow();
+  // FIXME: Should make this function properly copy
+  SilcerBaseWindow& operator=(const SilcerBaseWindow&) { return *this;}
+  SilcerBaseWindow(const SilcerBaseWindow&) {}
+  
+public:
+  // Helper functions
+
+  Gtk::Button *getButton(const char *name)
+  { return SilcerGetWidget<Gtk::Button>(_thisGH, name); }
+
+  Gtk::CheckButton *getCheckButton(const char *name)
+  { return SilcerGetWidget<Gtk::CheckButton>(_thisGH, name); }
+
+  Gtk::CTree *getCTree(const char *name)
+  { return SilcerGetWidget<Gtk::CTree>(_thisGH, name); }
+
+  Gtk::Entry *getEntry(const char *name)
+  { return SilcerGetWidget<Gtk::Entry>(_thisGH, name); }
+
+  Gtk::EventBox *getEventBox(const char *name)
+  { return SilcerGetWidget<Gtk::EventBox>(_thisGH, name); }
+
+  Gtk::Frame *getFrame(const char *name)
+  { return SilcerGetWidget<Gtk::Frame>(_thisGH, name); }
+
+  Gtk::HBox *getHBox(const char *name)
+  { return SilcerGetWidget<Gtk::HBox>(_thisGH, name); }
+
+  Gnome::Entry *getGEntry(const char *name)
+  { return SilcerGetWidget<Gnome::Entry>(_thisGH, name); }
+
+  Gtk::Label *getLabel(const char *name)
+  { return SilcerGetWidget<Gtk::Label>(_thisGH, name); }
+
+  Gtk::MenuItem *getMenuItem(const char *name)
+  { return SilcerGetWidget<Gtk::MenuItem>(_thisGH, name); }
+
+  Gtk::OptionMenu *getOptionMenu(const char *name)
+  { return SilcerGetWidget<Gtk::OptionMenu>(_thisGH, name); }
+
+  Gnome::Pixmap *getPixmap(const char *name)
+  { return SilcerGetWidget<Gnome::Pixmap>(_thisGH, name); }
+
+  Gtk::PixmapMenuItem *getPixmapMenuItem(const char *name)
+  { return SilcerGetWidget<Gtk::PixmapMenuItem>(_thisGH, name); }
+
+  Gtk::Text *getText(const char *name)
+  { return SilcerGetWidget<Gtk::Text>(_thisGH, name); }
+
+  Gtk::VBox *getVBox(const char *name)
+  { return SilcerGetWidget<Gtk::VBox>(_thisGH, name); }
+
+  template <class T> T *getWidget(const char *name)
+  { return SilcerGetWidget<T>(_thisGH, name); }
+
+protected:
+  Gtk::Window *_thisWindow;
+
+private:
+  GladeXML *_thisGH;
+};
+
+class SilcerBaseDialog : public SilcerBaseWindow
+{
+public:
+  SilcerBaseDialog(const char *widgetname, gboolean close_hides = false);
+  virtual ~SilcerBaseDialog() {}
+
+protected:
+  Gnome::Dialog *_thisDialog;
+  gboolean on_Dialog_close();
+};
+
+class SilcerBaseWidget : public SigC::Object
+{
+public:
+  SilcerBaseWidget(const char* widgetname, const char* filename);
+  virtual ~SilcerBaseWidget();
+  void show() { _thisWidget->show(); }
+  void hide() { _thisWidget->hide(); }
+  Gtk::Widget* get_this_widget() { return _thisWidget; }
+  virtual void close(); 
+  // Object extender
+  virtual void set_dynamic();
+  // Destruction signal
+  Signal0<void, Marshal<void> > evtDestroy;
+protected:
+  SilcerBaseWidget();
+  // FIXME: Should make this function properly copy
+  SilcerBaseWidget& operator=(const SilcerBaseWidget&) { return *this;}
+  SilcerBaseWidget(const SilcerBaseWidget&) {}
+public:
+  // Helper functions
+
+  Gtk::Button *getButton(const char *name)
+  { return SilcerGetWidget<Gtk::Button>(_thisGH, name); }
+
+  Gtk::CheckButton *getCheckButton(const char *name)
+  { return SilcerGetWidget<Gtk::CheckButton>(_thisGH, name); }
+
+  Gtk::Entry *getEntry(const char *name)
+  { return SilcerGetWidget<Gtk::Entry>(_thisGH, name); }
+
+  Gtk::Label *getLabel(const char *name)
+  { return SilcerGetWidget<Gtk::Label>(_thisGH, name); }
+
+  Gtk::MenuItem *getMenuItem(const char *name)
+  { return SilcerGetWidget<Gtk::MenuItem>(_thisGH, name); }
+
+  Gtk::OptionMenu *getOptionMenu(const char *name)
+  { return SilcerGetWidget<Gtk::OptionMenu>(_thisGH, name); }
+
+  Gtk::PixmapMenuItem *getPixmapMenuItem(const char *name)
+  { return SilcerGetWidget<Gtk::PixmapMenuItem>(_thisGH, name); }
+
+  Gtk::Text *getText(const char *name)
+  { return SilcerGetWidget<Gtk::Text>(_thisGH, name); }
+
+  template <class T> T *getWidget(const char *name)
+  { return SilcerGetWidget<T>(_thisGH, name); }
+
+protected:
+  Gtk::Widget *_thisWidget;
+
+private:
+  GladeXML *_thisGH;
+};
+
+#endif /* SILCERBASEWIN_HH */
diff --git a/apps/silcer/src/silcerchatview.cc b/apps/silcer/src/silcerchatview.cc
new file mode 100644 (file)
index 0000000..7692fea
--- /dev/null
@@ -0,0 +1,290 @@
+/*
+
+  silcerchatview.cc 
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2001 Pekka Riikonen
+
+  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; version 2 of the License.
+
+  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.
+
+  Code is mostly ripped from Gabber, thus code also copyrighted by:
+  Copyright (C) 1999-2001 Dave Smith & Julian Missig
+  
+*/
+
+#include "silcerchatview.hh"
+#include <libgnome/gnome-url.h>
+#include <gtk--/text.h>
+#include <gtk/gtkbox.h>
+
+extern "C" {
+#include "xtext.h"
+}
+
+GdkColor colors[] =
+{
+   {0, 0, 0, 0},                /* 0  black */
+   {0, 0xcccc, 0xcccc, 0xcccc}, /* 1  white */
+   {0, 0, 0, 0xcccc},           /* 2  blue */
+   {0, 0, 0xcccc, 0},           /* 3  green */
+   {0, 0xcccc, 0, 0},           /* 4  red */
+   {0, 0xbbbb, 0xbbbb, 0},      /* 5  yellow/brown */
+   {0, 0xbbbb, 0, 0xbbbb},      /* 6  purple */
+   {0, 0xffff, 0xaaaa, 0},      /* 7  orange */
+   {0, 0xffff, 0xffff, 0},      /* 8  yellow */
+   {0, 0, 0xffff, 0},           /* 9  green */
+   {0, 0, 0xcccc, 0xcccc},      /* 10 aqua */
+   {0, 0, 0xffff, 0xffff},      /* 11 light aqua */
+   {0, 0, 0, 0xffff},           /* 12 blue */
+   {0, 0xffff, 0, 0xffff},      /* 13 pink */
+   {0, 0x7777, 0x7777, 0x7777}, /* 14 grey */
+   {0, 0x9999, 0x9999, 0x9999}, /* 15 light grey */
+   {0, 0, 0, 0xcccc},           /* 16 blue markBack */
+   {0, 0xeeee, 0xeeee, 0xeeee}, /* 17 white markFore */
+   {0, 0xcccc, 0xcccc, 0xcccc}, /* 18 foreground (white) */
+   {0, 0, 0, 0},                /* 19 background (black) */
+};
+
+typedef const int CONSTANT;
+const int WORD_URL  = 1;
+const int WORD_HOST = 2;
+
+void palette_load(GtkWidget* w)
+{
+  int i;
+  
+  if (!colors[0].pixel)             /* don't do it again */
+    for (i = 0; i < 20; i++) {
+      colors[i].pixel = (gulong) ((colors[i].red & 0xff00) * 256 +
+                                 (colors[i].green & 0xff00) +
+                                 (colors[i].blue & 0xff00) / 256);
+      if (!gdk_colormap_alloc_color (gtk_widget_get_colormap (w), 
+                                    &colors[i], 0, 1))
+       cerr << "Error allocating color " << i << endl;
+    }
+}
+
+int word_check(GtkXText* t, char* word)
+{
+  if (!word)
+    return 0;
+  int len = strlen (word);
+  
+  if (!strncasecmp (word, "irc://", 6))
+    return WORD_URL;
+
+  if (!strncasecmp (word, "irc.", 4))
+    return WORD_URL;
+
+  if (!strncasecmp (word, "ftp.", 4))
+    return WORD_URL;
+
+  if (!strncasecmp (word, "ftp:", 4))
+    return WORD_URL;
+
+  if (!strncasecmp (word, "www.", 4))
+    return WORD_URL;
+
+  if (!strncasecmp (word, "http:", 5))
+    return WORD_URL;
+
+  if (!strncasecmp (word, "https:", 6))
+    return WORD_URL;
+
+  if (!strncasecmp (word, "silc:", 7))
+    return WORD_URL;
+
+  if (!strncasecmp (word, "sftp:", 7))
+    return WORD_URL;
+
+  if (!strncasecmp (word + len - 4, ".org", 4))
+    return WORD_HOST;
+
+  if (!strncasecmp (word + len - 4, ".net", 4))
+    return WORD_HOST;
+
+  if (!strncasecmp (word + len - 4, ".com", 4))
+    return WORD_HOST;
+
+  if (!strncasecmp (word + len - 4, ".edu", 4))
+    return WORD_HOST;
+
+  return 0;
+}
+
+SilcerChatView::SilcerChatView(Gtk::Widget *owner, Gtk::Container *parent, 
+                              gboolean indent)
+{
+  // Create a Gtk::Text so we can grab the colors, then destroy it
+  Gtk::Text textwidget;
+  parent->add(textwidget);
+  textwidget.realize();
+
+  // Copy the style of the Gtk::Text widget
+  GtkStyle* gs = gtk_widget_get_style(GTK_WIDGET(textwidget.gtkobj()));
+  colors[16] = gs->bg[GTK_STATE_SELECTED];
+  colors[17] = gs->fg[GTK_STATE_SELECTED];
+  colors[18] = gs->fg[GTK_STATE_NORMAL];
+  colors[19] = gs->base[GTK_STATE_NORMAL];
+  parent->remove(textwidget);
+  textwidget.destroy();
+
+  // Initialize the palette
+  palette_load(owner->gtkobj());
+
+  // Create the GtkXText object
+  _xtext = GTK_XTEXT(gtk_xtext_new(75, 0));
+
+  // Internal init
+  _xtext->max_lines = 1024;
+  _xtext->urlcheck_function = word_check;    
+  _xtext->auto_indent = !indent;
+  _xtext->wordwrap = true;
+
+  // Display the widget
+  gtk_xtext_set_palette(_xtext, colors);
+  gtk_xtext_set_font(_xtext, gs->font, "");
+
+  // Create a frame around it
+  _frmChat = GTK_FRAME(gtk_frame_new(NULL));
+  gtk_frame_set_shadow_type(GTK_FRAME(_frmChat), GTK_SHADOW_IN);
+
+  // Add the widget to a container, which happens to be a frame
+  gtk_container_add(parent->gtkobj(), GTK_WIDGET(_frmChat));
+  gtk_container_add(GTK_CONTAINER(_frmChat), GTK_WIDGET(_xtext));
+  gtk_widget_show(GTK_WIDGET(_frmChat));
+  gtk_widget_show(GTK_WIDGET(_xtext));
+  
+  // Create a scrollbar
+  _vsChat = GTK_VSCROLLBAR(gtk_vscrollbar_new(_xtext->adj));
+  gtk_box_pack_start (GTK_BOX (parent->gtkobj()), GTK_WIDGET(_vsChat), 
+                     FALSE, FALSE, 1);
+  GTK_WIDGET_UNSET_FLAGS (_vsChat, GTK_CAN_FOCUS);
+  gtk_widget_show (GTK_WIDGET(_vsChat));
+
+  // Hookup stub callback
+  gtk_signal_connect(GTK_OBJECT(_xtext), "word_click", 
+                    GTK_SIGNAL_FUNC(&SilcerChatView::_on_word_clicked_stub), 
+                    this);
+}
+
+SilcerChatView::~SilcerChatView()
+{
+  gtk_widget_destroy(GTK_WIDGET(_xtext));
+  gtk_widget_destroy(GTK_WIDGET(_frmChat));
+  gtk_widget_destroy(GTK_WIDGET(_vsChat));
+}
+
+void SilcerChatView::render(const string &message, const string &username, 
+                     const string &timestamp, COLOR_T &c)
+{
+  if (username == "")
+    print(timestamp  + c + "***\017", message);
+  else
+    print(timestamp + c + "<\017" + username + c + ">\017" , message);
+}
+
+void SilcerChatView::render_error(const string &message, const string &error, 
+                                 const string &timestamp, COLOR_T &c)
+{
+  // Process error messages
+  print(timestamp + c + error + "\017:", message);
+}
+
+void SilcerChatView::clearbuffer()
+{
+  // Flush the buffer
+  gtk_xtext_remove_lines(_xtext, -1, true);
+}
+
+string SilcerChatView::get_chars()
+{
+  return string(gtk_xtext_get_chars(_xtext));
+}
+
+void SilcerChatView::on_word_clicked(char *word, GdkEventButton *evt)
+{
+  string s_word = word;
+
+  if (evt->button == 3) {
+    switch(word_check(_xtext, word))
+      {
+      case WORD_URL:
+       gnome_url_show(word);
+       break;
+      case WORD_HOST:
+       s_word = "http://" + s_word;
+       gnome_url_show(s_word.c_str());
+       break;
+      }          
+  }
+}
+
+void SilcerChatView::_on_word_clicked_stub(GtkXText *xtext, char *word, 
+                                    GdkEventButton *evt, 
+                                          SilcerChatView *_this)
+{
+  _this->on_word_clicked(word, evt);
+}
+
+inline void SilcerChatView::print(const string &s)
+{
+  char* astr = (char*)s.c_str();
+  char* anewline = strchr(astr, '\n');
+
+  if (anewline) {
+    while(1) {
+      gtk_xtext_append(_xtext, astr, 
+                      (unsigned long)anewline - (unsigned long)astr);
+      astr = anewline + 1;
+      if (*astr == 0)
+       break;
+      anewline = strchr(astr, '\n');
+      if (!anewline) {
+       gtk_xtext_append(_xtext, astr, -1);
+       break;
+      }
+    }
+  } else {
+    gtk_xtext_append(_xtext, astr, s.length());
+  }
+}
+
+inline void SilcerChatView::print(const string& left, const string& right)
+{
+  char* s = (char*)right.c_str();
+  char* newline = strchr(s, '\n');
+
+  if (newline) {
+    // Display the first line w/ the user who said it
+    gtk_xtext_append_indent(_xtext, (char*)left.c_str(), left.length(),
+                           s, (unsigned long)newline - (unsigned long)s);
+    // Now loop through the rest of the string, displaying it
+    while (1) {
+      s = newline + 1;
+      if (*s == 0)
+       break;
+      newline = strchr(s, '\n');
+      // If another newline is found, append it to the display and loop again
+      if (newline) {
+       gtk_xtext_append_indent(_xtext, "", 0, s, 
+                               (unsigned long)newline - (unsigned long)s);
+      } else {
+       // Otherwise append the rest of the string and break out of  the loop
+       gtk_xtext_append_indent(_xtext, "", 0, s, -1);
+       break;
+      }
+    }
+  } else {
+    gtk_xtext_append_indent(_xtext, (char*)left.c_str(), left.length(),
+                           (char*)right.c_str(), right.length());
+  }
+}
diff --git a/apps/silcer/src/silcerchatview.hh b/apps/silcer/src/silcerchatview.hh
new file mode 100644 (file)
index 0000000..5f8d3b6
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+
+  silcerchatview.hh 
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2001 Pekka Riikonen
+
+  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; version 2 of the License.
+
+  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.
+
+  Code is mostly ripped from Gabber, thus code also copyrighted by:
+  Copyright (C) 1999-2001 Dave Smith & Julian Missig
+*/
+
+#ifndef SILCERCHATVIEW_HH
+#define SILCERCHATVIEW_HH
+
+extern "C" {
+#include "xtext.h"
+}
+
+#include <gtk/gtkframe.h>
+#include <gtk/gtkvscrollbar.h>
+#include <gtk--/container.h>
+#include <gtk--/paned.h>
+#include <gtk--/widget.h>
+
+typedef const string COLOR_T;
+
+COLOR_T BLACK       = "\0030";
+COLOR_T WHITE       = "\0031";
+COLOR_T BLUE        = "\0032";
+COLOR_T GREEN       = "\0033";
+COLOR_T RED         = "\0034";
+COLOR_T YELLOWBROWN = "\0035";
+COLOR_T PURPLE      = "\0036";
+COLOR_T ORANGE      = "\0037";
+COLOR_T YELLOW      = "\0038";
+COLOR_T GREEN2      = "\0039";
+COLOR_T AQUA        = "\00310";
+COLOR_T LIGHTAQUA   = "\00311";
+COLOR_T BLUE2       = "\00312";
+COLOR_T PINK        = "\00313";
+COLOR_T GREY        = "\00314";
+COLOR_T LIGHTGREY   = "\00315";
+COLOR_T BLUEMARKBACK= "\00316";
+COLOR_T WHITEMARKFORE= "\00317";
+COLOR_T WHITEFORE   = "\00318";
+COLOR_T BLACKBACK   = "\00319";
+
+
+class SilcerChatView
+{
+public:
+  SilcerChatView(Gtk::Widget *owner, Gtk::Container *parent, 
+                gboolean indent = true);
+  SilcerChatView(Gtk::Widget *owner, Gtk::Paned *parent, 
+                gboolean indent = true);
+  ~SilcerChatView();
+  void render(const string &message, const string &username, 
+             const string &timestamp, COLOR_T &delimiter_color);
+  void render_error(const string &message, const string &error, 
+                   const string &timestamp, COLOR_T &delimiter_color);
+  void clearbuffer();
+  string get_chars();
+  GtkXText *_xtext;
+  GtkFrame *_frmChat;
+  GtkVScrollbar *_vsChat;
+
+ protected:
+  void print(const string &s);
+  void print(const string &left, const string &right);
+  void on_word_clicked(char* word, GdkEventButton *evt);
+  static void _on_word_clicked_stub(GtkXText *xtext, char *word, 
+                                   GdkEventButton *evt, 
+                                   SilcerChatView *_this);
+};
+
+#endif /* SILCERCHATVIEW_HH */
diff --git a/apps/silcer/src/xtext.c b/apps/silcer/src/xtext.c
new file mode 100644 (file)
index 0000000..74e8452
--- /dev/null
@@ -0,0 +1,3033 @@
+/* X-Chat
+ * Copyright (C) 1998 Peter Zelezny.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *
+ * 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
+ * =========================================================================
+ *
+ * xtext, the text widget used by X-Chat.
+ *
+ * By Peter Zelezny <zed@linux.com>.
+ * Some functions used from Zvt and Eterm (transparency stuff).
+ *
+ */
+
+#define USE_XLIB                                               /* turn this ON for non-xchat use. */
+#undef XCHAT                                                   /* using xchat */
+#define REFRESH_TIMEOUT 20
+#define WORDWRAP_LIMIT 24
+#define TINT_VALUE 195                         /* 195/255 of the brightness. */
+#define MOTION_MONITOR 1                       /* URL hilights. */
+#define MARGIN 2                                               /* dont touch. */
+
+#include <config.h>                    /* can define USE_XLIB here */
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <gtk/gtkmain.h>
+#include <gtk/gtksignal.h>
+#include <gtk/gtkselection.h>
+
+#ifdef USE_XLIB
+#include <gdk/gdkx.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#endif
+
+#include "xtext.h"
+
+#ifdef USE_GDK_PIXBUF
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#endif
+
+#undef GTK_WIDGET
+#define GTK_WIDGET(n) ((GtkWidget*)n)
+#undef GTK_OBJECT
+#define GTK_OBJECT(n) ((GtkObject*)n)
+#undef GTK_OBJECT_CLASS
+#define GTK_OBJECT_CLASS(n) ((GtkObjectClass*)n)
+
+static GtkWidgetClass *parent_class = NULL;
+
+enum
+{
+       WORD_CLICK,
+       LAST_SIGNAL
+};
+static guint xtext_signals[LAST_SIGNAL] = { 0 };
+
+#ifdef XCHAT
+char *nocasestrstr (char *text, char *tofind); /* util.c */
+#endif
+static void gtk_xtext_render_page (GtkXText * xtext);
+static void gtk_xtext_calc_lines (GtkXText * xtext, int);
+#ifdef USE_XLIB
+static void gtk_xtext_load_trans (GtkXText * xtext);
+static void gtk_xtext_free_trans (GtkXText * xtext);
+#endif
+static textentry *gtk_xtext_nth (GtkXText * xtext, textentry * start_ent,
+                                                                                       int line, int width, int *subline);
+static gint gtk_xtext_selection_kill (GtkWidget * widget,
+                                                                                                 GdkEventSelection * event);
+static void gtk_xtext_selection_get (GtkWidget * widget,
+                                                                                                GtkSelectionData * selection_data_ptr,
+                                                                                                guint info, guint time);
+static int gtk_xtext_text_width (GtkXText * xtext, unsigned char *text,
+                                                                                       int len);
+static void gtk_xtext_adjustment_changed (GtkAdjustment * adj,
+                                                                                                               GtkXText * xtext);
+static void gtk_xtext_draw_sep (GtkXText * xtext, int height);
+static void gtk_xtext_render_ents (GtkXText * xtext, textentry *, textentry *,
+                                                                                         int);
+static void gtk_xtext_recalc_widths (GtkXText * xtext, int);
+static void gtk_xtext_fix_indent (GtkXText * xtext);
+
+/* some utility functions first */
+
+#ifndef XCHAT  /* xchat has this in util.c */
+
+static char *
+nocasestrstr (char *s, char *wanted)
+{
+   register const size_t len = strlen (wanted);
+
+   if (len == 0)
+     return (char *)s;
+   while (toupper(*s) != toupper(*wanted) || strncasecmp (s, wanted, len))
+     if (*s++ == '\0')
+       return (char *)NULL;
+   return (char *)s;   
+}
+
+#endif
+
+static int
+is_del (char c)
+{
+       switch (c)
+       {
+       case ' ':
+       case 0:
+       case '\n':
+               /*case '[':
+                  case ']': */
+       case ')':
+       case '(':
+       case '>':
+       case '<':
+               return 1;
+       }
+       return 0;
+}
+
+static void
+xtext_set_fg (GdkGC *gc, gulong pixel)
+{
+       GdkColor col;
+
+       col.pixel = pixel;
+       gdk_gc_set_foreground (gc, &col);
+}
+
+static void
+xtext_set_bg (GdkGC *gc, gulong pixel)
+{
+       GdkColor col;
+
+       col.pixel = pixel;
+       gdk_gc_set_background (gc, &col);
+}
+
+static void
+gtk_xtext_init (GtkXText * xtext)
+{
+       xtext->old_value = -1;
+       xtext->pixmap = NULL;
+       xtext->text_first = NULL;
+       xtext->text_last = NULL;
+       xtext->io_tag = -1;
+       xtext->add_io_tag = -1;
+       xtext->scroll_tag = -1;
+/*   xtext->frozen = 0;*/
+       xtext->num_lines = 0;
+       xtext->max_lines = 0;
+       xtext->col_back = 19;
+       xtext->col_fore = 18;
+       xtext->nc = 0;
+       xtext->scrollbar_down = TRUE;
+       xtext->bold = FALSE;
+       xtext->underline = FALSE;
+       xtext->reverse = FALSE;
+       xtext->time_stamp = FALSE;
+       xtext->font = NULL;
+       xtext->error_function = NULL;
+       xtext->urlcheck_function = NULL;
+       xtext->color_paste = FALSE;
+       xtext->skip_fills = FALSE;
+       xtext->skip_border_fills = FALSE;
+       xtext->do_underline_fills_only = FALSE;
+       xtext->tint_red = xtext->tint_green = xtext->tint_blue = TINT_VALUE;
+
+       xtext->adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 0, 1, 0, 0);
+       gtk_object_ref ((GtkObject *) xtext->adj);
+       gtk_object_sink ((GtkObject *) xtext->adj);
+
+       gtk_signal_connect (GTK_OBJECT (xtext->adj), "value_changed",
+                                                         GTK_SIGNAL_FUNC (gtk_xtext_adjustment_changed), xtext);
+       gtk_signal_connect (GTK_OBJECT (xtext), "selection_clear_event",
+                                                         GTK_SIGNAL_FUNC (gtk_xtext_selection_kill), xtext);
+       gtk_selection_add_target (GTK_WIDGET (xtext),
+                                                                         GDK_SELECTION_PRIMARY,
+                                                                         GDK_SELECTION_TYPE_STRING, 1);
+       gtk_signal_connect (GTK_OBJECT (xtext), "selection_get",
+                                                         GTK_SIGNAL_FUNC (gtk_xtext_selection_get), xtext);
+}
+
+static void
+gtk_xtext_adjustment_set (GtkXText * xtext, int fire_signal)
+{
+       GtkAdjustment *adj = xtext->adj;
+
+       adj->lower = 0;
+       adj->upper = xtext->num_lines;
+
+       adj->page_size =
+               (GTK_WIDGET (xtext)->allocation.height -
+                xtext->font->descent) / xtext->fontsize;
+       adj->page_increment = adj->page_size;
+
+       if (adj->value > adj->upper - adj->page_size)
+               adj->value = adj->upper - adj->page_size;
+
+       if (fire_signal)
+               gtk_adjustment_changed (adj);
+}
+
+static gint
+gtk_xtext_adjustment_timeout (GtkXText * xtext)
+{
+       gtk_xtext_render_page (xtext);
+       xtext->io_tag = -1;
+       return 0;
+}
+
+static void
+gtk_xtext_adjustment_changed (GtkAdjustment * adj, GtkXText * xtext)
+{
+/*   if (xtext->frozen)
+      return;*/
+
+       if ((int) xtext->old_value != (int) xtext->adj->value)
+       {
+               if (xtext->adj->value >= xtext->adj->upper - xtext->adj->page_size)
+                       xtext->scrollbar_down = TRUE;
+               else
+                       xtext->scrollbar_down = FALSE;
+
+               if (xtext->adj->value + 1 == xtext->old_value ||
+                        xtext->adj->value - 1 == xtext->old_value)     /* clicked an arrow? */
+               {
+                       if (xtext->io_tag != -1)
+                       {
+                               gtk_timeout_remove (xtext->io_tag);
+                               xtext->io_tag = -1;
+                       }
+                       gtk_xtext_render_page (xtext);
+               } else
+               {
+                       if (xtext->io_tag == -1)
+                               xtext->io_tag = gtk_timeout_add (REFRESH_TIMEOUT,
+                                                                                                                       (GtkFunction)
+                                                                                                                       gtk_xtext_adjustment_timeout,
+                                                                                                                       xtext);
+               }
+       }
+       xtext->old_value = adj->value;
+}
+
+GtkWidget *
+gtk_xtext_new (int indent, int separator)
+{
+       GtkXText *xtext;
+
+       xtext = gtk_type_new (gtk_xtext_get_type ());
+       xtext->indent = indent;
+       xtext->separator = separator;
+       xtext->wordwrap = FALSE;
+       xtext->double_buffer = FALSE;
+
+       return GTK_WIDGET (xtext);
+}
+
+static void
+gtk_xtext_destroy (GtkObject * object)
+{
+       GtkXText *xtext = GTK_XTEXT (object);
+       textentry *ent, *next;
+
+       if (xtext->add_io_tag != -1)
+       {
+               gtk_timeout_remove (xtext->add_io_tag);
+               xtext->add_io_tag = -1;
+       }
+
+       if (xtext->scroll_tag != -1)
+       {
+               gtk_timeout_remove (xtext->scroll_tag);
+               xtext->scroll_tag = -1;
+       }
+
+       if (xtext->io_tag != -1)
+       {
+               gtk_timeout_remove (xtext->io_tag);
+               xtext->io_tag = -1;
+       }
+
+       if (xtext->pixmap)
+       {
+#ifdef USE_XLIB
+               if (xtext->transparent)
+                       gtk_xtext_free_trans (xtext);
+               else
+#endif
+                       gdk_pixmap_unref (xtext->pixmap);
+               xtext->pixmap = NULL;
+       }
+
+       if (xtext->font)
+       {
+               gdk_font_unref (xtext->font);
+               xtext->font = NULL;
+       }
+
+       if (xtext->adj)
+       {
+               gtk_signal_disconnect_by_data (GTK_OBJECT (xtext->adj), xtext);
+               gtk_object_unref (GTK_OBJECT (xtext->adj));
+               xtext->adj = NULL;
+       }
+
+       if (xtext->bgc)
+       {
+               gdk_gc_destroy (xtext->bgc);
+               xtext->bgc = NULL;
+       }
+
+       if (xtext->fgc)
+       {
+               gdk_gc_destroy (xtext->fgc);
+               xtext->fgc = NULL;
+       }
+
+       if (xtext->light_gc)
+       {
+               gdk_gc_destroy (xtext->light_gc);
+               xtext->light_gc = NULL;
+       }
+
+       if (xtext->dark_gc)
+       {
+               gdk_gc_destroy (xtext->dark_gc);
+               xtext->dark_gc = NULL;
+       }
+
+       if (xtext->hand_cursor)
+       {
+               gdk_cursor_destroy (xtext->hand_cursor);
+               xtext->hand_cursor = NULL;
+       }
+
+       ent = xtext->text_first;
+       while (ent)
+       {
+               next = ent->next;
+               free (ent);
+               ent = next;
+       }
+       xtext->text_first = NULL;
+
+       if (GTK_OBJECT_CLASS (parent_class)->destroy)
+               (*GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void
+gtk_xtext_realize (GtkWidget * widget)
+{
+       GtkXText *xtext;
+       GdkWindowAttr attributes;
+       GdkGCValues val;
+       GdkColor col;
+       GdkColormap *cmap;
+
+       GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
+       xtext = GTK_XTEXT (widget);
+
+       attributes.x = widget->allocation.x;
+       attributes.y = widget->allocation.y;
+       attributes.width = widget->allocation.width;
+       attributes.height = widget->allocation.height;
+       attributes.wclass = GDK_INPUT_OUTPUT;
+       attributes.window_type = GDK_WINDOW_CHILD;
+       attributes.event_mask = gtk_widget_get_events (widget) |
+               GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
+#ifdef MOTION_MONITOR
+               | GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK;
+#else
+               | GDK_POINTER_MOTION_MASK;
+#endif
+
+       cmap = gtk_widget_get_colormap (widget);
+       attributes.colormap = cmap;
+       attributes.visual = gtk_widget_get_visual (widget);
+
+       widget->window = gdk_window_new (widget->parent->window, &attributes,
+                                                                                               GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL |
+                                                                                               GDK_WA_COLORMAP);
+
+       gdk_window_set_user_data (widget->window, widget);
+
+       xtext->depth = gdk_window_get_visual (widget->window)->depth;
+
+       val.subwindow_mode = GDK_INCLUDE_INFERIORS;
+       val.graphics_exposures = 0;
+
+       xtext->bgc = gdk_gc_new_with_values (widget->window, &val,
+                                                                                                        GDK_GC_EXPOSURES | GDK_GC_SUBWINDOW);
+       xtext->fgc = gdk_gc_new_with_values (widget->window, &val,
+                                                                                                        GDK_GC_EXPOSURES | GDK_GC_SUBWINDOW);
+       xtext->light_gc = gdk_gc_new_with_values (widget->window, &val,
+                                                                                       GDK_GC_EXPOSURES | GDK_GC_SUBWINDOW);
+       xtext->dark_gc = gdk_gc_new_with_values (widget->window, &val,
+                                                                                       GDK_GC_EXPOSURES | GDK_GC_SUBWINDOW);
+
+       /* for the separator bar (light) */
+       col.red = 0xffff; col.green = 0xffff; col.blue = 0xffff;
+       /* is setting the pixel necessary (or even correct) ?? */
+       col.pixel = (gulong)((col.red & 0xff00) * 256 +
+                                                               (col.green & 0xff00) +
+                                                               (col.blue & 0xff00) / 256);
+       gdk_color_alloc (cmap, &col);
+       gdk_gc_set_foreground (xtext->light_gc, &col);
+
+       /* for the separator bar (dark) */
+       col.red = 0x8e38; col.green = 0x8e38; col.blue = 0x9f38;
+       col.pixel = (gulong)((col.red & 0xff00) * 256 +
+                                                               (col.green & 0xff00) +
+                                                               (col.blue & 0xff00) / 256);
+       gdk_color_alloc (cmap, &col);
+       gdk_gc_set_foreground (xtext->dark_gc, &col);
+
+       if (xtext->fonttype != FONT_SET && xtext->font != NULL)
+               gdk_gc_set_font (xtext->fgc, xtext->font);
+
+       xtext_set_fg (xtext->fgc, xtext->palette[18]);
+       xtext_set_bg (xtext->fgc, xtext->palette[19]);
+       xtext_set_fg (xtext->bgc, xtext->palette[19]);
+
+#ifdef USE_XLIB
+       if (xtext->transparent)
+       {
+               gtk_xtext_load_trans (xtext);
+       } else if (xtext->pixmap)
+       {
+               gdk_gc_set_tile (xtext->bgc, xtext->pixmap);
+               gdk_gc_set_ts_origin (xtext->bgc, 0, 0);
+               gdk_gc_set_fill (xtext->bgc, GDK_TILED);
+       }
+#else
+       if (xtext->pixmap)
+       {
+               gdk_gc_set_tile (xtext->bgc, xtext->pixmap);
+               gdk_gc_set_ts_origin (xtext->bgc, 0, 0);
+               gdk_gc_set_fill (xtext->bgc, GDK_TILED);
+       }
+#endif
+
+       xtext->hand_cursor = gdk_cursor_new (GDK_HAND1);
+
+       gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
+
+       /* if not doublebuffer, draw directly to window */
+       if (!xtext->double_buffer)
+               xtext->draw_buf = widget->window;
+
+       if (xtext->auto_indent)
+               xtext->indent = 1;
+}
+
+static void
+gtk_xtext_size_request (GtkWidget * widget, GtkRequisition * requisition)
+{
+       requisition->width = GTK_XTEXT (widget)->fontwidth['Z'] * 20;
+       requisition->height = (GTK_XTEXT (widget)->fontsize * 10) + 3;
+}
+
+static void
+gtk_xtext_size_allocate (GtkWidget * widget, GtkAllocation * allocation)
+{
+       GtkXText *xtext = GTK_XTEXT (widget);
+
+       if (allocation->width == widget->allocation.width &&
+                allocation->height == widget->allocation.height &&
+                allocation->x == widget->allocation.x &&
+                allocation->y == widget->allocation.y)
+               return;
+
+       widget->allocation = *allocation;
+       if (GTK_WIDGET_REALIZED (widget))
+       {
+               gdk_window_move_resize (widget->window,
+                                                                               allocation->x, allocation->y,
+                                                                               allocation->width, allocation->height);
+               gtk_xtext_calc_lines (xtext, FALSE);
+       }
+}
+
+static void
+gtk_xtext_draw (GtkWidget * widget, GdkRectangle * area)
+{
+       int x, y;
+       GtkXText *xtext = GTK_XTEXT (widget);
+
+#ifdef USE_XLIB
+       if (xtext->transparent)
+       {
+               gdk_window_get_origin (widget->window, &x, &y);
+               /* update transparency only if it moved */
+               if (xtext->last_win_x != x || xtext->last_win_y != y)
+               {
+                       xtext->last_win_x = x;
+                       xtext->last_win_y = y;
+                       gtk_xtext_free_trans (xtext);
+                       gtk_xtext_load_trans (xtext);
+               }
+       }
+#endif
+
+       if (xtext->scrollbar_down)
+               gtk_adjustment_set_value (xtext->adj,
+                                                                                       xtext->adj->upper - xtext->adj->page_size);
+       gtk_xtext_render_page (xtext);
+}
+
+static int
+gtk_xtext_selection_clear (GtkXText * xtext)
+{
+       textentry *ent;
+       int ret = 0;
+
+       ent = xtext->last_ent_start;
+       while (ent)
+       {
+               if (ent->mark_start != -1)
+                       ret = 1;
+               ent->mark_start = -1;
+               ent->mark_end = -1;
+               if (ent == xtext->last_ent_end)
+                       break;
+               ent = ent->next;
+       }
+
+       return ret;
+}
+
+static int
+find_x_8bit (GtkXText *xtext, textentry *ent, char *text, int x, int indent)
+{
+       int xx = indent;
+       int i = 0;
+       int col = FALSE;
+       int nc = 0;
+       char *orig = text;
+       int a;
+
+       while (*text)
+       {
+               if ((col && isdigit (*text) && nc < 2) ||
+                        (col && *text == ',' && nc < 3))
+               {
+                       nc++;
+                       if (*text == ',')
+                               nc = 0;
+               } else
+               {
+                       col = FALSE;
+                       switch (*text)
+                       {
+                       case ATTR_COLOR:
+                               col = TRUE;
+                               nc = 0;
+                               break;
+                       case ATTR_BEEP:
+                       case ATTR_RESET:
+                       case ATTR_REVERSE:
+                       case ATTR_BOLD:
+                       case ATTR_UNDERLINE:
+                               break;
+                       default:
+                               a = *((unsigned char *)text);
+                               xx += xtext->fontwidth[a];
+                               if (xx >= x)
+                                       return i + (orig - ent->str);
+                       }
+               }
+               text++;
+               i++;
+               if (text - orig >= ent->str_len)
+                       return ent->str_len;
+       }
+
+       return ent->str_len;
+}
+
+static int
+find_x_general (GtkXText * xtext, textentry * ent, char *str, int x, int indent)
+{
+       int str_width;
+       int len = 1;
+
+       while (1)
+       {
+               str_width = gtk_xtext_text_width (xtext, str, len);
+               if (str_width + indent >= x)
+                       return (str + len) - ent->str;
+               len++;
+               if (len + (str - ent->str) > ent->str_len)
+                       return ent->str_len;
+               if (str_width + indent + 40 < x)
+                       len += 2;
+       }
+}
+
+static int
+find_x (GtkXText * xtext, textentry * ent, char *str, int x, int indent)
+{
+       if (xtext->fonttype == FONT_1BYTE)
+               return find_x_8bit (xtext, ent, str, x, indent);
+
+       return find_x_general (xtext, ent, str, x, indent);
+}
+
+static int
+gtk_xtext_find_x (GtkXText * xtext, int x, textentry * ent, int offset,
+                                               int line, int win_width, int *out_of_bounds)
+{
+       int indent;
+       char *str;
+
+       if (offset < 1)
+               indent = ent->indent;
+       else
+               indent = xtext->indent;
+
+       if (line > xtext->adj->page_size || line < 0)
+               return 0;
+
+       if (xtext->grid_offset[line] > ent->str_len)
+               return 0;
+
+       if (xtext->grid_offset[line] < 0)
+               return 0;
+
+       str = ent->str + xtext->grid_offset[line];
+
+       if (x < indent)
+       {
+               *out_of_bounds = 1;
+               return (str - ent->str);
+       }
+
+       *out_of_bounds = 0;
+
+       return find_x (xtext, ent, str, x, indent);
+}
+
+static textentry *
+gtk_xtext_find_char (GtkXText * xtext, int x, int y, int *off,
+                                                       int *out_of_bounds)
+{
+       textentry *ent;
+       int line;
+       int subline;
+       int win_width;
+
+       gdk_window_get_size (GTK_WIDGET (xtext)->window, &win_width, 0);
+       win_width -= MARGIN;
+
+       line = (y - xtext->font->descent) / xtext->fontsize;
+
+       subline = xtext->pagetop_subline;
+       ent = gtk_xtext_nth (xtext, xtext->pagetop_ent, line, win_width, &subline);
+       if (!ent)
+               return 0;
+
+       if (off)
+               *off = gtk_xtext_find_x (xtext, x, ent, subline, line, win_width,
+                                                               out_of_bounds);
+
+       return ent;
+}
+
+static gint
+gtk_xtext_expose (GtkWidget * widget, GdkEventExpose * event)
+{
+       GtkXText *xtext = GTK_XTEXT (widget);
+       textentry *ent_start, *ent_end;
+
+       if (xtext->double_buffer)
+       {
+               gtk_xtext_render_page (xtext);
+               return FALSE;
+       }
+
+       gdk_draw_rectangle (xtext->draw_buf, xtext->bgc, 1,
+                                                         event->area.x, event->area.y,
+                                                         event->area.width, event->area.height);
+
+       ent_start = gtk_xtext_find_char (xtext, event->area.x, event->area.y,
+                                                                                               NULL, NULL);
+       ent_end = gtk_xtext_find_char (xtext, event->area.x + event->area.width,
+                                               event->area.y + event->area.height, NULL, NULL);
+
+       xtext->skip_fills = TRUE;
+       xtext->skip_border_fills = TRUE;
+
+       gtk_xtext_render_ents (xtext, ent_start, ent_end, TRUE);
+
+       xtext->skip_fills = FALSE;
+       xtext->skip_border_fills = FALSE;
+
+       return FALSE;
+}
+
+static void
+gtk_xtext_selection_draw (GtkXText * xtext, GdkEventMotion * event)
+{
+       textentry *ent;
+       textentry *ent_end;
+       textentry *ent_start;
+       int offset_start;
+       int offset_end;
+       int low_x;
+       int low_y;
+       int high_x;
+       int high_y;
+       int tmp;
+
+       if (xtext->select_start_y > xtext->select_end_y)
+       {
+               low_x = xtext->select_end_x;
+               low_y = xtext->select_end_y;
+               high_x = xtext->select_start_x;
+               high_y = xtext->select_start_y;
+       } else
+       {
+               low_x = xtext->select_start_x;
+               low_y = xtext->select_start_y;
+               high_x = xtext->select_end_x;
+               high_y = xtext->select_end_y;
+       }
+
+       ent_start = gtk_xtext_find_char (xtext, low_x, low_y, &offset_start, &tmp);
+       ent_end = gtk_xtext_find_char (xtext, high_x, high_y, &offset_end, &tmp);
+
+       if (ent_start && !ent_end)
+       {
+               ent_end = xtext->text_last;
+               offset_end = ent_end->str_len;
+       }
+
+       if (!ent_start || !ent_end)
+       {
+               if (xtext->adj->value != xtext->old_value)
+                       gtk_xtext_render_page (xtext);
+               return;
+       }
+
+       gtk_xtext_selection_clear (xtext);
+
+       /* marking less than a complete line? */
+       if (ent_start == ent_end)
+       {
+               ent_start->mark_start = MIN (offset_start, offset_end);
+               ent_start->mark_end = MAX (offset_end, offset_start);
+               if (offset_start == offset_end)
+                       ent_start->mark_end++;
+       } else
+       {
+               ent_start->mark_start = offset_start;
+               ent_start->mark_end = ent_start->str_len;
+
+               if (offset_end != 0)
+               {
+                       ent_end->mark_start = 0;
+                       ent_end->mark_end = offset_end;
+               }
+       }
+
+       if (ent_start != ent_end)
+       {
+               ent = ent_start->next;
+               while (ent && ent != ent_end)
+               {
+                       ent->mark_start = 0;
+                       ent->mark_end = ent->str_len;
+                       ent = ent->next;
+               }
+       }
+
+       /* has the selection changed? Dont render unless necessary */
+       if (xtext->last_ent_start == ent_start &&
+                xtext->last_ent_end == ent_end &&
+                xtext->last_offset_start == offset_start &&
+                xtext->last_offset_end == offset_end)
+               return;
+
+       gtk_selection_owner_set (GTK_WIDGET (xtext), GDK_SELECTION_PRIMARY,
+                                                                        event->time);
+
+       if (xtext->double_buffer)
+       {
+               if (xtext->io_tag == -1)
+                       xtext->io_tag = gtk_timeout_add (REFRESH_TIMEOUT,
+                                                                                                               (GtkFunction)
+                                                                                                               gtk_xtext_adjustment_timeout,
+                                                                                                               xtext);
+       } else
+       {
+               ent = xtext->last_ent_end;
+               if (ent)
+                       if (ent->next == ent_end)
+                               ent = ent_end;
+               xtext->skip_border_fills = TRUE;
+               gtk_xtext_render_ents (xtext, xtext->last_ent_start, ent, TRUE);
+               xtext->skip_border_fills = FALSE;
+               xtext->old_ent_start = xtext->last_ent_start;
+               xtext->old_ent_end = xtext->last_ent_end;
+       }
+
+       xtext->last_ent_start = ent_start;
+       xtext->last_ent_end = ent_end;
+       xtext->last_offset_start = offset_start;
+       xtext->last_offset_end = offset_end;
+}
+
+static gint
+gtk_xtext_scrolldown_timeout (GtkXText * xtext)
+{
+       int p_y, win_height;
+
+       gdk_window_get_pointer (GTK_WIDGET (xtext)->window, 0, &p_y, 0);
+       gdk_window_get_size (GTK_WIDGET (xtext)->window, 0, &win_height);
+
+       if (p_y > win_height &&
+                xtext->adj->value < (xtext->adj->upper - xtext->adj->page_size))
+       {
+               xtext->adj->value++;
+               gtk_adjustment_changed (xtext->adj);
+               gtk_xtext_render_page (xtext);
+               return 1;
+       }
+
+       xtext->scroll_tag = -1;
+       return 0;
+}
+
+static gint
+gtk_xtext_scrollup_timeout (GtkXText * xtext)
+{
+       int p_y;
+
+       gdk_window_get_pointer (GTK_WIDGET (xtext)->window, 0, &p_y, 0);
+
+       if (p_y < 0 && xtext->adj->value > 0.0)
+       {
+               xtext->adj->value--;
+               gtk_adjustment_changed (xtext->adj);
+               gtk_xtext_render_page (xtext);
+               return 1;
+       }
+
+       xtext->scroll_tag = -1;
+       return 0;
+}
+
+static void
+gtk_xtext_selection_update (GtkXText * xtext, GdkEventMotion * event, int p_y)
+{
+       int win_height;
+       int moved;
+
+       gdk_window_get_size (GTK_WIDGET (xtext)->window, 0, &win_height);
+
+       /* selecting past top of window, scroll up! */
+       if (p_y < 0 && xtext->adj->value >= 0)
+       {
+               if (xtext->scroll_tag == -1)
+                       xtext->scroll_tag = gtk_timeout_add (100,
+                                                                                                                        (GtkFunction)
+                                                                                                                        gtk_xtext_scrollup_timeout,
+                                                                                                                        xtext);
+               return;
+       }
+
+       /* selecting past bottom of window, scroll down! */
+       if (p_y > win_height &&
+                xtext->adj->value < (xtext->adj->upper - xtext->adj->page_size))
+       {
+               if (xtext->scroll_tag == -1)
+                       xtext->scroll_tag = gtk_timeout_add (100,
+                                                                                                                        (GtkFunction)
+                                                                                                                        gtk_xtext_scrolldown_timeout,
+                                                                                                                        xtext);
+               return;
+       }
+
+       moved = xtext->adj->value - xtext->select_start_adj;
+       xtext->select_start_y -= (moved * xtext->fontsize);
+       xtext->select_start_adj = xtext->adj->value;
+       gtk_xtext_selection_draw (xtext, event);
+}
+
+static char *
+gtk_xtext_get_word (GtkXText * xtext, int x, int y, textentry ** ret_ent,
+                                                 int *ret_off, int *ret_len)
+{
+       textentry *ent;
+       int offset;
+       char *str;
+       char *word;
+       int len;
+       int out_of_bounds;
+
+       ent = gtk_xtext_find_char (xtext, x, y, &offset, &out_of_bounds);
+       if (!ent)
+               return 0;
+
+       if (out_of_bounds)
+               return 0;
+
+       if (offset == ent->str_len)
+               return 0;
+
+       if (offset < 1)
+               return 0;
+
+       offset--;
+
+       str = ent->str + offset;
+
+       while (!is_del (*str) && str != ent->str)
+               str--;
+       word = str + 1;
+
+       len = 0;
+       str = word;
+       while (!is_del (*str) && len != ent->str_len)
+       {
+               str++;
+               len++;
+       }
+
+       if (ret_ent)
+               *ret_ent = ent;
+       if (ret_off)
+               *ret_off = word - ent->str;
+       if (ret_len)
+               *ret_len = str - word;
+
+       word = gtk_xtext_strip_color (word, len, NULL, NULL);
+
+       return word;
+}
+
+static gint
+gtk_xtext_leave_notify (GtkWidget * widget, GdkEventCrossing * event)
+{
+#ifdef MOTION_MONITOR
+       GtkXText *xtext = GTK_XTEXT (widget);
+
+       if (xtext->cursor_hand)
+       {
+               xtext->hilight_start = -1;
+               xtext->hilight_end = -1;
+               xtext->cursor_hand = FALSE;
+               gdk_window_set_cursor (widget->window, 0);
+               xtext->skip_border_fills = TRUE;
+               xtext->do_underline_fills_only = TRUE;
+               gtk_xtext_render_ents (xtext, xtext->hilight_ent, NULL, FALSE);
+               xtext->skip_border_fills = FALSE;
+               xtext->do_underline_fills_only = FALSE;
+               xtext->hilight_ent = NULL;
+       }
+#endif
+       return FALSE;
+}
+
+static gint
+gtk_xtext_motion_notify (GtkWidget * widget, GdkEventMotion * event)
+{
+       GtkXText *xtext = GTK_XTEXT (widget);
+       int tmp, x, y, offset, len;
+       char *word;
+       textentry *word_ent, *old_ent;
+
+       gdk_window_get_pointer (widget->window, &x, &y, 0);
+
+       if (xtext->moving_separator)
+       {
+               if (x < (3 * widget->allocation.width) / 5 && x > 15)
+               {
+                       tmp = xtext->indent;
+                       xtext->indent = x;
+                       gtk_xtext_fix_indent (xtext);
+                       if (tmp != xtext->indent)
+                       {
+                               gtk_xtext_recalc_widths (xtext, FALSE);
+                               if (xtext->scrollbar_down)
+                                       gtk_adjustment_set_value (xtext->adj, xtext->adj->upper -
+                                                                                                         xtext->adj->page_size);
+                               if (xtext->io_tag == -1)
+                                       xtext->io_tag = gtk_timeout_add (REFRESH_TIMEOUT,
+                                                                                                                               (GtkFunction)
+                                                                                                                               gtk_xtext_adjustment_timeout,
+                                                                                                                               xtext);
+                       }
+               }
+               return FALSE;
+       }
+
+       if (xtext->button_down)
+       {
+               gtk_grab_add (widget);
+               /*gdk_pointer_grab (widget->window, TRUE,
+                                                                       GDK_BUTTON_RELEASE_MASK |
+                                                                       GDK_BUTTON_MOTION_MASK, NULL, NULL, 0);*/
+               xtext->select_end_x = x;
+               xtext->select_end_y = y;
+               gtk_xtext_selection_update (xtext, event, y);
+               return FALSE;
+       }
+#ifdef MOTION_MONITOR
+
+       if (xtext->urlcheck_function == NULL)
+               return FALSE;
+
+       word = gtk_xtext_get_word (xtext, x, y, &word_ent, &offset, &len);
+       if (word)
+       {
+               if (xtext->urlcheck_function (xtext, word) > 0)
+               {
+                       free (word);
+                       if (!xtext->cursor_hand ||
+                                xtext->hilight_ent != word_ent ||
+                                xtext->hilight_start != offset ||
+                                xtext->hilight_end != offset + len)
+                       {
+                               if (!xtext->cursor_hand)
+                               {
+                                       gdk_window_set_cursor (GTK_WIDGET (xtext)->window,
+                                                                                                       xtext->hand_cursor);
+                                       xtext->cursor_hand = TRUE;
+                               }
+                               old_ent = xtext->hilight_ent;
+                               xtext->hilight_ent = word_ent;
+                               xtext->hilight_start = offset;
+                               xtext->hilight_end = offset + len;
+                               xtext->skip_border_fills = TRUE;
+                               xtext->do_underline_fills_only = TRUE;
+                               gtk_xtext_render_ents (xtext, old_ent, word_ent, FALSE);
+                               xtext->skip_border_fills = FALSE;
+                               xtext->do_underline_fills_only = FALSE;
+                       }
+                       return FALSE;
+               }
+               free (word);
+       }
+
+       gtk_xtext_leave_notify (widget, NULL);
+
+#endif
+
+       return FALSE;
+}
+
+static gint
+gtk_xtext_button_release (GtkWidget * widget, GdkEventButton * event)
+{
+       GtkXText *xtext = GTK_XTEXT (widget);
+       char *word;
+
+       if (xtext->moving_separator)
+       {
+               xtext->moving_separator = FALSE;
+               if (event->x < (4 * widget->allocation.width) / 5 && event->x > 15)
+               {
+                       xtext->indent = event->x;
+               }
+               gtk_xtext_fix_indent (xtext);
+               gtk_xtext_recalc_widths (xtext, FALSE);
+               gtk_xtext_adjustment_set (xtext, TRUE);
+               gtk_xtext_render_page (xtext);
+               return FALSE;
+       }
+
+       if (xtext->word_or_line_select)
+       {
+               xtext->word_or_line_select = FALSE;
+               xtext->button_down = FALSE;
+               return FALSE;
+       }
+
+       if (event->button == 1)
+       {
+               xtext->button_down = FALSE;
+
+               gtk_grab_remove (widget);
+               /*gdk_pointer_ungrab (0);*/
+
+               if (xtext->select_start_x == event->x &&
+                        xtext->select_start_y == event->y)
+               {
+                       if (gtk_xtext_selection_clear (xtext))
+                               gtk_xtext_render_page (xtext);
+               } else
+               {
+                       word = gtk_xtext_get_word (xtext, event->x, event->y, 0, 0, 0);
+                       if (word)
+                       {
+                               gtk_signal_emit (GTK_OBJECT (xtext), xtext_signals[WORD_CLICK],
+                                                                         word, event);
+                               free (word);
+                               return FALSE;
+                       }
+               }
+       }
+
+       return FALSE;
+}
+
+static gint
+gtk_xtext_button_press (GtkWidget * widget, GdkEventButton * event)
+{
+       GtkXText *xtext = GTK_XTEXT (widget);
+       textentry *ent;
+       char *word;
+       int line_x, x, y, offset, len;
+       gfloat new_value;
+
+       gdk_window_get_pointer (widget->window, &x, &y, 0);
+
+       if (event->button == 3)           /* right click */
+       {
+               word = gtk_xtext_get_word (xtext, x, y, 0, 0, 0);
+               if (word)
+               {
+                       gtk_signal_emit (GTK_OBJECT (xtext), xtext_signals[WORD_CLICK],
+                                                                 word, event);
+                       free (word);
+               } else
+                       gtk_signal_emit (GTK_OBJECT (xtext), xtext_signals[WORD_CLICK],
+                                                                 "", event);
+               return FALSE;
+       }
+
+       if (event->button == 4)           /* mouse wheel pageUp */
+       {
+               new_value = xtext->adj->value - xtext->adj->page_increment;
+               if (new_value < xtext->adj->lower)
+                       new_value = xtext->adj->lower;
+               gtk_adjustment_set_value (xtext->adj, new_value);
+               return FALSE;
+       }
+
+       if (event->button == 5)           /* mouse wheel pageDn */
+       {
+               new_value = xtext->adj->value + xtext->adj->page_increment;
+               if (new_value > (xtext->adj->upper - xtext->adj->page_size))
+                       new_value = xtext->adj->upper - xtext->adj->page_size;
+               gtk_adjustment_set_value (xtext->adj, new_value);
+               return FALSE;
+       }
+
+       if (event->button == 2)
+       {
+               gtk_signal_emit (GTK_OBJECT (xtext), xtext_signals[WORD_CLICK], "", event);
+               return FALSE;
+       }
+
+       if (event->button != 1)           /* we only want left button */
+               return FALSE;
+
+       if (event->type == GDK_2BUTTON_PRESS)   /* WORD select */
+       {
+               word = gtk_xtext_get_word (xtext, x, y, &ent, &offset, &len);
+               if (word)
+               {
+                       free (word);
+                       if (len == 0)
+                               return FALSE;
+                       gtk_xtext_selection_clear (xtext);
+                       ent->mark_start = offset;
+                       ent->mark_end = offset + len;
+                       xtext->last_ent_start = ent;
+                       xtext->last_ent_end = ent;
+                       gtk_xtext_render_page (xtext);
+                       xtext->word_or_line_select = TRUE;
+                       gtk_selection_owner_set (widget, GDK_SELECTION_PRIMARY, event->time);
+               }
+
+               return FALSE;
+       }
+
+       if (event->type == GDK_3BUTTON_PRESS)   /* LINE select */
+       {
+               word = gtk_xtext_get_word (xtext, x, y, &ent, 0, 0);
+               if (word)
+               {
+                       free (word);
+                       gtk_xtext_selection_clear (xtext);
+                       ent->mark_start = 0;
+                       ent->mark_end = ent->str_len;
+                       xtext->last_ent_start = ent;
+                       xtext->last_ent_end = ent;
+                       gtk_xtext_render_page (xtext);
+                       xtext->word_or_line_select = TRUE;
+                       gtk_selection_owner_set (widget, GDK_SELECTION_PRIMARY, event->time);
+               }
+
+               return FALSE;
+       }
+
+       /* check if it was a separator-bar click */
+       if (xtext->separator && xtext->indent)
+       {
+               line_x = xtext->indent - ((xtext->space_width + 1) / 2);
+               if (line_x == x || line_x == x + 1 || line_x == x - 1)
+               {
+                       xtext->moving_separator = TRUE;
+                       gtk_xtext_render_page (xtext);
+                       return FALSE;
+               }
+       }
+
+       xtext->button_down = TRUE;
+
+       xtext->select_start_x = x;
+       xtext->select_start_y = y;
+
+       xtext->select_start_adj = xtext->adj->value;
+
+       return FALSE;
+}
+
+/* another program has claimed the selection */
+
+static gint
+gtk_xtext_selection_kill (GtkWidget * widget, GdkEventSelection * event)
+{
+       if (gtk_xtext_selection_clear (GTK_XTEXT (widget)))
+               gtk_xtext_render_page (GTK_XTEXT (widget));
+       return TRUE;
+}
+
+/* another program is asking for our selection */
+
+static void
+gtk_xtext_selection_get (GtkWidget * widget,
+                                                                GtkSelectionData * selection_data_ptr,
+                                                                guint info, guint time)
+{
+       GtkXText *xtext = GTK_XTEXT (widget);
+       textentry *ent;
+       char *txt;
+       char *pos;
+       char *stripped;
+       int len;
+       int first = TRUE;
+
+       /* first find out how much we need to malloc ... */
+       len = 0;
+       ent = xtext->text_first;
+       while (ent)
+       {
+               if (ent->mark_start != -1)
+               {
+                       if (ent->mark_end - ent->mark_start > 0)
+                               len += (ent->mark_end - ent->mark_start) + 1;
+                       else
+                               len++;
+               }
+               ent = ent->next;
+       }
+
+       /* now allocate mem and copy buffer */
+       pos = txt = malloc (len);
+       ent = xtext->text_first;
+       while (ent)
+       {
+               if (ent->mark_start != -1)
+               {
+                       if (!first)
+                       {
+                               *pos = '\n';
+                               pos++;
+                       }
+                       first = FALSE;
+                       if (ent->mark_end - ent->mark_start > 0)
+                       {
+                               memcpy (pos, ent->str + ent->mark_start,
+                                                 ent->mark_end - ent->mark_start);
+                               pos += ent->mark_end - ent->mark_start;
+                       }
+               }
+               ent = ent->next;
+       }
+       *pos = 0;
+
+       if (xtext->color_paste)
+       {
+               gtk_selection_data_set (selection_data_ptr, GDK_SELECTION_TYPE_STRING,
+                                                                               8, txt, strlen (txt));
+       } else
+       {
+               stripped = gtk_xtext_strip_color (txt, strlen (txt), NULL, NULL);
+               gtk_selection_data_set (selection_data_ptr, GDK_SELECTION_TYPE_STRING,
+                                                                               8, stripped, strlen (stripped));
+               free (stripped);
+       }
+
+       free (txt);
+}
+
+static void
+gtk_xtext_class_init (GtkXTextClass * class)
+{
+       GtkObjectClass *object_class;
+       GtkWidgetClass *widget_class;
+       GtkXTextClass *xtext_class;
+
+       object_class = (GtkObjectClass *) class;
+       widget_class = (GtkWidgetClass *) class;
+       xtext_class = (GtkXTextClass *) class;
+
+       parent_class = gtk_type_class (gtk_widget_get_type ());
+
+       xtext_signals[WORD_CLICK] =
+               gtk_signal_new (/*name*/"word_click",
+                                                        /*GtkSignalRunType*/GTK_RUN_FIRST,
+                                                        /*GtkType*/object_class->type,
+                                                        /*funcoffset*/GTK_SIGNAL_OFFSET (GtkXTextClass, word_click),
+                                                        /*GtkSignalMarshaller*/gtk_marshal_NONE__POINTER_POINTER,
+                                                        /*returnval*/GTK_TYPE_NONE,
+                                                        /*num args*/2, /*args*/GTK_TYPE_POINTER, GTK_TYPE_POINTER);
+       gtk_object_class_add_signals (object_class, xtext_signals, LAST_SIGNAL);
+
+       object_class->destroy = gtk_xtext_destroy;
+
+       widget_class->realize = gtk_xtext_realize;
+       widget_class->size_request = gtk_xtext_size_request;
+       widget_class->size_allocate = gtk_xtext_size_allocate;
+       widget_class->button_press_event = gtk_xtext_button_press;
+       widget_class->button_release_event = gtk_xtext_button_release;
+       widget_class->motion_notify_event = gtk_xtext_motion_notify;
+       widget_class->leave_notify_event = gtk_xtext_leave_notify;
+       widget_class->draw = gtk_xtext_draw;
+       widget_class->expose_event = gtk_xtext_expose;
+
+       xtext_class->word_click = NULL;
+}
+
+guint gtk_xtext_get_type ()
+{
+       static guint xtext_type = 0;
+
+       if (!xtext_type)
+       {
+               GtkTypeInfo xtext_info = {
+                       "GtkXText",
+                       sizeof (GtkXText),
+                       sizeof (GtkXTextClass),
+                       (GtkClassInitFunc) gtk_xtext_class_init,
+                       (GtkObjectInitFunc) gtk_xtext_init,
+                       (GtkArgSetFunc) NULL,
+                       (GtkArgGetFunc) NULL,
+               };
+
+               xtext_type = gtk_type_unique (gtk_widget_get_type (), &xtext_info);
+       }
+
+       return xtext_type;
+}
+
+/*void
+gtk_xtext_thaw (GtkXText *xtext)
+{
+   if (xtext->frozen > 0)
+      xtext->frozen--;
+
+   if (xtext->frozen == 0)
+      gtk_xtext_render_page (xtext);
+}
+
+void
+gtk_xtext_freeze (GtkXText *xtext)
+{
+   xtext->frozen++;
+}*/
+
+/* strip MIRC colors and other attribs. */
+
+char *
+gtk_xtext_strip_color (unsigned char *text, int len, char *outbuf, int *newlen)
+{
+       int nc = 0;
+       int i = 0;
+       int col = FALSE;
+       char *new_str;
+
+       if (outbuf == NULL)
+               new_str = malloc (len + 2);
+       else
+               new_str = outbuf;
+
+       while (len > 0)
+       {
+               if ((col && isdigit (*text) && nc < 2) ||
+                        (col && *text == ',' && nc < 3))
+               {
+                       nc++;
+                       if (*text == ',')
+                               nc = 0;
+               } else
+               {
+                       if (col)
+                               col = FALSE;
+                       switch (*text)
+                       {
+                       case ATTR_COLOR:
+                               col = TRUE;
+                               nc = 0;
+                               break;
+                       case ATTR_BEEP:
+                       case ATTR_RESET:
+                       case ATTR_REVERSE:
+                       case ATTR_BOLD:
+                       case ATTR_UNDERLINE:
+                               break;
+                       default:
+                               new_str[i] = *text;
+                               i++;
+                       }
+               }
+               text++;
+               len--;
+       }
+
+       new_str[i] = 0;
+
+       if (newlen != NULL)
+               *newlen = i;
+
+       return new_str;
+}
+
+/* gives width of a 8bit string - with no mIRC codes in it */
+
+static int
+gtk_xtext_text_width_simple (GtkXText * xtext, unsigned char *str, int len)
+{
+       int width = 0;
+
+       if (xtext->fixed_width_font)
+               return (xtext->space_width * len);
+
+       while (len)
+       {
+               width += xtext->fontwidth[*str];
+               len--;
+               str++;
+       }
+
+       return width;
+}
+
+/* gives width of a string, excluding the mIRC codes */
+
+static int
+gtk_xtext_text_width (GtkXText * xtext, unsigned char *text, int len)
+{
+       unsigned char *tmp, *new_buf;
+       int width, new_len;
+
+       new_buf = gtk_xtext_strip_color (text, len, xtext->scratch_buffer, &new_len);
+
+       if (xtext->fonttype == FONT_1BYTE)
+       {
+               if (xtext->fixed_width_font)
+               {
+                       width = xtext->space_width * new_len;
+               } else
+               {
+                       width = 0;
+                       tmp = new_buf;
+                       while (*tmp)
+                       {
+                               width += xtext->fontwidth[*tmp];
+                               tmp++;
+                       }
+               }
+       } else
+       {
+               width = gdk_text_width (xtext->font, new_buf, new_len);
+       }
+
+       return width;
+}
+
+/* actually draw text to screen */
+
+static int
+gtk_xtext_render_flush (GtkXText * xtext, int x, int y, char *str, int len,
+                                                               GdkGC *gc)
+{
+       int str_width;
+       int dofill;
+#ifdef USE_XLIB
+       XFontStruct *xfont;
+       GC xgc;
+       Drawable xdraw_buf;
+       Display *xdisplay;
+#endif
+
+       if (xtext->dont_render)
+               return 0;
+
+       if (xtext->fonttype == FONT_1BYTE)
+               str_width = gtk_xtext_text_width_simple (xtext, str, len);
+       else
+               str_width = gdk_text_width (xtext->font, str, len);
+
+       if (str_width < 1)
+               return 0;
+
+       if (!xtext->backcolor && xtext->pixmap)
+       {
+               dofill = FALSE;
+               /* draw the background pixmap behind the text - CAUSES FLICKER HERE !! */
+               if (!xtext->double_buffer && !xtext->skip_fills)
+               {
+                       if (xtext->do_underline_fills_only)
+                       {
+                               gdk_draw_rectangle (GTK_WIDGET (xtext)->window, xtext->bgc, 1,
+                                                                                 x, y + 1, str_width, 1);
+                               if (xtext->underline)           /* optimization */
+                                       goto dounder;
+                       } else
+                       {
+                               gdk_draw_rectangle (GTK_WIDGET (xtext)->window, xtext->bgc, 1,
+                                                                                 x, y - xtext->font->ascent, str_width,
+                                                                                 xtext->fontsize);
+                       }
+               }
+       } else
+       {
+               dofill = TRUE;
+               if (xtext->skip_fills && !xtext->backcolor)
+                       dofill = FALSE;
+       }
+
+#ifdef USE_XLIB
+
+       xgc = GDK_GC_XGC (gc);
+       xdraw_buf = GDK_WINDOW_XWINDOW (xtext->draw_buf);
+       xdisplay = GDK_WINDOW_XDISPLAY (GTK_WIDGET (xtext)->window);
+       xfont = GDK_FONT_XFONT (xtext->font);
+
+       switch (xtext->fonttype)
+       {
+       case FONT_1BYTE:
+               if (dofill)
+                       XDrawImageString (xdisplay, xdraw_buf, xgc, x, y, str, len);
+               else
+                       XDrawString (xdisplay, xdraw_buf, xgc, x, y, str, len);
+               if (xtext->bold)
+                       XDrawString (xdisplay, xdraw_buf, xgc, x + 1, y, str, len);
+               break;
+
+       case FONT_2BYTE:
+               len /= 2;
+               if (dofill)
+                       XDrawImageString16 (xdisplay, xdraw_buf,
+                                                                         xgc, x, y, (XChar2b *) str, len);
+               else
+                       XDrawString16 (xdisplay, xdraw_buf,
+                                                               xgc, x, y, (XChar2b *) str, len);
+               if (xtext->bold)
+                       XDrawString16 (xdisplay, xdraw_buf,
+                                                               xgc, x + 1, y, (XChar2b *) str, len);
+               break;
+
+       case FONT_SET:
+               if (dofill)
+                       XmbDrawImageString (xdisplay, xdraw_buf,
+                                                                         (XFontSet) xfont, xgc, x, y, str, len);
+               else
+                       XmbDrawString (xdisplay, xdraw_buf,
+                                                               (XFontSet) xfont, xgc, x, y, str, len);
+               if (xtext->bold)
+                       XmbDrawString (xdisplay, xdraw_buf,
+                                                               (XFontSet) xfont, xgc, x + 1, y, str, len);
+       }
+
+#else
+
+       /* don't have Xlib, gdk version --- */
+       if (dofill)
+       {
+               GdkGCValues val;
+               gdk_gc_get_values (gc, &val);
+               xtext_set_fg (gc, val.background.pixel);
+               gdk_draw_rectangle (xtext->draw_buf, gc, 1,
+                                                               x, y - xtext->font->ascent, str_width,
+                                                               xtext->fontsize);
+               xtext_set_fg (gc, val.foreground.pixel);
+       }
+       gdk_draw_text (xtext->draw_buf, xtext->font, gc, x, y, str, len);
+       if (xtext->bold)
+               gdk_draw_text (xtext->draw_buf, xtext->font, gc, x + 1, y, str, len);
+
+#endif
+
+       if (xtext->underline)
+dounder:
+               gdk_draw_line (xtext->draw_buf, gc, x, y+1, x+str_width-1, y+1);
+
+       return str_width;
+}
+
+static void
+gtk_xtext_reset (GtkXText * xtext, int mark, int attribs)
+{
+       if (attribs)
+       {
+               xtext->underline = FALSE;
+               xtext->bold = FALSE;
+       }
+       if (!mark)
+       {
+               xtext->backcolor = FALSE;
+               if (xtext->col_fore != 18)
+                       xtext_set_fg (xtext->fgc, xtext->palette[18]);
+               if (xtext->col_back != 19)
+                       xtext_set_bg (xtext->fgc, xtext->palette[19]);
+       }
+       xtext->col_fore = 18;
+       xtext->col_back = 19;
+}
+
+/* render a single line, which WONT wrap, and parse mIRC colors */
+
+static void
+gtk_xtext_render_str (GtkXText * xtext, int y, textentry * ent, char *str,
+                                                        int len, int win_width, int indent, int line)
+{
+       GdkGC *gc;
+       int i = 0, x = indent, j = 0;
+       char *pstr = str;
+       int col_num, tmp;
+       int offset;
+       int mark = FALSE;
+       int hilight = FALSE;
+
+       offset = str - ent->str;
+
+       if (line < 255 && line >= 0)
+               xtext->grid_offset[line] = offset;
+
+       gc = xtext->fgc;                                  /* our foreground GC */
+
+       if (ent->mark_start != -1 &&
+                ent->mark_start <= i + offset && ent->mark_end > i + offset)
+       {
+               xtext_set_bg (gc, xtext->palette[16]);
+               xtext_set_fg (gc, xtext->palette[17]);
+               xtext->backcolor = TRUE;
+               mark = TRUE;
+       }
+#ifdef MOTION_MONITOR
+       if (xtext->hilight_ent == ent &&
+                xtext->hilight_start <= i + offset && xtext->hilight_end > i + offset)
+       {
+               xtext->underline = TRUE;
+/*      xtext->bold = TRUE;*/
+               hilight = TRUE;
+       }
+#endif
+
+       if (!xtext->double_buffer)
+       {
+               /* draw background to the left of the text */
+               if (str == ent->str && indent && xtext->time_stamp)
+               {
+                       /* don't overwrite the timestamp */
+                       if (indent > xtext->stamp_width)
+                       {
+                               if (!xtext->skip_border_fills)
+                                       gdk_draw_rectangle (xtext->draw_buf, xtext->bgc, 1, 
+                                                                        xtext->stamp_width, y - xtext->font->ascent,
+                                                                        indent - xtext->stamp_width, xtext->fontsize);
+                       }
+               } else
+               {
+                       /* fill the indent area with background gc */
+                       if (!xtext->skip_border_fills)
+                               gdk_draw_rectangle (xtext->draw_buf, xtext->bgc, 1, 
+                                                                0, y - xtext->font->ascent, indent, xtext->fontsize);
+               }
+       }
+
+       while (i < len)
+       {
+
+#ifdef MOTION_MONITOR
+               if (xtext->hilight_ent == ent && xtext->hilight_start == (i + offset))
+               {
+                       x += gtk_xtext_render_flush (xtext, x, y, pstr, j, gc);
+                       pstr += j;
+                       j = 0;
+                       xtext->underline = TRUE;
+/*         xtext->bold = TRUE;*/
+                       hilight = TRUE;
+               }
+#endif
+
+               if (!mark && ent->mark_start == (i + offset))
+               {
+                       x += gtk_xtext_render_flush (xtext, x, y, pstr, j, gc);
+                       pstr += j;
+                       j = 0;
+                       xtext_set_bg (gc, xtext->palette[16]);
+                       xtext_set_fg (gc, xtext->palette[17]);
+                       xtext->backcolor = TRUE;
+                       mark = TRUE;
+               }
+
+               if ((xtext->parsing_color && isdigit (str[i]) && xtext->nc < 2) ||
+                        (xtext->parsing_color && str[i] == ',' && xtext->nc < 3))
+               {
+                       pstr++;
+                       if (str[i] == ',')
+                       {
+                               xtext->parsing_backcolor = TRUE;
+                               if (xtext->nc)
+                               {
+                                       xtext->num[xtext->nc] = 0;
+                                       xtext->nc = 0;
+                                       col_num = atoi (xtext->num) % 16;
+                                       xtext->col_fore = col_num;
+                                       if (!mark)
+                                               xtext_set_fg (gc, xtext->palette[col_num]);
+                               }
+                       } else
+                       {
+                               xtext->num[xtext->nc] = str[i];
+                               if (xtext->nc < 7)
+                                       xtext->nc++;
+                       }
+               } else
+               {
+                       if (xtext->parsing_color)
+                       {
+                               xtext->parsing_color = FALSE;
+                               if (xtext->nc)
+                               {
+                                       xtext->num[xtext->nc] = 0;
+                                       xtext->nc = 0;
+                                       col_num = atoi (xtext->num);
+                                       if (col_num == 99)      /* mIRC lameness */
+                                               col_num = 19;
+                                       else
+                                               col_num = col_num % 16;
+                                       if (xtext->parsing_backcolor)
+                                       {
+                                               if (col_num == 1)
+                                                       xtext->backcolor = FALSE;
+                                               else
+                                                       xtext->backcolor = TRUE;
+                                               if (!mark)
+                                                       xtext_set_bg (gc, xtext->palette[col_num]);
+                                               xtext->col_back = col_num;
+                                       } else
+                                       {
+                                               if (!mark)
+                                                       xtext_set_fg (gc, xtext->palette[col_num]);
+                                               xtext->col_fore = col_num;
+                                       }
+                                       xtext->parsing_backcolor = FALSE;
+                               } else
+                               {
+                                       /* got a \003<non-digit>... i.e. reset colors */
+                                       x += gtk_xtext_render_flush (xtext, x, y, pstr, j, gc);
+                                       pstr += j;
+                                       j = 0;
+                                       gtk_xtext_reset (xtext, mark, FALSE);
+                               }
+                       }
+
+                       switch (str[i])
+                       {
+                       case '\t':
+                               str[i] = ' ';
+                               j++;
+                               break;
+                       case '\n':
+                       case ATTR_BEEP:
+                               break;
+                       case ATTR_REVERSE:
+                               x += gtk_xtext_render_flush (xtext, x, y, pstr, j, gc);
+                               pstr += j + 1;
+                               j = 0;
+                               tmp = xtext->col_fore;
+                               xtext->col_fore = xtext->col_back;
+                               xtext->col_back = tmp;
+                               if (!mark)
+                               {
+                                       xtext_set_fg (gc, xtext->palette[xtext->col_fore]);
+                                       xtext_set_bg (gc, xtext->palette[xtext->col_back]);
+                               }
+                               if (xtext->col_back != 19)
+                                       xtext->backcolor = TRUE;
+                               else
+                                       xtext->backcolor = FALSE;
+                               break;
+                       case ATTR_BOLD:
+                               x += gtk_xtext_render_flush (xtext, x, y, pstr, j, gc);
+                               xtext->bold = !xtext->bold;
+                               pstr += j + 1;
+                               j = 0;
+                               break;
+                       case ATTR_UNDERLINE:
+                               x += gtk_xtext_render_flush (xtext, x, y, pstr, j, gc);
+                               xtext->underline = !xtext->underline;
+                               pstr += j + 1;
+                               j = 0;
+                               break;
+                       case ATTR_RESET:
+                               x += gtk_xtext_render_flush (xtext, x, y, pstr, j, gc);
+                               pstr += j + 1;
+                               j = 0;
+                               gtk_xtext_reset (xtext, mark, !hilight);
+                               break;
+                       case ATTR_COLOR:
+                               x += gtk_xtext_render_flush (xtext, x, y, pstr, j, gc);
+                               xtext->parsing_color = TRUE;
+                               pstr += j + 1;
+                               j = 0;
+                               break;
+                       default:
+                               j++;
+                       }
+               }
+               i++;
+
+#ifdef MOTION_MONITOR
+               if (xtext->hilight_ent == ent && xtext->hilight_end == (i + offset))
+               {
+                       x += gtk_xtext_render_flush (xtext, x, y, pstr, j, gc);
+                       pstr += j;
+                       j = 0;
+                       xtext->underline = FALSE;
+/*         xtext->bold = FALSE;*/
+                       hilight = FALSE;
+               }
+#endif
+
+               if (mark && ent->mark_end == (i + offset))
+               {
+                       x += gtk_xtext_render_flush (xtext, x, y, pstr, j, gc);
+                       pstr += j;
+                       j = 0;
+                       xtext_set_bg (gc, xtext->palette[xtext->col_back]);
+                       xtext_set_fg (gc, xtext->palette[xtext->col_fore]);
+                       if (xtext->col_back != 19)
+                               xtext->backcolor = TRUE;
+                       else
+                               xtext->backcolor = FALSE;
+                       mark = FALSE;
+               }
+       }
+
+       if (j)
+               x += gtk_xtext_render_flush (xtext, x, y, pstr, j, gc);
+
+       if (!xtext->double_buffer)
+       {
+               /* draw separator now so it doesn't appear to flicker */
+               gtk_xtext_draw_sep (xtext, y + 1);
+               /* draw background to the right of the text */
+               if (!xtext->skip_border_fills)
+                       gdk_draw_rectangle (xtext->draw_buf, xtext->bgc, 1, 
+                                                        x, y - xtext->font->ascent, (win_width + MARGIN) - x,
+                                                        xtext->fontsize);
+       }
+}
+
+#ifdef USE_XLIB
+
+/* get the desktop/root window - thanks Eterm */
+
+static Window desktop_window = None;
+
+Window
+get_desktop_window (Window the_window)
+{
+       Atom prop, type, prop2;
+       int format;
+       unsigned long length, after;
+       unsigned char *data;
+       unsigned int nchildren;
+       Window w, root, *children, parent;
+
+       prop = XInternAtom (GDK_DISPLAY (), "_XROOTPMAP_ID", True);
+       prop2 = XInternAtom (GDK_DISPLAY (), "_XROOTCOLOR_PIXEL", True);
+
+       if (prop == None && prop2 == None)
+               return None;
+
+       for (w = the_window; w; w = parent)
+       {
+               if ((XQueryTree (GDK_DISPLAY (), w, &root, &parent, &children,
+                               &nchildren)) == False)
+                       return None;
+
+               if (nchildren)
+                       XFree (children);
+
+               if (prop != None)
+               {
+                       XGetWindowProperty (GDK_DISPLAY (), w, prop, 0L, 1L, False,
+                                                                         AnyPropertyType, &type, &format, &length, &after,
+                                                                         &data);
+               } else
+               {
+                       XGetWindowProperty (GDK_DISPLAY (), w, prop2, 0L, 1L, False,
+                                                                         AnyPropertyType, &type, &format, &length, &after,
+                                                                         &data);
+               }
+
+               if (data)
+                       XFree (data);
+
+               if (type != None)
+               {
+                       return (desktop_window = w);
+               }
+       }
+
+       return (desktop_window = None);
+}
+
+/* stolen from zvt, which was stolen from Eterm */
+
+static Pixmap
+get_pixmap_prop (Window the_window)
+{
+       Atom prop, type;
+       int format;
+       unsigned long length, after;
+       unsigned char *data;
+       Pixmap pix = None;
+
+       if (desktop_window == None)
+               desktop_window = get_desktop_window (the_window);
+       if (desktop_window == None)
+               desktop_window = GDK_ROOT_WINDOW ();
+
+       prop = XInternAtom (GDK_DISPLAY (), "_XROOTPMAP_ID", True);
+       if (prop == None)
+               return None;
+
+       XGetWindowProperty (GDK_DISPLAY (), desktop_window, prop, 0L, 1L, False,
+                                                         AnyPropertyType, &type, &format, &length, &after,
+                                                         &data);
+       if (data)
+       {
+               if (type == XA_PIXMAP)
+                       pix = *((Pixmap *) data);
+
+               XFree (data);
+       }
+
+       return pix;
+}
+
+#ifdef USE_GDK_PIXBUF
+
+static GdkPixmap *
+create_shaded_pixmap (GtkXText * xtext, Pixmap p, int x, int y, int w, int h)
+{
+       GdkPixmap *pp, *tmp, *shaded_pixmap;
+       GdkPixbuf *pixbuf;
+       GdkColormap *cmap;
+       GdkGC *tgc;
+       unsigned char *buf;
+       unsigned char *pbuf;
+       int width, height, depth;
+       int rowstride;
+       int pbwidth;
+       int pbheight;
+       int i, j;
+       int offset;
+       int r, g, b, a;
+
+       pp = gdk_pixmap_foreign_new (p);
+       cmap = gtk_widget_get_colormap (GTK_WIDGET (xtext));
+       gdk_window_get_geometry (pp, NULL, NULL, &width, &height, &depth);
+
+       if (width < x + w || height < y + h || x < 0 || y < 0)
+       {
+               tgc = gdk_gc_new (pp);
+               tmp = gdk_pixmap_new (pp, w, h, depth);
+               gdk_gc_set_tile (tgc, pp);
+               gdk_gc_set_fill (tgc, GDK_TILED);
+               gdk_gc_set_ts_origin (tgc, -x, -y);
+               gdk_draw_rectangle (tmp, tgc, TRUE, 0, 0, w, h);
+               gdk_gc_destroy (tgc);
+
+               pixbuf = gdk_pixbuf_get_from_drawable (NULL, tmp, cmap,
+                                                                                                                       0, 0, 0, 0, w, h);
+               gdk_pixmap_unref (tmp);
+       } else
+       {
+               pixbuf = gdk_pixbuf_get_from_drawable (NULL, pp, cmap,
+                                                                                                                       x, y, 0, 0, w, h);
+       }
+       gdk_xid_table_remove (GDK_WINDOW_XWINDOW (pp));
+       g_dataset_destroy (pp);
+       g_free (pp);
+
+       if (!pixbuf)
+               return NULL;
+
+       buf = gdk_pixbuf_get_pixels (pixbuf);
+       rowstride = gdk_pixbuf_get_rowstride (pixbuf);
+       pbwidth = gdk_pixbuf_get_width (pixbuf);
+       pbheight = gdk_pixbuf_get_height (pixbuf);
+
+       a = 128;        /* alpha */
+       r = xtext->tint_red;
+       g = xtext->tint_green;
+       b = xtext->tint_blue;
+
+       if (gdk_pixbuf_get_has_alpha (pixbuf))
+               offset = 4;
+       else
+               offset = 3;
+
+       for (i=0;i<pbheight;i++)
+       {
+               pbuf = buf;
+               for (j=0;j<pbwidth;j++)
+               {
+                       pbuf[0] = ((pbuf[0] * r) >> 8);
+                       pbuf[1] = ((pbuf[1] * g) >> 8);
+                       pbuf[2] = ((pbuf[2] * b) >> 8);
+                       pbuf+=offset;
+               }
+               buf+=rowstride;
+       }
+
+       gdk_pixbuf_render_pixmap_and_mask (pixbuf, &shaded_pixmap, NULL, 0);
+       gdk_pixbuf_unref (pixbuf);
+
+       return shaded_pixmap;
+}
+
+#endif
+
+/* free transparency xtext->pixmap */
+
+static void
+gtk_xtext_free_trans (GtkXText * xtext)
+{
+       if (xtext->pixmap)
+       {
+               if (xtext->shaded)
+               {
+                       gdk_pixmap_unref (xtext->pixmap);
+               } else
+               {
+                       gdk_xid_table_remove (GDK_WINDOW_XWINDOW (xtext->pixmap));
+                       g_dataset_destroy (xtext->pixmap);
+                       g_free (xtext->pixmap);
+               }
+               xtext->pixmap = NULL;
+       }
+}
+
+/* grab pixmap from root window and set xtext->pixmap */
+
+static void
+gtk_xtext_load_trans (GtkXText * xtext)
+{
+       Pixmap rootpix;
+       Window childret;
+       GtkWidget *widget = GTK_WIDGET (xtext);
+       int x, y;
+
+       rootpix = get_pixmap_prop (GDK_WINDOW_XWINDOW (widget->window));
+       if (rootpix == None)
+       {
+               if (xtext->error_function)
+                       xtext->error_function ("Unable to get root window pixmap!\n\n"
+                                                                                 "You may need to use Esetroot or Gnome\n"
+                                                                                 "control-center to set your background.\n");
+               xtext->transparent = FALSE;
+               return;
+       }
+
+       XTranslateCoordinates (GDK_WINDOW_XDISPLAY (widget->window),
+                                                                 GDK_WINDOW_XWINDOW (widget->window),
+                                                                 GDK_ROOT_WINDOW (), 0, 0, &x, &y, &childret);
+
+#ifdef USE_GDK_PIXBUF
+       if (xtext->shaded)
+       {
+               int width, height;
+               gdk_window_get_size (GTK_WIDGET (xtext)->window, &width, &height);
+               xtext->pixmap =
+                       create_shaded_pixmap (xtext, rootpix, x, y, width, height);
+               gdk_gc_set_tile (xtext->bgc, xtext->pixmap);
+               gdk_gc_set_ts_origin (xtext->bgc, 0, 0);
+       } else
+       {
+#endif
+               xtext->pixmap = gdk_pixmap_foreign_new (rootpix);
+               gdk_gc_set_tile (xtext->bgc, xtext->pixmap);
+               gdk_gc_set_ts_origin (xtext->bgc, -x, -y);
+#ifdef USE_GDK_PIXBUF
+       }
+#endif
+       gdk_gc_set_fill (xtext->bgc, GDK_TILED);
+}
+
+#endif
+
+/* render a single line, which may wrap to more lines */
+
+static int
+gtk_xtext_render_line (GtkXText * xtext, textentry * ent, char *str, int len,
+                                                         int line, int lines_max, int subline, int indent,
+                                                         int str_width)
+{
+       char *time_str;
+       int y;
+       int width;
+       int orig_len;
+       int ret = 1;
+       int tmp;
+
+       if (!str)
+               return 0;
+
+       if (len == -1)
+               len = strlen (str);
+       orig_len = len;
+
+       gdk_window_get_size (GTK_WIDGET (xtext)->window, &width, 0);
+       width -= MARGIN;
+
+       if (xtext->time_stamp)
+       {
+               time_str = ctime (&ent->stamp) + 10;
+               time_str[0] = '[';
+               time_str[9] = ']';
+               time_str[10] = 0;
+               y = (xtext->fontsize * line) + xtext->font->ascent;
+               gtk_xtext_render_str (xtext, y, ent, time_str, 10, width, 2, line);
+       }
+
+ startrl:
+
+       y = (xtext->fontsize * line) + xtext->font->ascent;
+
+       if (str_width == -1)
+               str_width = gtk_xtext_text_width (xtext, str, len);
+
+       str_width += indent;
+
+       tmp = 0;
+       while (str_width > width || (!is_del (str[len]) && xtext->wordwrap))
+       {
+               if (str_width <= width && !tmp)
+                       tmp = len;
+               len--;
+               if (xtext->wordwrap && tmp - len > WORDWRAP_LIMIT)
+               {
+                       len = tmp;
+                       str_width = gtk_xtext_text_width (xtext, str, len) + indent;
+                       break;
+               }
+               if (len == 0)
+                       return 1;
+
+               /* this is quite a HACK but it speeds things up! */
+               if (str_width > width + 256)
+                       len -= 10;
+               /* -- */
+
+               str_width = gtk_xtext_text_width (xtext, str, len) + indent;
+       }
+
+       if (!subline)
+       {
+               gtk_xtext_render_str (xtext, y, ent, str, len, width, indent, line);
+       } else
+       {
+               xtext->dont_render = TRUE;
+               gtk_xtext_render_str (xtext, y, ent, str, len, width, indent, line);
+               xtext->dont_render = FALSE;
+               subline--;
+               line--;
+               ret--;
+       }
+
+       if (xtext->wordwrap && str[len] == ' ')
+               len++;
+
+       if (len != orig_len && lines_max > line + 1)
+       {                                                                         /* FIXME: recursion sux! */
+/*      ret += gtk_xtext_render_line (xtext, ent, str + len, -1, line+1, lines_max, subline, xtext->indent, -1);*/
+               ret++;
+               str += len;
+               len = orig_len = strlen (str);
+               line++;
+               indent = xtext->indent;
+               str_width = -1;
+               /* FIXME: gotos suck! */
+               goto startrl;
+       }
+
+       return ret;
+}
+
+void
+gtk_xtext_set_palette (GtkXText * xtext, GdkColor palette[])
+{
+       int i;
+
+       for (i = 0; i < 20; i++)
+               xtext->palette[i] = palette[i].pixel;
+
+       if (GTK_WIDGET_REALIZED (xtext))
+       {
+               xtext_set_fg (xtext->fgc, xtext->palette[18]);
+               xtext_set_bg (xtext->fgc, xtext->palette[19]);
+               xtext_set_fg (xtext->bgc, xtext->palette[19]);
+       }
+       xtext->col_fore = 18;
+       xtext->col_back = 19;
+}
+
+static void
+gtk_xtext_fix_indent (GtkXText * xtext)
+{
+       int j;
+
+       if (xtext->indent)                        /* make indent a multiple of the space width */
+       {
+               j = 0;
+               while (j < xtext->indent)
+               {
+                       j += xtext->space_width;
+               }
+               xtext->indent = j;
+       }
+}
+
+static void
+gtk_xtext_recalc_widths (GtkXText * xtext, int do_str_width)
+{
+       textentry *ent;
+
+       /* since we have a new font, we have to recalc the text widths */
+       ent = xtext->text_first;
+       while (ent)
+       {
+               if (do_str_width)
+               {
+                       ent->str_width =
+                               gtk_xtext_text_width (xtext, ent->str, ent->str_len);
+               }
+               if (ent->left_len != -1)
+               {
+                       ent->indent =
+                               (xtext->indent -
+                                gtk_xtext_text_width (xtext, ent->str,
+                                                                                         ent->left_len)) - xtext->space_width;
+                       if (ent->indent < MARGIN)
+                               ent->indent = MARGIN;
+               }
+               ent = ent->next;
+       }
+
+       gtk_xtext_calc_lines (xtext, FALSE);
+}
+
+void
+gtk_xtext_set_font (GtkXText * xtext, GdkFont * font, char *name)
+{
+#ifdef USE_XLIB
+       unsigned char i;
+       XFontStruct *xfont;
+#endif
+
+       if (xtext->font)
+               gdk_font_unref (xtext->font);
+
+       if (font)
+       {
+               xtext->font = font;
+               gdk_font_ref (font);
+       } else
+               font = xtext->font = gdk_font_load (name);
+
+       if (!font)
+               font = xtext->font = gdk_font_load ("fixed");
+
+       switch (font->type)
+       {
+       case GDK_FONT_FONT:
+                       xtext->fontsize = font->ascent + font->descent;
+#ifdef USE_XLIB
+                       xfont = GDK_FONT_XFONT (font);
+                       if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0))
+                       {
+                               xtext->fonttype = FONT_1BYTE;
+                               for (i = 0; i < 255; i++)
+                               {
+                                       xtext->fontwidth[i] = gdk_char_width (font, i);
+                               }
+                               xtext->space_width = xtext->fontwidth[' '];
+                       } else
+                       {
+#endif
+                               /* without X11 pretend they are all 2BYTE- This is ok, just
+                                       a bit slower. */
+                               xtext->fonttype = FONT_2BYTE;
+                               xtext->space_width = gdk_char_width (font, ' ');
+#ifdef USE_XLIB
+                       }
+#endif
+                       break;
+
+       case GDK_FONT_FONTSET:
+                       xtext->fontsize = gdk_text_height (font, " ", 1);
+                       xtext->fonttype = FONT_SET;
+                       xtext->space_width = gdk_char_width (font, ' ');
+                       break;
+       }
+
+#ifdef USE_XLIB
+       xfont = GDK_FONT_XFONT (font);
+       /* check if it's a fixed width font */
+       if (xfont->min_bounds.width == xfont->max_bounds.width)
+               xtext->fixed_width_font = TRUE;
+       else
+               xtext->fixed_width_font = FALSE;
+#else
+       /* kudgy fixed-width font checking */
+       if (xtext->space_width == gdk_char_width (xtext->font, 'Z'))
+               xtext->fixed_width_font = TRUE;
+       else
+               xtext->fixed_width_font = FALSE;
+#endif
+
+       xtext->stamp_width =
+               gtk_xtext_text_width (xtext, "[88:88:88]", 10) + MARGIN;
+
+       gtk_xtext_fix_indent (xtext);
+
+       if (GTK_WIDGET_REALIZED (xtext))
+       {
+               if (xtext->fonttype != FONT_SET)
+                       gdk_gc_set_font (xtext->fgc, xtext->font);
+
+               gtk_xtext_recalc_widths (xtext, TRUE);
+       }
+}
+
+void
+gtk_xtext_set_background (GtkXText * xtext, GdkPixmap * pixmap, int trans,
+                                                                 int shaded)
+{
+       GdkGCValues val;
+
+#ifndef USE_GDK_PIXBUF
+       shaded = FALSE;
+#endif
+
+#ifndef USE_XLIB
+       shaded = FALSE;
+       trans = FALSE;
+#endif
+
+       if (xtext->pixmap)
+       {
+#ifdef USE_XLIB
+               if (xtext->transparent)
+                       gtk_xtext_free_trans (xtext);
+               else
+#endif
+                       gdk_pixmap_unref (xtext->pixmap);
+               xtext->pixmap = NULL;
+       }
+
+       xtext->transparent = trans;
+
+#ifdef USE_XLIB
+       if (trans)
+       {
+               xtext->shaded = shaded;
+               if (GTK_WIDGET_REALIZED (xtext))
+                       gtk_xtext_load_trans (xtext);
+               return;
+       }
+#endif
+
+       xtext->pixmap = pixmap;
+
+       if (pixmap != 0)
+       {
+               gdk_pixmap_ref (pixmap);
+               if (GTK_WIDGET_REALIZED (xtext))
+               {
+                       gdk_gc_set_tile (xtext->bgc, pixmap);
+                       gdk_gc_set_ts_origin (xtext->bgc, 0, 0);
+                       gdk_gc_set_fill (xtext->bgc, GDK_TILED);
+               }
+       } else
+       {
+               if (GTK_WIDGET_REALIZED (xtext))
+               {
+                       gdk_gc_destroy (xtext->bgc);
+                       val.subwindow_mode = GDK_INCLUDE_INFERIORS;
+                       val.graphics_exposures = 0;
+                       xtext->bgc = gdk_gc_new_with_values (GTK_WIDGET (xtext)->window,
+                                                                       &val, GDK_GC_EXPOSURES | GDK_GC_SUBWINDOW);
+                       xtext_set_fg (xtext->bgc, xtext->palette[19]);
+               }
+       }
+}
+
+gchar *
+gtk_xtext_get_chars (GtkXText * xtext)
+{
+       int lenght = 0;
+       gchar *chars;
+       textentry *tentry = xtext->text_first;
+       while (tentry != NULL)
+       {
+               lenght += tentry->str_len + 1;
+               tentry = tentry->next;
+       }
+       if (lenght == 0)
+               return NULL;
+       chars = g_malloc (lenght + 1);
+       *chars = 0;
+
+       tentry = xtext->text_first;
+       while (tentry != NULL)
+       {
+               strcat (chars, tentry->str);
+               strcat (chars, "\n");
+               tentry = tentry->next;
+       }
+
+       return chars;
+}
+
+static int
+gtk_xtext_lines_taken (GtkXText * xtext, textentry * ent)
+{
+       int tmp, orig_len, indent, len, win_width, str_width, lines = 0;
+       char *str;
+
+       str = ent->str;
+       len = orig_len = ent->str_len;
+       indent = ent->indent;
+
+       if (len < 2)
+               return 1;
+
+       win_width = GTK_WIDGET (xtext)->allocation.width - MARGIN;
+       str_width = ent->str_width + indent;
+
+       while (1)
+       {
+               lines++;
+               if (str_width <= win_width)
+                       break;
+               tmp = 0;
+               while (str_width > win_width || (!is_del (str[len]) && xtext->wordwrap))
+               {
+                       if (str_width <= win_width && !tmp)
+                               tmp = len;
+                       len--;
+                       if (xtext->wordwrap && tmp - len > WORDWRAP_LIMIT)
+                       {
+                               len = tmp;
+                               str_width = gtk_xtext_text_width (xtext, str, len) + indent;
+                               break;
+                       }
+                       if (len == 0)
+                               return 1;
+                       if (str_width > win_width + 256)        /* this might not work 100% but it */
+                               len -= 10;                        /* sure speeds things up ALOT!     */
+                       str_width = gtk_xtext_text_width (xtext, str, len) + indent;
+               }
+
+               if (len == orig_len)
+                       break;
+
+               if (xtext->wordwrap && str[len] == ' ')
+                       len++;
+
+               str += len;
+               indent = xtext->indent;
+               len = strlen (str);
+               str_width = gtk_xtext_text_width (xtext, str, len) + indent;
+       }
+       return lines;
+}
+
+/* Calculate number of actual lines (with wraps), to set adj->lower. *
+ * This should only be called when the window resizes.               */
+
+static void
+gtk_xtext_calc_lines (GtkXText * xtext, int fire_signal)
+{
+       textentry *ent;
+       int width;
+       int height;
+       int lines;
+
+       width = GTK_WIDGET (xtext)->allocation.width - MARGIN;
+       height = GTK_WIDGET (xtext)->allocation.height;
+
+       if (width < 30 || height < xtext->fontsize || width < xtext->indent + 30)
+               return;
+
+       lines = 0;
+       ent = xtext->text_first;
+       while (ent)
+       {
+               ent->lines_taken = gtk_xtext_lines_taken (xtext, ent);
+               lines += ent->lines_taken;
+               ent = ent->next;
+       }
+
+       xtext->pagetop_ent = NULL;
+       xtext->num_lines = lines;
+       gtk_xtext_adjustment_set (xtext, fire_signal);
+}
+
+/* find the n-th line in the linked list, this includes wrap calculations */
+
+static textentry *
+gtk_xtext_nth (GtkXText * xtext, textentry * ent, int line, int width,
+                                       int *subline)
+{
+       int lines = 0;
+
+       if (ent == NULL)
+       {
+               ent = xtext->text_first;
+               line += xtext->adj->value;
+       } else
+       {
+               lines -= *subline;
+       }
+
+       while (ent)
+       {
+               lines += ent->lines_taken;
+               if (lines > line)
+               {
+                       *subline = ent->lines_taken - (lines - line);
+                       return ent;
+               }
+               ent = ent->next;
+       }
+       return 0;
+}
+
+static void
+gtk_xtext_draw_sep (GtkXText * xtext, int y)
+{
+       int x, height;
+       GdkGC *light, *dark;
+
+       if (y == -1)
+       {
+               y = 2;
+               height = GTK_WIDGET (xtext)->allocation.height - 2;
+       } else
+       {
+               height = xtext->fontsize;
+       }
+
+       /* draw the separator line */
+       if (xtext->separator && xtext->indent)
+       {
+               light = xtext->light_gc;
+               dark = xtext->dark_gc;
+
+               x = xtext->indent - ((xtext->space_width + 1) / 2);
+               if (x < 1)
+                       return;
+
+               if (xtext->thinline)
+               {
+                       if (xtext->moving_separator)
+                               gdk_draw_line (xtext->draw_buf, light, x, y, x, height);
+                       else
+                               gdk_draw_line (xtext->draw_buf, dark, x, y, x, height);
+               } else
+               {
+                       if (xtext->moving_separator)
+                       {
+                               gdk_draw_line (xtext->draw_buf, light, x - 1, y, x - 1, height);
+                               gdk_draw_line (xtext->draw_buf, dark, x, y, x, height);
+                       } else
+                       {
+                               gdk_draw_line (xtext->draw_buf, dark, x - 1, y, x - 1, height);
+                               gdk_draw_line (xtext->draw_buf, light, x, y, x, height);
+                       }
+               }
+       }
+}
+
+/* render 2 ents (or an inclusive range) */
+
+static void
+gtk_xtext_render_ents (GtkXText * xtext, textentry * enta, textentry * entb,
+                                                         int inclusive)
+{
+       textentry *ent, *orig_ent, *tmp_ent;
+       int line;
+       int lines_taken;
+       int lines_max;
+       int width;
+       int height;
+       int subline;
+       int drawing = FALSE;
+
+       if (xtext->double_buffer)
+       {
+               gtk_xtext_render_page (xtext);
+               return;
+       }
+
+       if (xtext->indent < MARGIN)
+               xtext->indent = MARGIN;   /* 2 pixels is our left margin */
+
+       gdk_window_get_size (GTK_WIDGET (xtext)->window, &width, &height);
+       width -= MARGIN;
+
+       if (width < 32 || height < xtext->fontsize || width < xtext->indent + 30)
+               return;
+
+       lines_max = (height - xtext->font->descent) / xtext->fontsize;
+       line = 0;
+       orig_ent = xtext->pagetop_ent;
+       subline = xtext->pagetop_subline;
+
+       /* check if enta is before the start of this page */
+       if (inclusive)
+       {
+               tmp_ent = orig_ent;
+               while (tmp_ent)
+               {
+                       if (tmp_ent == enta)
+                               break;
+                       if (tmp_ent == entb)
+                       {
+                               drawing = TRUE;
+                               break;
+                       }
+                       tmp_ent = tmp_ent->next;
+               }
+       }
+
+       line = 0;
+
+       ent = orig_ent;
+       while (ent)
+       {
+               if (inclusive && ent == enta)
+                       drawing = TRUE;
+
+               if (drawing || ent == entb || ent == enta)
+               {
+                       gtk_xtext_reset (xtext, FALSE, TRUE);
+                       lines_taken = gtk_xtext_render_line (xtext, ent, ent->str,
+                                                                                                                        ent->str_len, line, lines_max,
+                                                                                                                        subline, ent->indent,
+                                                                                                                        ent->str_width);
+                       line += ent->lines_taken;
+                       line -= subline;
+                       if (ent == orig_ent)
+                               subline = 0;
+               } else
+               {
+                       if (ent == orig_ent)
+                       {
+                               line -= subline;
+                               subline = 0;
+                       }
+                       line += ent->lines_taken;
+               }
+
+               if (inclusive && ent == entb)
+                       break;
+
+               if (line >= lines_max)
+                       break;
+
+               ent = ent->next;
+       }
+
+       /* draw the separator line */
+       gtk_xtext_draw_sep (xtext, -1);
+}
+
+/* render a whole page/window, starting from 'startline' */
+
+static void
+gtk_xtext_render_page (GtkXText * xtext)
+{
+       textentry *ent;
+       int line;
+       int lines_max;
+       int width;
+       int height;
+       int subline;
+       int startline = xtext->adj->value;
+
+       if (xtext->indent < MARGIN)
+               xtext->indent = MARGIN;   /* 2 pixels is our left margin */
+
+       gdk_window_get_size (GTK_WIDGET (xtext)->window, &width, &height);
+       width -= MARGIN;
+
+       if (width < 32 || height < xtext->fontsize || width < xtext->indent + 30)
+               return;
+
+       lines_max = (height - xtext->font->descent) / xtext->fontsize;
+
+       subline = line = 0;
+       ent = xtext->text_first;
+
+       if (startline > 0)
+               ent = gtk_xtext_nth (xtext, ent, startline, width, &subline);
+
+       xtext->pagetop_ent = ent;
+       xtext->pagetop_subline = subline;
+
+       if (xtext->double_buffer)
+       {
+               xtext->tmp_pix = gdk_pixmap_new (((GtkWidget*)xtext)->window,
+                                                                                               width + MARGIN, height, xtext->depth);
+               xtext->draw_buf = xtext->tmp_pix;
+               /* render the backdrop */
+               gdk_draw_rectangle (xtext->draw_buf, xtext->bgc, 1, 0, 0,
+                                                                       width + MARGIN, height);
+       }
+
+       while (ent)
+       {
+               gtk_xtext_reset (xtext, FALSE, TRUE);
+               line +=
+                       gtk_xtext_render_line (xtext, ent, ent->str, ent->str_len, line,
+                                                                                 lines_max, subline, ent->indent,
+                                                                                 ent->str_width);
+               subline = 0;
+
+               if (line >= lines_max)
+                       break;
+
+               ent = ent->next;
+       }
+
+       if (!xtext->double_buffer)
+       {
+               line = (xtext->fontsize * line);
+               /* fill any space below the last line with our background GC */
+               gdk_draw_rectangle (xtext->draw_buf, xtext->bgc, 1,
+                                                        0, line, width + MARGIN, height - line);
+       }
+
+       /* draw the separator line */
+       gtk_xtext_draw_sep (xtext, -1);
+
+       if (xtext->double_buffer)
+       {
+               /* send our double buffer to the actual window */
+               gdk_draw_pixmap (((GtkWidget*)xtext)->window, xtext->fgc, xtext->tmp_pix,
+                                                               0, 0, 0, 0, width + MARGIN, height);
+               gdk_pixmap_unref (xtext->tmp_pix);
+       }
+}
+
+void
+gtk_xtext_refresh (GtkXText * xtext, int do_trans)
+{
+       if (GTK_WIDGET_REALIZED (GTK_WIDGET (xtext)))
+       {
+#ifdef USE_XLIB
+               if (xtext->transparent && do_trans)
+               {
+                       gtk_xtext_free_trans (xtext);
+                       gtk_xtext_load_trans (xtext);
+               }
+#endif
+               gtk_xtext_render_page (xtext);
+       }
+}
+
+/* remove the topline from the list */
+
+static void
+gtk_xtext_remove_top (GtkXText * xtext)
+{
+       textentry *ent;
+
+       ent = xtext->text_first;
+       xtext->num_lines -= ent->lines_taken;
+       xtext->pagetop_ent = NULL;
+       xtext->text_first = ent->next;
+       free (ent);
+}
+
+void
+gtk_xtext_remove_lines (GtkXText * xtext, int lines, int refresh)
+{
+       textentry *next;
+
+       while (xtext->text_first && lines)
+       {
+               next = xtext->text_first->next;
+               free (xtext->text_first);
+               xtext->text_first = next;
+               lines--;
+       }
+       if (!xtext->text_first)
+               xtext->text_last = NULL;
+
+       if (refresh)
+       {
+               gtk_xtext_calc_lines (xtext, TRUE);
+               gtk_xtext_refresh (xtext, 0);
+       }
+}
+
+void *
+gtk_xtext_search (GtkXText * xtext, char *text, void *start)
+{
+       textentry *ent, *fent;
+       char *str;
+       int line;
+
+       gtk_xtext_selection_clear (xtext);
+
+       if (start)
+               ent = ((textentry *) start)->next;
+       else
+               ent = xtext->text_first;
+       while (ent)
+       {
+               if ((str = nocasestrstr (ent->str, text)))
+               {
+                       ent->mark_start = str - ent->str;
+                       ent->mark_end = ent->mark_start + strlen (text);
+                       break;
+               }
+               ent = ent->next;
+       }
+
+       fent = ent;
+       ent = xtext->text_first;
+       line = 0;
+       while (ent)
+       {
+               line += ent->lines_taken;
+               ent = ent->next;
+               if (ent == fent)
+                       break;
+       }
+       while (line > xtext->adj->upper - xtext->adj->page_size)
+               line--;
+
+       if (fent != 0)
+       {
+               xtext->adj->value = line;
+               xtext->scrollbar_down = FALSE;
+               gtk_adjustment_changed (xtext->adj);
+       }
+       gtk_xtext_render_page (xtext);
+
+       return fent;
+}
+
+static int
+gtk_xtext_render_page_timeout (GtkXText * xtext)
+{
+       GtkAdjustment *adj = xtext->adj;
+       gfloat val;
+
+       if (xtext->scrollbar_down)
+       {
+               gtk_xtext_adjustment_set (xtext, FALSE);
+               gtk_adjustment_set_value (adj, adj->upper - adj->page_size);
+       } else
+       {
+               val = adj->value;
+               gtk_xtext_adjustment_set (xtext, TRUE);
+               gtk_adjustment_set_value (adj, val);
+       }
+
+       if (adj->value >= adj->upper - adj->page_size || adj->value < 1)
+               gtk_xtext_render_page (xtext);
+
+       xtext->add_io_tag = -1;
+
+       return 0;
+}
+
+/* append a textentry to our linked list */
+
+static void
+gtk_xtext_append_entry (GtkXText * xtext, textentry * ent)
+{
+       ent->stamp = time (0);
+       ent->str_width = gtk_xtext_text_width (xtext, ent->str, ent->str_len);
+       ent->mark_start = -1;
+       ent->mark_end = -1;
+       ent->next = NULL;
+
+       if (ent->indent < MARGIN)
+               ent->indent = MARGIN;     /* 2 pixels is the left margin */
+
+       /* append to our linked list */
+       if (xtext->text_last)
+               xtext->text_last->next = ent;
+       else
+               xtext->text_first = ent;
+       xtext->text_last = ent;
+
+       ent->lines_taken = gtk_xtext_lines_taken (xtext, ent);
+       xtext->num_lines += ent->lines_taken;
+
+       if (xtext->max_lines > 2 && xtext->max_lines < xtext->num_lines)
+       {
+               gtk_xtext_remove_top (xtext);
+       }
+
+/*   if (xtext->frozen == 0 && xtext->add_io_tag == -1)*/
+       if (xtext->add_io_tag == -1)
+       {
+               xtext->add_io_tag = gtk_timeout_add (REFRESH_TIMEOUT * 2,
+                                                                                                                (GtkFunction)
+                                                                                                                gtk_xtext_render_page_timeout,
+                                                                                                                xtext);
+       }
+}
+
+/* the main two public functions */
+
+void
+gtk_xtext_append_indent (GtkXText * xtext,
+                                                                char *left_text, int left_len,
+                                                                char *right_text, int right_len)
+{
+       textentry *ent;
+       char *str;
+       int space;
+
+       if (left_len == -1)
+               left_len = strlen (left_text);
+
+       if (right_len == -1)
+               right_len = strlen (right_text);
+
+       ent = malloc (left_len + right_len + 2 + sizeof (textentry));
+       str = (char *) ent + sizeof (textentry);
+
+       space = xtext->indent - gtk_xtext_text_width (xtext, left_text, left_len);
+
+       memcpy (str, left_text, left_len);
+       str[left_len] = ' ';
+       memcpy (str + left_len + 1, right_text, right_len);
+       str[left_len + 1 + right_len] = 0;
+
+       ent->left_len = left_len;
+       ent->str = str;
+       ent->str_len = left_len + 1 + right_len;
+       ent->indent = space - xtext->space_width;
+
+       if (xtext->time_stamp)
+               space = xtext->stamp_width;
+       else
+               space = 0;
+
+       /* do we need to auto adjust the separator position? */
+       if (xtext->auto_indent && ent->indent < MARGIN + space)
+       {
+               xtext->indent -= ent->indent;
+               xtext->indent += MARGIN;
+               xtext->indent += space;
+               if (xtext->indent > xtext->max_auto_indent)
+                       xtext->indent = xtext->max_auto_indent;
+               gtk_xtext_fix_indent (xtext);
+               gtk_xtext_recalc_widths (xtext, FALSE);
+               space =
+                       xtext->indent - gtk_xtext_text_width (xtext, left_text, left_len);
+               ent->indent = space - xtext->space_width;
+       }
+
+       gtk_xtext_append_entry (xtext, ent);
+}
+
+void
+gtk_xtext_append (GtkXText * xtext, char *text, int len)
+{
+       textentry *ent;
+
+       if (len == -1)
+               len = strlen (text);
+
+       ent = malloc (len + 1 + sizeof (textentry));
+       ent->str = (char *) ent + sizeof (textentry);
+       ent->str_len = len;
+       if (len)
+               memcpy (ent->str, text, len);
+       ent->str[len] = 0;
+       ent->indent = 0;
+       ent->left_len = -1;
+
+       gtk_xtext_append_entry (xtext, ent);
+}
diff --git a/apps/silcer/src/xtext.h b/apps/silcer/src/xtext.h
new file mode 100644 (file)
index 0000000..d1b995a
--- /dev/null
@@ -0,0 +1,182 @@
+#ifndef __XTEXT_H__
+#define __XTEXT_H__
+
+#include <gdk/gdk.h>
+#include <gtk/gtkadjustment.h>
+#include <gtk/gtkwidget.h>
+#include <time.h>
+
+/*#define GTK_XTEXT(obj)          GTK_CHECK_CAST (obj, gtk_xtext_get_type (), GtkXText)*/
+#define GTK_XTEXT(obj) ((GtkXText*)obj)
+#define GTK_XTEXT_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, gtk_xtext_get_type (), GtkXTextClass)
+#define GTK_IS_XTEXT(obj)       GTK_CHECK_TYPE (obj, gtk_xtext_get_type ())
+
+#define FONT_1BYTE 0
+#define FONT_2BYTE 1
+#define FONT_SET 2
+
+#define ATTR_BOLD '\002'
+#define ATTR_COLOR '\003'
+#define ATTR_BEEP '\007'
+#define ATTR_RESET '\017'
+#define ATTR_REVERSE '\026'
+#define ATTR_ESCAPE '\033'
+#define ATTR_UNDERLINE '\037'
+
+typedef struct _GtkXText GtkXText;
+typedef struct _GtkXTextClass GtkXTextClass;
+
+typedef struct textentry
+{
+       struct textentry *next;
+       char *str;
+       int str_width;
+       time_t stamp;
+       short str_len;
+       short mark_start;
+       short mark_end;
+       short indent;
+       short lines_taken;
+       short left_len;
+}
+textentry;
+
+struct _GtkXText
+{
+       GtkWidget widget;
+
+       GtkAdjustment *adj;
+       gfloat old_value;                                       /* last known adj->value */
+       GdkPixmap *pixmap;                              /* 0 = use palette[19] */
+       GdkDrawable *draw_buf;                  /* points to ->window or ->tmp_pix */
+       GdkPixmap *tmp_pix;                             /* double buffer */
+       GdkCursor *hand_cursor;
+
+       int ts_orig_x;
+       int ts_orig_y;
+
+       int last_win_x;
+       int last_win_y;
+       int last_win_h;
+       int last_win_w;
+
+       int tint_red;
+       int tint_green;
+       int tint_blue;
+
+       GdkGC *bgc;                                               /* backing pixmap */
+       GdkGC *fgc;                                               /* text foreground color */
+       GdkGC *light_gc;                                  /* sep bar */
+       GdkGC *dark_gc;
+       gulong palette[20];
+
+       textentry *text_first;
+       textentry *text_last;
+
+       gint io_tag;                                      /* for delayed refresh events */
+       gint add_io_tag;                                  /* "" when adding new text */
+       gint scroll_tag;                                  /* marking-scroll timeout */
+
+       GdkFont *font;
+       int fontsize;
+       int fonttype;
+       guint16 fontwidth[256];           /* each char's width, only for FONT_1BYTE type */
+       int space_width;                                  /* width (pixels) of the space " " character */
+       int stamp_width;                                  /* width of "[88:88:88]" */
+
+       int indent;                                               /* position of separator (pixels) from left */
+       int max_auto_indent;
+
+       int select_start_adj;             /* the adj->value when the selection started */
+       int select_start_x;
+       int select_start_y;
+       int select_end_x;
+       int select_end_y;
+
+       textentry *last_ent_start;        /* this basically describes the last rendered */
+       textentry *last_ent_end;          /* selection. */
+       int last_offset_start;
+       int last_offset_end;
+
+       textentry *old_ent_start;
+       textentry *old_ent_end;
+
+       int num_lines;
+       int max_lines;
+
+       int pagetop_subline;
+       textentry *pagetop_ent;                 /* what's at xtext->adj->value */
+
+       int col_fore;
+       int col_back;
+
+       int depth;                                                /* gdk window depth */
+
+/*   int frozen;*/
+
+       char num[8];                                      /* for parsing mirc color */
+       int nc;                                                   /* offset into xtext->num */
+
+       textentry *hilight_ent;
+       int hilight_start;
+       int hilight_end;
+
+       short grid_offset[256];
+
+       GtkWidget *(*error_function) (char *text);
+       int (*urlcheck_function) (GtkXText * xtext, char *word);
+
+       unsigned char scratch_buffer[4096];
+
+       unsigned int fixed_width_font:1;
+       unsigned int double_buffer:1;
+       unsigned int auto_indent:1;
+       unsigned int moving_separator:1;
+       unsigned int time_stamp:1;
+       unsigned int scrollbar_down:1;
+       unsigned int word_or_line_select:1;
+       unsigned int color_paste:1;
+       unsigned int thinline:1;
+       unsigned int parsing_backcolor:1;
+       unsigned int parsing_color:1;
+       unsigned int backcolor:1;
+       unsigned int button_down:1;
+       unsigned int bold:1;
+       unsigned int underline:1;
+       unsigned int reverse:1;
+       unsigned int transparent:1;
+       unsigned int separator:1;
+       unsigned int shaded:1;
+       unsigned int wordwrap:1;
+       unsigned int dont_render:1;
+       unsigned int cursor_hand:1;
+       unsigned int skip_fills:1;
+       unsigned int skip_border_fills:1;
+       unsigned int do_underline_fills_only:1;
+};
+
+struct _GtkXTextClass
+{
+       GtkWidgetClass parent_class;
+       void (*word_click) (GtkXText * xtext, char *word, GdkEventButton * event);
+};
+
+GtkWidget *gtk_xtext_new (int indent, int separator);
+guint gtk_xtext_get_type (void);
+void gtk_xtext_append (GtkXText * xtext, char *text, int len);
+void gtk_xtext_append_indent (GtkXText * xtext,
+                                                                               char *left_text, int left_len,
+                                                                               char *right_text, int right_len);
+void gtk_xtext_set_font (GtkXText * xtext, GdkFont * font, char *name);
+void gtk_xtext_set_background (GtkXText * xtext, GdkPixmap * pixmap,
+                                                                                int trans, int shaded);
+void gtk_xtext_set_palette (GtkXText * xtext, GdkColor palette[]);
+void gtk_xtext_remove_lines (GtkXText * xtext, int lines, int refresh);
+gchar *gtk_xtext_get_chars (GtkXText * xtext);
+void gtk_xtext_refresh (GtkXText * xtext, int do_trans);
+void gtk_xtext_thaw (GtkXText * xtext);
+void gtk_xtext_freeze (GtkXText * xtext);
+void *gtk_xtext_search (GtkXText * xtext, char *text, void *start);
+char *gtk_xtext_strip_color (unsigned char *text, int len, char *outbuf, int *newlen);
+
+#endif
diff --git a/apps/silcer/stamp-h.in b/apps/silcer/stamp-h.in
new file mode 100644 (file)
index 0000000..9788f70
--- /dev/null
@@ -0,0 +1 @@
+timestamp
diff --git a/apps/silcer/ui/SilcerMainDlg.glade b/apps/silcer/ui/SilcerMainDlg.glade
new file mode 100644 (file)
index 0000000..8f704d2
--- /dev/null
@@ -0,0 +1,429 @@
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+  <name>Silcer</name>
+  <program_name>silcer</program_name>
+  <directory></directory>
+  <source_directory>src</source_directory>
+  <pixmaps_directory>pixmaps</pixmaps_directory>
+  <language>C</language>
+  <gnome_support>True</gnome_support>
+  <gettext_support>True</gettext_support>
+  <use_widget_names>True</use_widget_names>
+  <gnome_help_support>True</gnome_help_support>
+</project>
+
+<widget>
+  <class>GnomeApp</class>
+  <name>SilcerMainDlg</name>
+  <visible>False</visible>
+  <title>Silcer</title>
+  <type>GTK_WINDOW_TOPLEVEL</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <modal>False</modal>
+  <default_width>600</default_width>
+  <default_height>400</default_height>
+  <allow_shrink>True</allow_shrink>
+  <allow_grow>True</allow_grow>
+  <auto_shrink>True</auto_shrink>
+  <enable_layout_config>True</enable_layout_config>
+
+  <widget>
+    <class>GnomeDock</class>
+    <child_name>GnomeApp:dock</child_name>
+    <name>dock1</name>
+    <allow_floating>True</allow_floating>
+    <child>
+      <padding>0</padding>
+      <expand>True</expand>
+      <fill>True</fill>
+    </child>
+
+    <widget>
+      <class>GnomeDockItem</class>
+      <name>dockitem2</name>
+      <border_width>2</border_width>
+      <placement>GNOME_DOCK_TOP</placement>
+      <band>0</band>
+      <position>0</position>
+      <offset>0</offset>
+      <locked>False</locked>
+      <exclusive>False</exclusive>
+      <never_floating>False</never_floating>
+      <never_vertical>False</never_vertical>
+      <never_horizontal>False</never_horizontal>
+      <shadow_type>GTK_SHADOW_OUT</shadow_type>
+
+      <widget>
+       <class>GtkMenuBar</class>
+       <name>SilcerMainDlgMenuBar</name>
+       <shadow_type>GTK_SHADOW_OUT</shadow_type>
+
+       <widget>
+         <class>GtkMenuItem</class>
+         <name>silcer2</name>
+         <signal>
+           <name>activate</name>
+           <handler>on_silcer2_activate</handler>
+           <last_modification_time>Fri, 16 Nov 2001 19:37:56 GMT</last_modification_time>
+         </signal>
+         <label>_Silcer</label>
+         <right_justify>False</right_justify>
+
+         <widget>
+           <class>GtkMenu</class>
+           <name>silcer2_menu</name>
+
+           <widget>
+             <class>GtkPixmapMenuItem</class>
+             <name>dfghdfh1</name>
+             <label>dfghdfh</label>
+             <right_justify>False</right_justify>
+             <stock_icon>GNOME_STOCK_MENU_SAVE</stock_icon>
+           </widget>
+         </widget>
+       </widget>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GnomeDockItem</class>
+      <name>dockitem1</name>
+      <border_width>1</border_width>
+      <placement>GNOME_DOCK_TOP</placement>
+      <band>1</band>
+      <position>0</position>
+      <offset>0</offset>
+      <locked>False</locked>
+      <exclusive>True</exclusive>
+      <never_floating>False</never_floating>
+      <never_vertical>True</never_vertical>
+      <never_horizontal>False</never_horizontal>
+      <shadow_type>GTK_SHADOW_OUT</shadow_type>
+
+      <widget>
+       <class>GtkHBox</class>
+       <name>hbox3</name>
+       <border_width>1</border_width>
+       <homogeneous>False</homogeneous>
+       <spacing>4</spacing>
+
+       <widget>
+         <class>GtkToolbar</class>
+         <name>SilcerMainDlgToolbar</name>
+         <orientation>GTK_ORIENTATION_HORIZONTAL</orientation>
+         <type>GTK_TOOLBAR_ICONS</type>
+         <space_size>8</space_size>
+         <space_style>GTK_TOOLBAR_SPACE_LINE</space_style>
+         <relief>GTK_RELIEF_NONE</relief>
+         <tooltips>True</tooltips>
+         <child>
+           <padding>0</padding>
+           <expand>False</expand>
+           <fill>False</fill>
+         </child>
+
+         <widget>
+           <class>GtkButton</class>
+           <child_name>Toolbar:button</child_name>
+           <name>button1</name>
+           <label>button1</label>
+           <stock_pixmap>GNOME_STOCK_PIXMAP_NEW</stock_pixmap>
+         </widget>
+
+         <widget>
+           <class>GtkButton</class>
+           <child_name>Toolbar:button</child_name>
+           <name>button2</name>
+           <label>button2</label>
+           <stock_pixmap>GNOME_STOCK_PIXMAP_OPEN</stock_pixmap>
+           <child>
+             <new_group>True</new_group>
+           </child>
+         </widget>
+
+         <widget>
+           <class>GtkButton</class>
+           <child_name>Toolbar:button</child_name>
+           <name>SMainHistory</name>
+           <width>30</width>
+           <height>30</height>
+           <label>_History</label>
+           <stock_pixmap>GNOME_STOCK_PIXMAP_INDEX</stock_pixmap>
+           <child>
+             <new_group>True</new_group>
+           </child>
+         </widget>
+       </widget>
+
+       <widget>
+         <class>GtkHBox</class>
+         <name>hbox5</name>
+         <border_width>1</border_width>
+         <homogeneous>False</homogeneous>
+         <spacing>3</spacing>
+         <child>
+           <padding>0</padding>
+           <expand>True</expand>
+           <fill>True</fill>
+         </child>
+
+         <widget>
+           <class>GtkLabel</class>
+           <name>label6</name>
+           <label>_Topic:</label>
+           <justify>GTK_JUSTIFY_CENTER</justify>
+           <wrap>False</wrap>
+           <xalign>0.5</xalign>
+           <yalign>0.5</yalign>
+           <xpad>0</xpad>
+           <ypad>0</ypad>
+           <default_focus_target>SMainTopicEntry</default_focus_target>
+           <child>
+             <padding>0</padding>
+             <expand>False</expand>
+             <fill>False</fill>
+           </child>
+         </widget>
+
+         <widget>
+           <class>GtkEntry</class>
+           <name>SMainTopicEntry</name>
+           <can_focus>True</can_focus>
+           <editable>True</editable>
+           <text_visible>True</text_visible>
+           <text_max_length>0</text_max_length>
+           <text></text>
+           <child>
+             <padding>5</padding>
+             <expand>True</expand>
+             <fill>True</fill>
+           </child>
+         </widget>
+       </widget>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkNotebook</class>
+      <child_name>GnomeDock:contents</child_name>
+      <name>SilcerMainDlgTab</name>
+      <can_focus>True</can_focus>
+      <show_tabs>True</show_tabs>
+      <show_border>True</show_border>
+      <tab_pos>GTK_POS_TOP</tab_pos>
+      <scrollable>False</scrollable>
+      <tab_hborder>2</tab_hborder>
+      <tab_vborder>2</tab_vborder>
+      <popup_enable>False</popup_enable>
+
+      <widget>
+       <class>GtkFrame</class>
+       <child_name>GnomeDock:contents</child_name>
+       <name>frame1</name>
+       <label_xalign>0</label_xalign>
+       <shadow_type>GTK_SHADOW_OUT</shadow_type>
+
+       <widget>
+         <class>GtkVBox</class>
+         <child_name>GnomeDock:contents</child_name>
+         <name>vbox3</name>
+         <border_width>4</border_width>
+         <homogeneous>False</homogeneous>
+         <spacing>8</spacing>
+
+         <widget>
+           <class>GtkHBox</class>
+           <name>hbox1</name>
+           <visible>False</visible>
+           <homogeneous>False</homogeneous>
+           <spacing>8</spacing>
+           <child>
+             <padding>0</padding>
+             <expand>False</expand>
+             <fill>False</fill>
+           </child>
+
+           <widget>
+             <class>GnomePixmap</class>
+             <name>pixmap1</name>
+             <filename>glade-groupchat-menu.xpm</filename>
+             <child>
+               <padding>0</padding>
+               <expand>False</expand>
+               <fill>True</fill>
+             </child>
+           </widget>
+
+           <widget>
+             <class>GtkLabel</class>
+             <name>label3</name>
+             <label></label>
+             <justify>GTK_JUSTIFY_CENTER</justify>
+             <wrap>False</wrap>
+             <xalign>0</xalign>
+             <yalign>0.5</yalign>
+             <xpad>0</xpad>
+             <ypad>0</ypad>
+             <child>
+               <padding>0</padding>
+               <expand>True</expand>
+               <fill>True</fill>
+             </child>
+           </widget>
+
+           <widget>
+             <class>GtkLabel</class>
+             <name>label4</name>
+             <label>0 users</label>
+             <justify>GTK_JUSTIFY_CENTER</justify>
+             <wrap>False</wrap>
+             <xalign>0.5</xalign>
+             <yalign>0.5</yalign>
+             <xpad>0</xpad>
+             <ypad>0</ypad>
+             <child>
+               <padding>0</padding>
+               <expand>False</expand>
+               <fill>False</fill>
+             </child>
+           </widget>
+         </widget>
+
+         <widget>
+           <class>GtkHPaned</class>
+           <name>hpaned1</name>
+           <handle_size>7</handle_size>
+           <gutter_size>8</gutter_size>
+           <child>
+             <padding>0</padding>
+             <expand>True</expand>
+             <fill>True</fill>
+           </child>
+
+           <widget>
+             <class>GtkVPaned</class>
+             <name>vpaned1</name>
+             <handle_size>7</handle_size>
+             <gutter_size>8</gutter_size>
+             <child>
+               <shrink>True</shrink>
+               <resize>True</resize>
+             </child>
+
+             <widget>
+               <class>GtkHBox</class>
+               <name>SilcerMainDlgOutputBox</name>
+               <homogeneous>False</homogeneous>
+               <spacing>0</spacing>
+               <child>
+                 <shrink>True</shrink>
+                 <resize>True</resize>
+               </child>
+
+               <widget>
+                 <class>Placeholder</class>
+               </widget>
+
+               <widget>
+                 <class>Placeholder</class>
+               </widget>
+             </widget>
+
+             <widget>
+               <class>GtkScrolledWindow</class>
+               <name>scrolledwindow1</name>
+               <height>40</height>
+               <hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
+               <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
+               <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
+               <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
+               <child>
+                 <shrink>True</shrink>
+                 <resize>False</resize>
+               </child>
+
+               <widget>
+                 <class>GtkText</class>
+                 <name>SilcerMainDlgInputBox</name>
+                 <can_default>True</can_default>
+                 <has_default>True</has_default>
+                 <can_focus>True</can_focus>
+                 <has_focus>True</has_focus>
+                 <editable>True</editable>
+                 <text></text>
+               </widget>
+             </widget>
+           </widget>
+
+           <widget>
+             <class>GtkVBox</class>
+             <name>vbox4</name>
+             <width>120</width>
+             <homogeneous>False</homogeneous>
+             <spacing>8</spacing>
+             <child>
+               <shrink>True</shrink>
+               <resize>False</resize>
+             </child>
+
+             <widget>
+               <class>GtkScrolledWindow</class>
+               <name>scrolledwindow2</name>
+               <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
+               <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
+               <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
+               <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
+               <child>
+                 <padding>0</padding>
+                 <expand>True</expand>
+                 <fill>True</fill>
+               </child>
+
+               <widget>
+                 <class>GtkCList</class>
+                 <name>clist1</name>
+                 <can_focus>True</can_focus>
+                 <columns>1</columns>
+                 <column_widths>80</column_widths>
+                 <selection_mode>GTK_SELECTION_BROWSE</selection_mode>
+                 <show_titles>True</show_titles>
+                 <shadow_type>GTK_SHADOW_IN</shadow_type>
+
+                 <widget>
+                   <class>GtkLabel</class>
+                   <child_name>CList:title</child_name>
+                   <name>label5</name>
+                   <label>0 users</label>
+                   <justify>GTK_JUSTIFY_CENTER</justify>
+                   <wrap>False</wrap>
+                   <xalign>0.5</xalign>
+                   <yalign>0.5</yalign>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                 </widget>
+               </widget>
+             </widget>
+           </widget>
+         </widget>
+       </widget>
+      </widget>
+
+      <widget>
+       <class>GtkLabel</class>
+       <child_name>Notebook:tab</child_name>
+       <name>SilcerMainDlgTabLabel1</name>
+       <label></label>
+       <justify>GTK_JUSTIFY_CENTER</justify>
+       <wrap>False</wrap>
+       <xalign>0.5</xalign>
+       <yalign>0.5</yalign>
+       <xpad>0</xpad>
+       <ypad>0</ypad>
+      </widget>
+    </widget>
+  </widget>
+</widget>
+
+</GTK-Interface>
diff --git a/apps/silcer/xml-i18n-extract.in b/apps/silcer/xml-i18n-extract.in
new file mode 100644 (file)
index 0000000..49a5598
--- /dev/null
@@ -0,0 +1,303 @@
+#!@XML_I18N_TOOLS_PERL@ -w 
+# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4  -*-
+
+#
+#  The XML Translation Extractor
+#
+#  Copyright (C) 2000 Free Software Foundation.
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License as
+#  published by the Free Software Foundation; either version 2 of the
+#  License, or (at your option) any later version.
+#
+#  This script 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 library; if not, write to the Free Software
+#  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+#  Authors: Kenneth Christiansen <kenneth@gnu.org>
+#           Darin Adler <darin@eazel.com>
+#
+
+## Release information
+my $PROGRAM      = "xml-i18n-extract";
+my $PACKAGE      = "xml-i18n-tools";
+my $VERSION      = "0.9";
+
+## Script options - Enable by setting value to 1
+my $ENABLE_INI   = "1"; ## desktop and alike files
+my $ENABLE_KEYS  = "1"; ## mimetype descriptions
+my $ENABLE_GLADE = "1"; ## glade files
+my $ENABLE_XML          = "1"; ## generic xml files
+
+## Loaded modules
+use strict; 
+use File::Basename;
+use Getopt::Long;
+
+## Scalars used by the option stuff
+my $TYPE_ARG   = "0";
+my $LOCAL_ARG  = "0";
+my $HELP_ARG   = "0";
+my $VERSION_ARG = "0";
+my $UPDATE_ARG  = "0";
+my $QUIET_ARG   = "0";
+
+my $FILE;
+my $OUTFILE;
+
+my $gettext_type = "";
+my $input;
+my %messages = ();
+
+## Always print first
+$| = 1;
+
+## Handle options
+GetOptions (
+           "type=s"     => \$TYPE_ARG,
+            "local|l"    => \$LOCAL_ARG,
+            "help|h|?"   => \$HELP_ARG,
+            "version|v"  => \$VERSION_ARG,
+            "update"     => \$UPDATE_ARG,
+           "quiet|q"    => \$QUIET_ARG,
+            ) or &error;
+
+&split_on_argument;
+
+
+## Check for options. 
+## This section will check for the different options.
+
+sub split_on_argument {
+
+    if ($VERSION_ARG) {
+        &version;
+
+    } elsif ($HELP_ARG) {
+       &help;
+        
+    } elsif ($LOCAL_ARG) {
+        &place_local;
+        &extract;
+
+    } elsif ($UPDATE_ARG) {
+       &place_normal;
+       &extract;
+
+    } elsif (@ARGV > 0) {
+       &place_normal;
+       &message;
+       &extract;
+
+    } else {
+       &help;
+
+    }  
+}    
+
+sub place_normal {
+    $FILE       = $ARGV[0];
+    $OUTFILE     = "$FILE.h";
+}   
+
+sub place_local {
+    $OUTFILE     = fileparse($FILE, ());
+    if (!-e "tmp/") { 
+        system("mkdir tmp/"); 
+    }
+    $OUTFILE     = "./tmp/$OUTFILE.h"
+}
+
+sub determine_type {
+   if ($TYPE_ARG =~ /^gettext\/(.*)/) {
+       $gettext_type=$1
+   }
+}
+
+## Sub for printing release information
+sub version{
+    print "${PROGRAM} (${PACKAGE}) $VERSION\n";
+    print "Copyright (C) 2000 Free Software Foundation, Inc.\n";
+    print "Written by Kenneth Christiansen, 2000.\n\n";
+    print "This is free software; see the source for copying conditions. There is NO\n";
+    print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
+    exit;
+}
+
+## Sub for printing usage information
+sub help{
+    print "Usage: ${PROGRAM} [FILENAME] [OPTIONS] ...\n";
+    print "Generates a header file from an xml source file.\n\nGrabs all strings ";
+    print "between <_translatable_node> and it's end tag,\nwhere tag are all allowed ";
+    print "xml tags. Read the docs for more info.\n\n"; 
+    print "  -v, --version                shows the version\n";
+    print "  -h, --help                   shows this help page\n";
+    print "  -q, --quiet                  quiet mode\n";
+    print "\nReport bugs to <kenneth\@gnu.org>.\n";
+    exit;
+}
+
+## Sub for printing error messages
+sub error{
+#   print "xml-i18n-extract: invalid option @ARGV\n";
+    print "Try `${PROGRAM} --help' for more information.\n";
+    exit;
+}
+
+sub message {
+    print "Generating C format header file for translation.\n";
+}
+
+sub extract {
+    &determine_type;
+
+    &convert ($FILE);
+
+    open OUT, ">$OUTFILE";
+    &msg_write;
+    close OUT;
+
+    print "Wrote $OUTFILE\n" unless $QUIET_ARG;
+}
+
+sub convert($) {
+
+    ## Reading the file
+    {
+       local (*IN);
+       local $/; #slurp mode
+       open (IN, "<$FILE") || die "can't open $FILE: $!";
+       $input = <IN>;
+    }
+
+    &type_ini;
+    &type_keys;
+    &type_xml;
+    &type_glade;
+}
+
+sub type_ini {
+
+    if ($ENABLE_INI) { 
+        
+        ### For generic translatable desktop files ###
+    
+        if ($gettext_type eq "ini"){    
+
+            while ($input =~ /^_.*=(.*)$/mg) {
+                $messages{$1} = [];
+            }
+        }
+    }
+}
+
+sub type_keys {
+    
+    if ($ENABLE_KEYS) {
+    
+        ### For generic translatable mime/keys files ###
+
+        if ($gettext_type eq "keys"){
+            while ($input =~ /^\s*_\w+=(.*)$/mg) {
+                $messages{$1} = [];
+            }
+        }
+    }
+}
+
+sub type_xml {
+
+    if ($ENABLE_XML) {
+
+       ### For generic translatable XML files ###
+        
+        if ($gettext_type eq "xml"){
+
+            while ($input =~ /[\t\n\s]_\w+=\"([^\"]+)\"/sg) {
+                $messages{$1} = [];
+            }
+
+            while ($input =~ /<_(\w+)>([^<]+)<\/_\1>/sg) {
+                $messages{$2} = [];
+            }
+
+       }
+    }
+}
+
+sub type_glade {
+
+    if ($ENABLE_GLADE) {
+        
+        ### For translatable Glade XML files ###
+
+        if ($gettext_type eq "glade"){
+
+            my $translate = "label|title|text|format|copyright|comments|
+                             preview_text|tooltip";
+
+            while ($input =~ /<($translate)>([^<]+)<\/($translate)>/sg) {
+
+                # Glade has some bugs, especially it uses translations tags to contain little
+                # non-translatable content. We work around this, by not including these
+                # strings that only includes something like: label4, and window1
+                if ($2 !~ /^(window|label)[0-9]+$/) {
+                    $messages{$2} = [];
+                }
+            }
+            
+            while ($input =~ /<items>(..[^<]*)<\/items>/sg) {
+                my @items =  split (/\n/, $1);
+                for (my $n = 0; $n < @items; $n++) {
+                    $messages{$items[$n]} = [];
+                }
+            }
+
+       }
+    }
+
+}
+
+sub msg_write {
+    
+    foreach my $message (sort keys %messages) { 
+        
+        my ($tag) = @{ $messages{$message} };
+        
+        # Replace XML entities for some special characters with
+        # the appropriate gettext syntax for those characters.
+       $message =~ s/&quot;/\\"/mg; # "
+       $message =~ s/&lt;/</mg;
+       $message =~ s/&gt;/>/mg;
+       $message =~ s/&amp;/&/mg;
+       
+       print OUT "/* xgettext:no-c-format */\n" if $message =~ /%/;
+       print OUT "/* $tag */\n" if $tag;
+        
+       my @lines = split (/\n/, $message);
+
+       for (my $n = 0; $n < @lines; $n++) {
+
+            if ($n == 0) { 
+               print OUT "char *s = N_(\""; 
+            } else {  
+               print OUT "             \""; 
+           }
+
+            print OUT $lines[$n];
+
+            if ($n < @lines - 1) { 
+               print OUT "\\n\"\n"; 
+           } else { 
+               print OUT "\");\n";  
+           }
+        }
+    }
+}
+
diff --git a/apps/silcer/xml-i18n-merge.in b/apps/silcer/xml-i18n-merge.in
new file mode 100644 (file)
index 0000000..5c3a581
--- /dev/null
@@ -0,0 +1,459 @@
+#!@XML_I18N_TOOLS_PERL@ -w
+
+#
+#  The XML Translation Merge Tool
+#
+#  Copyright (C) 2000 Free Software Foundation.
+#  Copyright (C) 2000, 2001 Eazel, Inc
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License as
+#  published by the Free Software Foundation; either version 2 of the
+#  License, or (at your option) any later version.
+#
+#  This script 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 library; if not, write to the Free Software
+#  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+#  Authors:  Maciej Stachowiak <mjs@eazel.com>
+#            Kenneth Christiansen <kenneth@gnu.org>
+#            Darin Adler <darin@eazel.com>
+#
+
+
+## Release information
+my $PROGRAM      = "xml-i18n-merge";
+my $PACKAGE      = "xml-i18n-tools";
+my $VERSION      = "0.9";
+
+## Script options - Enable by setting value to 1
+my $ENABLE_XML   = "1";
+
+## Loaded modules
+use strict; 
+use File::Basename;
+use Getopt::Long;
+
+## Scalars used by the option stuff
+my $HELP_ARG   = "0";
+my $VERSION_ARG = "0";
+my $OAF_STYLE_ARG = "0";
+my $XML_STYLE_ARG = "0";
+my $KEYS_STYLE_ARG = "0";
+my $DESKTOP_STYLE_ARG = "0";
+my $QUIET_ARG = "0";
+
+
+## Handle options
+GetOptions (
+           "help|h|?" => \$HELP_ARG,
+           "version|v" => \$VERSION_ARG,
+            "quiet|q" => \$QUIET_ARG,
+           "oaf-style|o" => \$OAF_STYLE_ARG,
+           "xml-style|x" => \$XML_STYLE_ARG,
+           "keys-style|k" => \$KEYS_STYLE_ARG,
+           "desktop-style|d" => \$DESKTOP_STYLE_ARG
+           ) or &error;
+
+
+my $PO_DIR;
+my $FILE;
+my $OUTFILE;
+
+my @languages;
+my %po_files_by_lang = ();
+my %translations = ();
+
+&split_on_argument;
+
+
+## Check for options. 
+## This section will check for the different options.
+
+sub split_on_argument {
+
+    if ($VERSION_ARG) {
+       &version;
+
+    } elsif ($HELP_ARG) {
+       &help;
+    } elsif ($OAF_STYLE_ARG && @ARGV > 2) {
+       &place_normal;
+       &message;
+       &preparation;
+       &oaf_merge_translations;
+    } elsif ($XML_STYLE_ARG && @ARGV > 2) {
+       &place_normal;
+       &message;
+       &preparation;
+       &xml_merge_translations;
+    } elsif ($KEYS_STYLE_ARG && @ARGV > 2) {
+        &place_normal;
+        &message;
+        &preparation;
+        &keys_merge_translations;
+    } elsif ($DESKTOP_STYLE_ARG && @ARGV > 2) {
+        &place_normal;
+        &message;
+        &preparation;
+        &desktop_merge_translations;
+    } else {
+       &help;
+    }  
+}    
+
+
+sub place_normal {
+    $PO_DIR = $ARGV[0];
+    $FILE = $ARGV[1];
+    $OUTFILE = $ARGV[2];
+}   
+
+
+## Sub for printing release information
+sub version{
+    print "${PROGRAM} (${PACKAGE}) ${VERSION}\n";
+    print "Written by Maciej Stachowiak and Kenneth Christiansen, 2000.\n\n";
+    print "Copyright (C) 2000 Free Software Foundation, Inc.\n";
+    print "Copyright (C) 2000, 2001 Eazel, Inc.\n";
+    print "This is free software; see the source for copying conditions.  There is NO\n";
+    print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
+    exit;
+}
+
+## Sub for printing usage information
+sub help{
+    print "Usage: ${PROGRAM} [OPTIONS] PO_DIRECTORY FILENAME OUTPUT_FILE\n";
+    print "Generates an xml file that includes translated versions of some attributes,\n";
+    print "from an untranslated source and a po directory that includes translations.\n";
+    print "  -v, --version                shows the version\n";
+    print "  -h, --help                   shows this help page\n";
+    print "  -q, --quiet                  quiet mode\n";
+    print "  -o, --oaf-style              includes translations in the oaf style\n";
+    print "  -x, --xml-style              includes translations in the xml style\n";
+    print "  -k, --keys-style            includes translations in the keys style\n";
+    print "  -d, --desktop-style          includes translations in the desktop style\n";
+    print "\nReport bugs to <mjs\@eazel.com>.\n";
+    exit;
+}
+
+
+## Sub for printing error messages
+sub error{
+#   print "xml-i18n-merge: invalid option @ARGV\n";
+    print "Try `${PROGRAM} --help' for more information.\n";
+    exit;
+}
+
+
+sub message {
+    print "Merging translations into $OUTFILE.\n" unless $QUIET_ARG;
+}
+
+
+
+sub preparation {
+   &gather_po_files;
+   &create_translation_database;   
+}
+
+
+
+# General-purpose code for looking up translations in .po files
+
+sub gather_po_files
+{
+    my @po_files = glob("${PO_DIR}/*.po");
+
+    @languages = map (&po_file2lang, @po_files);
+
+    foreach my $lang (@languages) {
+       $po_files_by_lang{$lang} = shift (@po_files);
+    }
+}
+
+sub po_file2lang 
+{ 
+    my $tmp = $_; 
+    $tmp =~ s/^.*\/(.*)\.po$/$1/; 
+    return $tmp; 
+}
+
+
+sub create_translation_database
+{
+    foreach my $lang (@languages) {
+
+       my $po_file = $po_files_by_lang{$lang};
+
+       open PO_FILE, "<$po_file";      
+
+        while (<PO_FILE>) {
+            if (/^#,.*fuzzy/) {
+                $_ = <PO_FILE>; next;
+            }
+            if (/^msgid "(.*)"/ ) {
+               my $msgid = $1;
+                $_ = <PO_FILE>;
+               
+               if (/^msgstr "(.+)"/) {
+                   my $msgstr = $1;
+                   $translations{$lang . "|" . $msgid} = $msgstr; 
+                   # print "[$lang]$msgstr\n";
+               }
+           }            
+        }
+    }
+}
+
+sub lookup_translations 
+{
+    my ($value) = @_;
+    my %transmap = ();
+
+    foreach my $lang (@languages) {
+        my $translation = lookup_translation ($value, $lang);
+            
+        if ($translation) {
+            $transmap{$lang} = $translation;
+        }
+    }
+
+    return %transmap;
+}
+
+
+sub lookup_translation
+{
+    my ($string, $lang) = @_;
+    $string =~ s/\+/\\+/g;
+  
+    my $salt = "$lang|$string";
+      
+    if ($translations{$salt}) {
+        return $translations{$salt};
+    }
+  
+    return "";
+}
+
+
+sub entity_encode_translations
+{
+    my %transmap = @_;
+
+    foreach my $key (keys %transmap) {
+       $transmap{$key} = entity_encode ($transmap{$key});
+    }
+
+    return %transmap;
+}
+
+
+sub entity_encode
+{
+    my ($pre_encoded) = @_;
+
+    $pre_encoded =~ s/\\(.)/$1/g;
+    my @list_of_chars = unpack ('C*', $pre_encoded);
+
+    return join ('', map (&entity_encode_int, @list_of_chars));
+}
+
+sub entity_encode_int
+{
+    if ($_ > 127 || $_ == 34 || $_ == 38) {
+       return "&#" . $_ . ";";
+    } else {
+       return chr $_;
+    }
+}
+
+
+## XML/OAF-specific merge code
+sub oaf_merge_translations
+{
+    my $xml_source; {
+       local (*INPUT);
+       local $/; # slurp mode
+       open INPUT, "<$FILE" or die "can't open $FILE: $!";
+       $xml_source = <INPUT>;
+       close INPUT;
+    }
+
+    open OUTPUT, ">$OUTFILE";
+
+    while ($xml_source =~ /[ \t]*<[^<]*\s_\w+="[^"]*"[^<]*>/m) {
+        print OUTPUT $`;
+        my $orig_node = $&;
+       $xml_source = $';
+
+        my $non_translated_line = $orig_node;
+        $non_translated_line =~ s/_(\w+)="/$1="/;
+            
+        my $new_node = $non_translated_line;
+            
+        my $value_str = $orig_node;
+        $value_str =~ s/.*_\w+="([^"]*)".*/$1/s;
+
+        if ($value_str) {
+            my %value_translation_map = entity_encode_translations
+                (lookup_translations ($value_str));
+
+            foreach my $key (sort keys %value_translation_map) {
+                my $translation = $value_translation_map{$key};
+                    
+                my $translated_line = $orig_node;
+                $translated_line =~ s/name="([^"]*)"/name="$1-$key"/;
+                $translated_line =~ s/(\s*)_(\w+)="[^"]*"/$1$2="$translation"/;
+
+                $new_node .= "\n$translated_line";
+            }
+        }
+
+       $xml_source = $new_node . $xml_source;
+    }
+
+    print OUTPUT $xml_source;
+
+    close OUTPUT;
+}
+
+
+## XML (non-OAF) merge code
+sub xml_merge_translations
+{
+    my $xml_source; {
+       local (*INPUT);
+       local $/; # slurp mode
+       open INPUT, "<$FILE" or die "can't open $FILE: $!";
+       $xml_source = <INPUT>;
+       close INPUT;
+    }
+
+    open OUTPUT, ">$OUTFILE";
+
+    # FIXME: support attribute translations
+
+    # First just unmark for translation all empty nodes
+    # for example <_foo/> is just replaced by <foo/>
+    $xml_source =~ s/<_(\w+)\/>/<$1\/>/mg;
+
+    # Support for XML <_foo>blah</_foo> style translations
+    while ($xml_source =~ /([ \t]*)<_(\w+)>([^<]+)<\/_\2>/m) {
+        print OUTPUT $`;
+       $xml_source = $';
+
+        my $spaces = $1;
+        my $tag_name = $2;
+        my $value_str = $3;
+
+        my $non_translated_line = "$spaces<$tag_name>$value_str</$tag_name>";
+            
+        my $new_node = $non_translated_line;
+
+        if ($value_str) {
+            my %value_translation_map = entity_encode_translations
+                (lookup_translations ($value_str));
+
+            foreach my $key (sort keys %value_translation_map) {
+                my $translation = $value_translation_map{$key};
+
+                $new_node .= "\n$spaces<$tag_name xml:lang=\"$key\">$translation</$tag_name>";
+            }
+        }
+
+       $xml_source = $new_node . $xml_source;
+    }
+
+    print OUTPUT $xml_source;
+
+    close OUTPUT;
+}
+
+sub keys_merge_translations
+{       
+    open INPUT, "<${FILE}";
+
+    open OUTPUT, ">${OUTFILE}";
+
+    while (<INPUT>) {
+        chomp;
+        if (/^\s*_\w+=.*/)  {
+            my $orig_line = $_;
+    
+            my $non_translated_line = $orig_line;
+            $non_translated_line =~ s/_([^="]*)=/$1=/;
+            
+            print OUTPUT "${non_translated_line}\n";
+            
+            my $value_str = $orig_line;
+            $value_str =~ s/.*_\w+=(.*)/$1/;
+            
+            if ($value_str) {
+                my %value_translation_map = lookup_translations ($value_str);
+            
+                foreach my $key (sort keys %value_translation_map) {
+                    my $translation = $value_translation_map{$key};
+
+                    my $translated_line = $orig_line;  
+                    $translated_line =~ s/_([^="]*)=([^\n]*)/\[$key]$1=$translation/;
+                    print OUTPUT "$translated_line\n";
+                }
+            }
+        } else {
+            print OUTPUT "$_\n";
+        }
+    }
+                 
+    close OUTPUT;
+    close INPUT;
+}
+
+sub desktop_merge_translations
+{
+    open INPUT, "<${FILE}";
+
+    open OUTPUT, ">${OUTFILE}";
+
+    while (<INPUT>) {
+        chomp;
+        if (/^\s*_\w+=.*/)  {
+            my $orig_line = $_;
+
+            my $non_translated_line = $orig_line;
+            $non_translated_line =~ s/_([^="]*)=/$1=/;
+
+            print OUTPUT "${non_translated_line}\n";
+
+            my $value_str = $orig_line;
+            $value_str =~ s/.*_\w+=(.*)/$1/;
+
+            if ($value_str) {
+                my %value_translation_map = lookup_translations ($value_str);
+
+                foreach my $key (sort keys %value_translation_map) {
+                    my $translation = $value_translation_map{$key};
+
+                    my $translated_line = $orig_line;
+                    $translated_line =~ s/^_([^="]*)=([^\n]*)/$1\[$key]=$translation/;
+                    print OUTPUT "$translated_line\n";
+                }
+            }
+        } else {
+            print OUTPUT "$_\n";
+        }
+    }
+
+    close OUTPUT;
+    close INPUT;
+
+}
diff --git a/apps/silcer/xml-i18n-update.in b/apps/silcer/xml-i18n-update.in
new file mode 100644 (file)
index 0000000..9e5b09a
--- /dev/null
@@ -0,0 +1,516 @@
+#!@XML_I18N_TOOLS_PERL@ -w
+
+#  The GNOME Translation Update Tool
+#
+#  Copyright (C) 2000 Free Software Foundation.
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License as
+#  published by the Free Software Foundation; either version 2 of the
+#  License, or (at your option) any later version.
+#
+#  This script 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 library; if not, write to the Free Software
+#  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+#  Author(s): Kenneth Christiansen
+
+## Release information
+my $PROGRAM  = "xml-i18n-update";
+my $VERSION  = "0.9";
+my $_PACKAGE = "xml-i18n-tools";
+
+## Loaded modules
+use strict;
+use Getopt::Long;
+use Cwd;
+use File::Copy;
+use File::Find;
+
+## Scalars used by the option stuff
+my $LANG          = $ARGV[0];
+my $HELP_ARG      = "0";
+my $VERSION_ARG    = "0";
+my $DIST_ARG      = "0";
+my $POT_ARG       = "0";
+my $HEADERS_ARG    = "0";
+my $MAINTAIN_ARG   = "0";
+my $REPORT_ARG     = "0";
+my $VERBOSE       = "0";
+
+my @languages;
+my %po_files_by_lang = ();
+
+my $xml_extension = 
+"xml(\.in)*|".         # .in is not required
+"ui|".
+"glade(\.in)*|".       # .in is not required
+"desktop(\.in)+|".
+"directory(\.in)+|".
+"soundlist(\.in)+|".
+"keys(\.in)+|".
+"oaf(\.in)+|".
+"server(\.in)+|".
+"etspec|".
+"pong(\.in)+";
+
+my $PACKAGE = &find_package_name;
+
+## Always print as the first thing
+$| = 1;
+
+## Give error if script is run without an argument
+if (! $LANG){
+    print "${PROGRAM}:  missing file arguments\n";
+    print "Try `${PROGRAM} --help' for more information.\n";
+    exit;
+}
+
+## Handle options
+GetOptions (
+           "help|h|?"          => \$HELP_ARG,
+           "version|v"         => \$VERSION_ARG,
+           "dist|d"            => \$DIST_ARG,
+           "pot|p"             => \$POT_ARG,
+           "headers|s"         => \$HEADERS_ARG,
+           "maintain|m"        => \$MAINTAIN_ARG,
+           "report|r"          => \$REPORT_ARG,
+           "verbose|x"         => \$VERBOSE
+           ) or &invalid_option;
+
+
+## Use the supplied arguments
+## Check for options.
+## This section will check for the different options.
+
+sub split_on_argument {
+
+    if ($VERSION_ARG) {
+       &version;
+
+    } elsif ($HELP_ARG) {
+       &help;
+
+    } elsif ($DIST_ARG) {
+        &merging;
+        &status;
+
+    } elsif ($POT_ARG) {
+        &gen_headers;
+        &generate_pot;
+
+    } elsif ($HEADERS_ARG) {
+        &gen_headers;
+        exit;
+
+    } elsif ($MAINTAIN_ARG) {
+        &maintain;
+
+    } elsif ($REPORT_ARG) {
+        &show_status;
+
+    } elsif ($LANG) {
+       if ($LANG =~ /^-/){ ## not an option
+           &help;
+       } else {
+           &main;
+       }
+
+    } else {
+       &help;
+    }
+}
+
+&split_on_argument;
+
+sub main
+{
+   if(-s "$LANG.po"){
+       print "Working, please wait..." unless $VERBOSE;
+        &gen_headers;
+       &generate_pot;
+       &merging;
+       &status;
+   }
+
+   ## Report error if the language file supplied
+   ## to the command line is non-existent
+   else {
+       &not_existing;
+   }
+}
+
+sub determine_type($) {
+   my $type = $_;
+
+   my $gettext_type;
+
+   if ($type =~ /\[type: (gettext\/[^\]].*)]/) {
+        $gettext_type=$1;
+   }
+   elsif ($type =~ /(?:xml(\.in)*|ui|oaf(?:\.in)+|pong(?:\.in)+|etspec)$/) {
+        $gettext_type="gettext\/xml";
+   }
+   elsif ($type =~ /glade(\.in)*$/) {
+        $gettext_type="gettext\/glade";
+   }
+   elsif ($type =~ /(?:desktop(?:\.in)+|directory(?:\.in)+|soundlist(?:\.in)+)$/) {
+        $gettext_type="gettext\/ini";
+   }
+   elsif ($type =~ /keys(\.in)+$/) {
+        $gettext_type="gettext\/keys";
+   }
+   else { $gettext_type=""; }
+
+   return $gettext_type;
+}
+
+sub version{
+
+    ## Print version information
+    print "${PROGRAM} (${_PACKAGE}) $VERSION\n";
+    print "Written by Kenneth Christiansen <kenneth\@gnome.org>, 2000.\n\n";
+    print "Copyright (C) 2000 Free Software Foundation, Inc.\n";
+    print "This is free software; see the source for copying conditions.  There is NO\n";
+    print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
+    exit;
+}
+
+sub help
+{
+    ## Print usage information
+    print "Usage: ./${PROGRAM} [OPTIONS] ...LANGCODE\n";
+    print "Updates pot files and merge them with the translations.\n\n";
+    print "  -H, --help                   shows this help page\n";
+    print "  -P, --pot                    generate the pot file only\n";
+    print "  -S, --headers                generate the XML headerfiles in POTFILES.in\n";
+    print "  -M, --maintain               search for missing files in POTFILES.in\n";
+    print "  -R, --report                 creates a status report for the module.\n";
+    print "  -X, --verbose                show lots of feedback\n";
+    print "  -V, --version                shows the version\n";
+    print "\nExamples of use:\n";
+    print "${PROGRAM} --pot    just creates a new pot file from the source\n";
+    print "${PROGRAM} da       created new pot file and updated the da.po file\n\n";
+    print "Report bugs to <kenneth\@gnome.org>.\n";
+    exit;
+}
+
+sub maintain
+{
+    my (@buf_i18n_plain,
+       @buf_i18n_xml,
+       @buf_potfiles,
+       @buf_potfiles_ignore,
+       @buf_allfiles,
+       @buf_allfiles_sorted,
+       @buf_potfiles_sorted
+    );
+
+    ## Search and find all translatable files
+    find sub { push @buf_i18n_plain, "$File::Find::name" if /\.(c|y|cc|c\+\+|h|gob)$/ }, "..";
+    find sub { push @buf_i18n_xml, "$File::Find::name" if /\.($xml_extension)$/ }, "..";
+
+    open(POTFILES, "POTFILES.in") || die "$PROGRAM:  there's no POTFILES.in!!!\n";
+    @buf_potfiles = <POTFILES>;
+
+    print "Searching for missing translatable files...\n";
+
+    ## Check if we should ignore some found files, when
+    ## comparing with POTFILES.in
+    if (-s "POTFILES.skip"){
+        open FILE, "POTFILES.skip";
+        while (<FILE>) {
+            if (/^[^#]/){
+                push @buf_potfiles_ignore, $_;
+            }
+        }
+        print "Found POTFILES.skip: Ignoring files...\n";
+        @buf_potfiles = (@buf_potfiles_ignore, @buf_potfiles);
+    }
+
+    foreach my $file (@buf_i18n_plain){
+        open FILE, "<$file";
+        while (<FILE>) {
+            if (/_\(\"/){
+               ## Remove the first 3 chars and add newline
+               push @buf_allfiles, unpack("x3 A*", $file) . "\n";
+                last;
+            }
+        }
+    }
+
+    foreach my $file (@buf_i18n_xml){
+        open FILE, "<$file";
+        while (<FILE>) {
+            if (/\s_(.*)=\"/){
+                ## Remove the first 3 chars and add newline
+                push @buf_allfiles, unpack("x3 A*", $file) . "\n";
+                last;
+            }
+        }
+    }
+
+    @buf_allfiles_sorted = sort (@buf_allfiles);
+    @buf_potfiles_sorted = sort (@buf_potfiles);
+
+    my %in2;
+    foreach (@buf_potfiles_sorted) {
+        $in2{$_} = 1;
+    }
+
+    my @result;
+
+    foreach (@buf_allfiles_sorted){
+        if (!exists($in2{$_})){
+            push @result, $_
+        }
+    }
+
+    ## Save file with information about the files missing
+    ## if any, and give information about this proceedier
+    if(@result){
+        open OUT, ">missing";
+        print OUT @result;
+        print "\nHere is the result:\n\n", @result, "\n";
+        print "The file \"missing\" has been placed in the current directory.\n";
+        print "Files supposed to be ignored should be placed in \"POTFILES.skip\"\n";
+    }
+
+    ## If there is nothing to complain about, notice the user
+    else{
+        print "\nWell, it's all perfect! Congratulation!\n";
+    }
+}
+
+sub invalid_option
+{
+    ## Handle invalid arguments
+    print "${PROGRAM}: invalid option -- $LANG\n";
+    print "Try `${PROGRAM} --help' for more information.\n";
+    exit 1;
+}
+
+sub gen_headers
+{
+    my $XML_I18N_EXTRACT = `which xml-i18n-extract 2>/dev/null`;
+    chomp $XML_I18N_EXTRACT;
+
+    $XML_I18N_EXTRACT = $ENV{"XML_I18N_EXTRACT"} if $ENV{"XML_I18N_EXTRACT"};
+
+    ## Generate the .h header files, so we can allow glade and
+    ## xml translation support
+    if (! -s $XML_I18N_EXTRACT)
+    {
+       print "\n *** The xml-i18n-extract script wasn't found!"
+            ."\n *** Without this xml-i18n-update can not generate files.\n";
+       exit;
+    }
+    else
+    {
+        open FILE, "<POTFILES.in";
+        while (<FILE>) {
+           chomp;
+
+           ## Find xml files in POTFILES.in and generate the
+           ## files with help from the xml-i18n-extract script
+
+          my $gettext_type=&determine_type($1);
+
+           if (/\.($xml_extension)$/ || /^\[/){
+              $_ =~ s/^\[[^\[].*]\s*//;
+               my $filename = "../$_";
+
+               if ($VERBOSE){
+                   system($XML_I18N_EXTRACT, "--update", "--type=$gettext_type", $filename);
+               } else {
+                  system($XML_I18N_EXTRACT, "--update", "--type=$gettext_type", "--quiet", $filename);
+               }
+           }
+       }
+       close FILE;
+   }
+}
+
+sub generate_pot
+{
+    ## Generate the potfiles from the POTFILES.in file
+
+    print "Building the $PACKAGE.pot...\n" if $VERBOSE;
+
+    move("POTFILES.in", "POTFILES.in.old");
+
+    open INFILE, "<POTFILES.in.old";
+    open OUTFILE, ">POTFILES.in";
+    while (<INFILE>) {
+        s/\.($xml_extension)$/$&.h/;
+        s/^\[.*]\s*(.*)/$1.h/;
+        print OUTFILE $_;
+    }
+    close OUTFILE;
+    close INFILE;
+
+    my $gettext_test   ="test \! -f $PACKAGE\.po \|\| \( rm -f \.\/$PACKAGE\.pot "
+                       ."&& mv $PACKAGE\.po \.\/$PACKAGE\.pot \)";
+
+    system("xgettext", "--default-domain\=$PACKAGE", "--directory\=\.\.",
+          "--add-comments", "--keyword\=\_", "--keyword\=N\_",
+          "--files-from\=\.\/POTFILES\.in");
+
+    system($gettext_test);
+
+    print "Wrote $PACKAGE.pot\n" if $VERBOSE;
+
+    move("POTFILES.in.old", "POTFILES.in");
+
+    print "Removing generated header (.h) files..." if $VERBOSE;
+
+    open FILE, "<POTFILES.in";
+    while (<FILE>)
+    {
+        chomp;
+        unlink "../$_.h" if /\.($xml_extension)$/;
+    }
+    close FILE;
+    print "done\n" if $VERBOSE;
+}
+
+sub merging
+{
+    if ($ARGV[1]){
+        $LANG   = $ARGV[1];
+    } else {
+       $LANG   = $ARGV[0];
+    }
+
+    if ($ARGV[0] ne "--dist" && $ARGV[0] ne "-D") {
+        print "Merging $LANG.po with $PACKAGE.pot..." if $VERBOSE;
+    }
+
+    &perform_merge($LANG);
+    ## Remove the "messages" trash file generated by gettext
+    unlink "messages";
+}
+
+sub perform_merge
+{
+    my ($LANG) = @_;
+
+    copy("$LANG.po", "$LANG.po.old") || die "copy failed: $!";
+
+    ## Preform merge
+    system("msgmerge", "$LANG.po.old", "$PACKAGE.pot", "-o", "$LANG.po");
+
+    ## Remove the backup file
+    unlink "$LANG.po.old";
+}
+
+sub not_existing
+{
+    ## Report error if supplied language file is non-existing
+    print "$PROGRAM:  sorry, $LANG.po does not exist!\n";
+    print "Try `$PROGRAM --help' for more information.\n";
+    exit;
+}
+
+sub gather_po_files
+{
+    my @po_files = glob("./*.po");
+
+    @languages = map (&po_file2lang, @po_files);
+
+    foreach my $lang (@languages) {
+       $po_files_by_lang{$lang} = shift (@po_files);
+    }
+}
+
+sub po_file2lang
+{
+    my $tmp = $_;
+    $tmp =~ s/^.*\/(.*)\.po$/$1/;
+    return $tmp;
+}
+
+sub status
+{
+    ## Print statistics
+    system("msgfmt", "--statistics", "$LANG.po");
+    print "\n";
+}
+
+sub show_status
+{
+    &gen_headers;
+    &generate_pot;
+    &gather_po_files;
+
+    foreach my $lang (@languages){
+       print "$lang: ";
+       &perform_merge($lang);
+    }
+
+    print "\n\n * Current translation support in $PACKAGE \n\n";
+
+    foreach my $lang (@languages){
+        print "$lang: ";
+       ## Print statistics
+       system("msgfmt", "--statistics", "$lang.po");
+    }
+}
+
+sub find_package_name
+{
+    my $base_dirname = getcwd();
+    $base_dirname =~ s@.*/@@;
+
+    my ($conf_in, $src_dir);
+
+    if ($base_dirname eq "po") {
+        if (-f "../configure.in") {
+            $conf_in = "../configure.in";
+        } else {
+           my $makefile_source;
+           local (*IN);
+           open (IN, "<Makefile") || die "can't open Makefile: $!";
+
+           while (<IN>) {
+               if (/^top_srcdir[ \t]*=/) {
+                   $src_dir = $_;
+                   # print "${src_dir}\n";
+
+                   $src_dir =~ s/^top_srcdir[ \t]*=[ \t]*([^ \t\n\r]*)/$1/;
+                   # print "${src_dir}\n";
+                   chomp $src_dir;
+                   $conf_in = "$src_dir" . "/configure.in" . "\n";
+                   last;
+               }
+           }
+           $conf_in || die "Cannot find top_srcdir in Makefile."
+        }
+
+        my $conf_source; {
+           local (*IN);
+           local $/; # slurp mode
+           open (IN, "<$conf_in") || die "can't open $conf_in: $!";
+           $conf_source = <IN>;
+        }
+
+        if ($conf_source =~ /AM_INIT_AUTOMAKE\(([^,]*),(.*)/) {
+            my $package_name = $1;
+            if ($package_name =~ /^[\$](.*)/){
+                if ($conf_source =~ /$1=(.*)/) {
+                    $package_name = $1;
+                }
+            }
+           return $package_name;
+        }
+    }
+
+    print "$PROGRAM: Unable to determine package name.\n" .
+         "Make sure to run this script inside the po directory.\n";
+    exit;
+}