* support/ : Removed unused files.
svn path=/trunk/; revision=3597
+++ /dev/null
-Makefile.in
-Makefile
-.deps
-*.la
-*.lo
-.libs
-gnomesupport-h
-gnomesupport.h
-gnome-support-2.0.pc
+++ /dev/null
-2003-10-20 Bastien Nocera <hadess@hadess.net>
-
- * Makefile.am: make libgtop compile, other apps using libgnomesupport
- should be dead by now
-
-2000-11-21 Martin Baulig <baulig@suse.de>
-
- * Makefile.am: Install libgnomesupport.la, but call it
- libgnomesupport-1.3.la.
-
- * gnome-support-2.0.pc.in: Added pkg-config file.
-
-1999-05-27 Raja R Harinath <harinath@cs.umn.edu>
-
- * gnomesupport.awk: Put c++ guards after #includes.
-
- * gnomesupport-fake.h: Remove dependence on `gnome-argp.h'. Move
- relevant declarations here.
-
-1999-05-12 Martin Baulig <martin@home-of-linux.org>
-
- * canonicalize.c: Use `set_errno' instead of `__set_errno' and
- define `set_errno' here.
-
-1999-03-27 Raja R Harinath <harinath@cs.umn.edu>
-
- * Makefile.am (supportexecincludedir): Rename from
- supportincludedir so that `gnomesupport.h' can be installed with
- `make install-exec'.
- (supportinclude_HEADERS): Remove. Don't install popt-gnome.h
- twice.
- (error.o): Change `error.c: gnomesupport.h' dependency to
- `error.o: gnomesupport.h' to reflect actual dependency.
-
-1999-02-19 Martin Baulig <martin@home-of-linux.org>
-
- * canonicalize.c: Include <gnome-argp.h> instead of the removed
- <argp-namefrob.h>.
-
-1999-02-17 Changwoo Ryu <cwryu@adam.kaist.ac.kr>
-
- * poptint.h: Removed the suspicious `#ifdef HAVE_DGETTEXT...'
- switch. Now `progname --help' messages should be translated.
-
-1998-12-24 Jeff Garzik <jgarzik@pobox.com>
-
- * poptparse.[ch]: poptParseArgvString cleanups...
- Added array grow increment constant.
- Remove unnecessary 'dst' init.
- Remove unnecessary strcpy().
- Make arg 's' and var 'src' const-correct.
-
-1998-12-21 Matt Wilson <msw@redhat.com>
-
- * poptparse.c: fix pointer assignment
-
-1998-12-16 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
-
- * Makefile.am (libgnomesupport_la_SOURCES): added gnome-argp.c,
- which is needed for platforms without
- program_invocation_short_name and program_invocation_name.
- (libgnomesupport_la_LIBADD): reinstalled the correct value.
-
-1998-12-15 Martin Baulig <martin@home-of-linux.org>
-
- * Makefile.am (EXTRA_DIST): Add all source and header files here.
-
-1998-12-02 Raja R Harinath <harinath@cs.umn.edu>
-
- * Makefile.am (EXTRA_DIST): Add back `gnomesupport.awk' and
- `README-gnome'.
-
-1998-11-06 Raja R Harinath <harinath@cs.umn.edu>
-
- * popt.c (gnomesupport-fake.h): Include.
- * poptint.h (ENABLE_NLS): Define POPT_() and _() i18n markers
- based on this.
-
-1998-11-04 Raja R Harinath <harinath@cs.umn.edu>
-
- * gnomesupport-fake.h: Include gnomesupport.h unconditionally.
- * Makefile.am: Build libgnomesupport.la unconditionally.
- (popt_sources): List `popt' sources.
- (libgnomesupport_la_SOURCES): Include $popt_sources.
- (include_HEADERS): Install `popt.h'.
- (noinst_HEADERS): Don't install poptint.h and findme.h.
- * popt.c: New file. From the POPT package. Replacement for
- argp/getopt.
- * poptparse.c: Likewise.
- * popthelp.c: Likewise.
- * poptconfig.c: Likewise.
- * findme.c: Likewise.
- * findme.h: Likewise.
- * popt.h: Likewise.
- * poptint.h: Likewise.
-
-1998-09-02 Raja R Harinath <harinath@cs.umn.edu>
-
- * canonicalize.c (realpath): Remove `weak_alias'.
- (canonicalize_file_name): Comment out.
-
- * gnomesupport.awk: Remove `canonicalize_file_name', and correct
- the comment for `realpath'.
-
-1998-09-02 Martin Baulig <martin@home-of-linux.org>
-
- * gnomesupport.awk (canonicalize_file_name, realpath): Emit
- declarations if required.
-
- * canonicalize.c (canonicalize_file_name, realpath): New file.
- Imported from GLibC 2.0.7.
-
- * libc-symbols.h: New file. Imported from GLibC 2.0.7.
-
-1998-08-24 Martin Baulig <martin@home-of-linux.org>
-
- * gnomesupport.awk: Emit declarations for `setreuid', `setregid'
- and `getpagesize' if required (GCC_NEED_DECLARATIONS).
-
-1998-08-18 Martin Baulig <martin@home-of-linux.org>
-
- * Makefile.am: Added explicit dependency `error.c: gnomesupport.h'.
-
- * gnomesupport-fake.h: Include `sys/types.h' to get `size_t' under
- FreeBSD.
-
- * gnomesupport-fake.h: Include `gnomesupport.h' only if we really
- `NEED_GNOMESUPPORT_H'.
-
-1998-08-16 Martin Baulig <martin@home-of-linux.org>
-
- * Makefile.am (EXTRA_DIST): Added all source and header files that
- are in CVS to make sure everything is included in the distribution
- no matter which files are used on the build system.
-
-1998-08-15 Raja R Harinath <harinath@cs.umn.edu>
-
- * Makefile.am (libgnomesupport_la_SOURCES): List `gnomesupport.h'
- here in the hope that it'll ensure that it is built.
-
-1998-08-05 Raja R Harinath <harinath@cs.umn.edu>
-
- * Makefile.am (noinst_HEADERS): Add `gnomesupport-fake.h'.
-
-1998-08-02 Raja R Harinath <harinath@cs.umn.edu>
-
- * error.c (program_name): Clean up #ifdef logic some more.
- (HAVE_STRERROR_R): Step on implementation namespace only if _LIBC.
-
-1998-07-30 Martin Baulig <martin@home-of-linux.org>
-
- * error.c: Making weak alias `__error' and `__error_at_line'
- only if `_LIBC' is defined and not if we only
- HAVE_PROGRAM_INVOCATION_NAME.
-
- * gnomesupport-fake.h: Include gnome-argp.h to get
- `program_invocation_name'.
-
-1998-07-29 Raja R Harinath <harinath@cs.umn.edu>
-
- * gnomesupport-fake.h: New file. Fake in HAVE_* for functions
- that are provided by `gnomesupport' rather than `libc'.
- * error.c: Include gnomesupport-fake.h.
- (program_name): Define to `program_invocation_name' if
- HAVE_PROGRAM_INVOCATION_NAME.
-
-1998-07-29 Martin Baulig <martin@home-of-linux.org>
-
- * error.c, error.h: New files. Imported from glibc.
-
- * Makefile.am (supportinclude_HEADERS): Added `error.h'.
-
-1998-07-17 Martin Baulig <martin@home-of-linux.org>
-
- * strtol.c, strtoul.c (<ansidecl.h>): Removed. Using
- `const' instead of `CONST'.
-
-1998-07-15 Raja R Harinath <harinath@cs.umn.edu>
-
- * gnomesupport.awk (gethostname): Emit declaration.
-
-1998-07-15 Martin Baulig <baulig@Stud.Informatik.uni-trier.de>
-
- * gnomesupport.awk (memmove strtod strtol strtoul): Emit
- declarations.
-
- * memmove.c: New file. Imported from GNU libiberty.
-
- * strtod.c, strtol.c, strtoul.c: New files. Imported from
- GNU libiberty.
-
-1998-07-14 Raja R Harinath <harinath@cs.umn.edu>
-
- * mkstemp.c (<stdint.h>): Systems that don't have `mkstemp'
- probably don't have <stdint.h> either. Will fix it with a proper
- autoconf test later.
-
-1998-07-13 Raja R Harinath <harinath@cs.umn.edu>
-
- * argp.h (ARGP_EI): Define to `extern __inline__', rather that
- `extern inline'. Since this code is inside an __OPTIMIZE__ check,
- I assume this is GCC, and __inline__ will work.
-
- * mkstemp.c: New file.
- * gnomesupport.awk: Conditionally emit prototype for `mkstemp'.
-
-Tue Jul 7 00:02:51 1998 Tom Tromey <tromey@cygnus.com>
-
- * argp-help.c: Don't include <malloc.h>.
-
-1998-06-11 Raja R Harinath <harinath@cs.umn.edu>
-
- * Makefile.am (gnomesupport.h): Build with `gnomesupport.awk'.
- (CROSS_COMPILING): Remove.
- (EXTRA_DIST): Add `gnomesupport.awk'.
-
- * gnomesupport.awk: New file, to replace `gnomesupport-h.c'.
- * gnomesupport-h.c: Removed. Doesn't work well in cross-compiles.
-
-1998-06-08 Martin Baulig <martin@home-of-linux.org>
-
- * Makefile.am (gnomesupport-h): When cross-compiling, this
- is build using `$(build_CC)' because it needs to run on the
- build system. Look at gnome-libs/configure.in to see how to
- get `build_CC'.
-
-Thu May 21 21:21:12 1998 Tom Tromey <tromey@cygnus.com>
-
- * gnome-argp.h: Unconditionally declare program_invocation_name
- and program_invocation_short_name; some systems define these but
- don't declare them.
-
-1998-05-20 Raja R Harinath <harinath@cs.umn.edu>
-
- * Makefile.am (INCLUDES): Define _GNU_SOURCE.
-
-1998-05-19 Raja R Harinath <harinath@cs.umn.edu>
-
- * gnomesupport-h.c (strerror): Emit declaration.
- * strerror.c: New file. Imported from GNU libiberty.
-
-1998-05-19 Martin Baulig <martin@home-of-linux.org>
-
- * vsnprintf.c (vsnprintf): Changed declaration of this
- function on systems defining __STDC__ to avoid clash
- with prototype in system header file.
-
- * vsnprintf.c (snprintf): Moved toward the end of the
- file, so that the compiler sees correct declaration for
- vsnprintf().
-
-1998-05-12 Kjartan Maraas <kmaraas@fib.hl.no>
-
- * argp-help.c (argp_doc): Backed out previous "fix". :-)
- As pointed out it was dead wrong.
-
-1998-05-09 Kjartan Maraas <kmaraas@fib.hl.no>
-
- * argp-help.c (argp_doc): Removed a compiler warning.
-
-1998-04-14 Raja R Harinath <harinath@cs.umn.edu>
-
- * gnomesupport-h.c (main): Make gnomesupport.h include stddef.h
- unconditionally.
-
-1998-04-13 Raja R Harinath <harinath@cs.umn.edu>
-
- * scandir.c (<sys/types.h>): Include.
- * gnomesupport-h.c (!HAVE_SCANDIR): Do all the `dirent' wrangling
- only if `scandir' is needed. Also, include <sys/types.h> in all
- cases.
-
-1998-04-13 Seth Alves <alves@twitch.cp.domain.net>
-
- * gnomesupport-h.c (HAVE_DIRENT_H): FreeBSD needs <sys/types.h>
- before <dirent.h>.
-
-1998-04-12 Raja R Harinath <harinath@cs.umn.edu>
-
- * Makefile.am (supportincludedir): Is now $(pkglibdir)/include.
- `gnomesupport.h' is a generated file dependent on the configure
- process. So, this seems a good place. The rest of the headers
- are also here just because I'm too lazy to maintain two separate
- include directories to search in for `libgnomesupport' stuff ;-)
- (supportinclude_DATA): New var. Has `gnomesupport.h'.
- (BUILT_SOURCES): Generate `gnomesupport.h'.
-
- * gnomesupport-h.c: New file. Used to generate `gnomesupport.h',
- which contains prototypes for many of the functions in
- `libgnomesupport'. This method is used to ensure that prototypes
- appear only for those functions that are provided by
- `libgnomesupport'.
-
- * scandir.c (alphasort): New utility function.
-
-1998-04-08 Raja R Harinath <harinath@cs.umn.edu>
-
- * scandir.c: Import from GNU libc.
- Remove assumptions that this file is compiled inside GLIBC.
- Here are the ChangeLog entries when I imported it originally into
- `gwp':
-
- 1998-02-08 Raja R Harinath <harinath@cs.umn.edu>
- * scandir.c (scandir): Revert change of `1998-02-07'.
- Don't use d_reclen, but fix the expression used to
- figure out the length.
-
- 1998-02-07 Raja R Harinath <harinath@cs.umn.edu>
- * scandir.c (scandir): Use `d_reclen' field to get length
- of record.
-
- 1998-02-06 Raja R Harinath <harinath@cs.umn.edu>
- * scandir.c: New file. Replacement function copied from
- glibc, edited to not step on implementation namespace.
-
-1998-03-28 Raja R Harinath <harinath@cs.umn.edu>
-
- * vasprintf.c (int_vasprintf): Imported from GNU libit-0.4.
- Applied a change that appears in `libiberty'.
-
-Fri Mar 13 21:30:34 1998 Tom Tromey <tromey@cygnus.com>
-
- * argp.texi: Imported from glibc.
- * Makefile.am (EXTRA_DIST): Added argp.texi.
-
-1998-03-12 Raja R Harinath <harinath@cs.umn.edu>
-
- * Makefile.am (noinst_HEADERS): Don't install argp-fmtstream.h and
- argp-namefrob.h. They are used only to compile `argp' and not for
- general usage.
-
-1998-03-11 Raja R Harinath <harinath@cs.umn.edu>
-
- * getopt.h: Don't mention getopt() for C++. (Local fix).
-
- * vsnprintf.c: Actually fill it in. It is from
- <URL:http://theos.com/~deraadt/snprintf.c>, with one small fix to
- actually make it compile.
-
-1998-03-09 Raja R Harinath <harinath@cs.umn.edu>
-
- * easy-vsnprintf.c: New file. Provides (v)snprintf as simple
- wrappers to `__vsnprintf'.
- * vsnprintf.c: New file. Empty for now.
-
-Sun Mar 8 17:13:33 1998 Tom Tromey <tromey@cygnus.com>
-
- * Makefile.am: Rewrote. Library now named libgnomesupport, now
- installed if Gnome support code is built.
-
-Sat Mar 7 00:03:26 1998 Tom Tromey <tromey@cygnus.com>
-
- * gnome-argp.h (__mempcpy): New define.
-
- * strnlen.c: New file from glibc; needed by strndup.c.
-
-Fri Mar 6 20:10:55 1998 Tom Tromey <tromey@cygnus.com>
-
- * argp-fmtstream.h (__attribute__): Define unless using gcc.
- * argp.h (__attribute__): Define unless using gcc.
-
- * argp-help.c, argp-parse.c, argp.h: Imported new versions from
- glibc, while preserving local changes.
-
-Wed Mar 4 00:58:27 1998 Tom Tromey <tromey@cygnus.com>
-
- * Makefile.am (libsupport_a_SOURCES): Added gnome-argp.c.
- * gnome-argp.c: New file.
-
- * argp-parse.c: Include gnome-argp.h.
- * argp-help.c: Include gnome-argp.h.
-
- * README-gnome, gnome-argp.h: New files.
-
- * argp-ba.c, argp-eexst.c, argp-fmtstream.c, argp-fmtstream.h,
- argp-fs-xinl.c, argp-help.c, argp-namefrob.h, argp-parse.c,
- argp-pv.c, argp-pvh.c, argp-test.c, argp-xinl.c, argp.h,
- strndup.c: New files, imported from glibc. Please use "cvs
- import" if you import new versions.
-
- * Makefile.am (noinst_HEADERS): Added argp-fmtstream.h,
- argp-namefrob.h, argp.h, gnome-argp.h.
- (EXTRA_DIST): New macro.
-
-1998-02-18 Raja R Harinath <harinath@cs.umn.edu>
-
- * strcasecmp.c: New file, copied from `glibc'. Used to provide
- replacement `strcasecmp' file.
-
-
+++ /dev/null
-## Process this file with automake to produce Makefile.in.
-
-supportexecincludedir = $(includedir)/gnome/$(GNOME_INTERFACE_VERSION)
-
-INCLUDES = -D_GNU_SOURCE
-
-lib_LTLIBRARIES = libgnomesupport-2.0.la
-
-# it is in _DATA since we don't want `gnomesupport.h' to be part of
-# the distributed `.tar.gz' file
-supportexecinclude_DATA = gnomesupport.h
-
-# These are internal headers: they are used only when compiling and
-# should not be installed
-#noinst_HEADERS = gnomesupport-fake.h \
-# findme.h poptint.h system.h
-
-# Hmm... should we move `error.h' here.
-#include_HEADERS = popt-gnome.h
-
-#popt_sources = findme.c poptconfig.c poptparse.c popt.c popthelp.c
-popt_sources=
-
-libgnomesupport_2_0_la_SOURCES = gnomesupport.h $(popt_sources) gnome-argp.c
-libgnomesupport_2_0_la_LIBADD = @LTLIBOBJS@
-libgnomesupport_2_0_la_LDFLAGS = -version-info 0:0:0
-
-BUILT_SOURCES = gnomesupport.h
-
-# error.o is not always built. In the case when it is built, make
-# sure gnomesupport.h is built first.
-error.o: gnomesupport.h
-
-gnomesupport.h: gnomesupport.awk $(top_builddir)/config.h
- $(AWK) -f $(srcdir)/gnomesupport.awk < $(top_builddir)/config.h > gsh-t
- mv gsh-t gnomesupport.h
-
-EXTRA_DIST = gnomesupport.awk README-gnome \
- canonicalize.c easy-vsnprintf.c error.c error.h \
- findme.c findme.h getopt.c getopt.h getopt1.c \
- gnome-argp.c gnome-argp.h gnomesupport-fake.h \
- memmove.c mkstemp.c popt-gnome.h popt.c poptconfig.c \
- popthelp.c poptint.h poptparse.c scandir.c strcasecmp.c \
- strerror.c strndup.c strnlen.c strtod.c strtok_r.c strtol.c \
- strtoul.c vasprintf.c vsnprintf.c gnome-support-2.0.pc.in
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = gnome-support-2.0.pc
-
+++ /dev/null
-Note to Gnome hackers:
-
-If you change anything related to popt, please forward these changes to
-ewt@redhat.com, the popt package maintainer.
-
-- jgarzik@pobox.com 12/24/1998
-
-
-Some files in this directory are taken verbatim from glibc.
-Do not modify them. If you find a bug, report it as you would any
-glibc bug.
-
-When updating the glibc files in the master Gnome repository, be sure
-to use "cvs import". That will ensure that any local changes are
-merged in.
-
-Yes, there are some minor local changes. Hopefully these will be
-sorted out with the glibc maintainer before long.
-
-- Tom Tromey <tromey@cygnus.com>
- Wed, Mar 4 1998
-
-
-
-Notes on CVS import:
-
-This directory has files from two "vendors". There are, thus, two
-vendor branches
-
- 1.1.1 GNU
- 1.1.2 SNPRINTF_de_Raadt
-
-The files that have "vendor" versions are:
-
- argp-ba.c GNU
- argp-eexst.c GNU
- argp-fmtstream.c GNU
- argp-fmtstream.h GNU
- argp-fs-xinl.c GNU
- argp-help.c GNU
- argp-namefrob.h GNU
- argp-parse.c GNU
- argp-pv.c GNU
- argp-pvh.c GNU
- argp-test.c GNU
- argp-xinl.c GNU
- argp.h GNU
- getopt.c GNU
- getopt.h GNU
- getopt1.c GNU
- strcasecmp.c GNU
- strndup.c GNU
- strnlen.c GNU
- strtok_r.c GNU
- vasprintf.c GNU
- vsnprintf.c SNPRINTF_de_Raadt
-
-To find out the list of changes made against a "vendor" revision, you
-can say
-
- cvs diff -r <vendor-branch-tag>
-
-When any of these files are changed by the vendor, they can be
-reimported. At the time of importing, please make sure you use the
-correct branch revision and vendor tag.
-
-So, if you are importing changes to any of the `GNU' files, please use
-
- cvs import -b 1.1.1 gnome-common/support GNU <new-release-tag>
-
-If you are importing changes to "SNPRINTF_de_Raadt" files, please use
-
- cvs import -b 1.1.2 gnome-common/support SNPRINTF_de_Raadt <new-rel-tag>
- ^^^^^^^ ^^^^^^^^^^^^^^^^^^^
- | |
- Branch revision Vendor Tag
-
-In other words the "Branch revision" and "Vendor Tag" must agree.
-
-- Raja R Harinath <harinath@cs.umn.edu>
- 1998-03-11
-
-
-
-Good places to get "support" functions:
-
-`libgnomesupport' is essentially a `glibc' emulation library, and hence
-`glibc' itself is a good source. However, some of the functions cannot
-be easily ripped out and put here (esp. any of the stdio-derived
-functions). Other places are:
-
-* libiberty from your friendly Cygnus source distribution, e.g.,
- binutils, gdb. The only caveat is that these cannot be used drop-in:
- you have to remove references to other files in the Cygnus tree &c.
-
-* libit, which appeared briefly on ftp://alpha.gnu.org
-
-* Jim Meyering's collection from his `fileutils'/`sh-utils'/`textutils'
- packages
-
-- Raja R Harinath
- 1998-03-28
+++ /dev/null
-This directory is *shared* between a lot of modules in GNOME CVS -
-which means that every change you're doing here immediately affects
-a very large number of modules.
-
-Please, do *ALWAYS ASK FIRST* on gnome-hackers@gnome.org before you
-commit anything to this directory. If unsure, feel free to send me
-a patch <martin@gnome.org> and I'll commit it for you it it's ok.
-
-Thanks for your understanding,
-
-August 1st, 2001
-Martin Baulig <martin@gnome.org>
-
+++ /dev/null
-/* Return the canonical absolute name of a given file.
- Copyright (C) 1996 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <limits.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <errno.h>
-
-#include <gnome-argp.h>
-
-/* Return the canonical absolute name of file NAME. A canonical name
- does not contain any `.', `..' components nor any repeated path
- separators ('/') or symlinks. All path components must exist. If
- RESOLVED is null, the result is malloc'd; otherwise, if the
- canonical name is PATH_MAX chars or more, returns null with `errno'
- set to ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars,
- returns the name in RESOLVED. If the name cannot be resolved and
- RESOLVED is non-NULL, it contains the path of the first component
- that cannot be resolved. If the path can be resolved, RESOLVED
- holds the same value as the value returned. */
-
-#ifdef _LIBC
-#define set_errno(e) __set_errno(e)
-#else
-#define set_errno(e) errno = (e)
-#endif
-
-static char *
-canonicalize (const char *name, char *resolved)
-{
- char *rpath, *dest, *extra_buf = NULL;
- const char *start, *end, *rpath_limit;
- long int path_max;
- int num_links = 0;
-
-#ifdef PATH_MAX
- path_max = PATH_MAX;
-#else
- path_max = pathconf (name, _PC_PATH_MAX);
- if (path_max <= 0)
- path_max = 1024;
-#endif
-
- rpath = resolved ? __alloca (path_max) : malloc (path_max);
- rpath_limit = rpath + path_max;
-
- if (name[0] != '/')
- {
- if (!getcwd (rpath, path_max))
- goto error;
- dest = strchr (rpath, '\0');
- }
- else
- {
- rpath[0] = '/';
- dest = rpath + 1;
- }
-
- for (start = end = name; *start; start = end)
- {
- struct stat st;
- int n;
-
- /* skip sequence of multiple path-separators: */
- while (*start == '/') ++start;
-
- /* find end of path component: */
- for (end = start; *end && *end != '/'; ++end);
-
- if (end - start == 0)
- break;
- else if (strncmp (start, ".", end - start) == 0)
- /* nothing */;
- else if (strncmp (start, "..", end - start) == 0) {
- /* back up to previous component, ignore if at root already: */
- if (dest > rpath + 1)
- while ((--dest)[-1] != '/');
- } else
- {
- size_t new_size;
-
- if (dest[-1] != '/')
- *dest++ = '/';
-
- if (dest + (end - start) >= rpath_limit)
- {
- if (resolved)
- {
- set_errno (ENAMETOOLONG);
- goto error;
- }
- new_size = rpath_limit - rpath;
- if (end - start + 1 > path_max)
- new_size += end - start + 1;
- else
- new_size += path_max;
- rpath = realloc (rpath, new_size);
- rpath_limit = rpath + new_size;
- if (!rpath)
- return NULL;
- }
-
- memcpy (dest, start, end - start);
- dest += end - start;
- *dest = '\0';
-
- if (__lstat (rpath, &st) < 0)
- goto error;
-
- if (S_ISLNK (st.st_mode))
- {
- char *buf = __alloca (path_max);
-
- if (++num_links > MAXSYMLINKS)
- {
- set_errno (ELOOP);
- goto error;
- }
-
- n = readlink (rpath, buf, path_max);
- if (n < 0)
- goto error;
- buf[n] = '\0';
-
- if (!extra_buf)
- extra_buf = __alloca (path_max);
-
- if ((long int) (n + strlen (end)) >= path_max)
- {
- set_errno (ENAMETOOLONG);
- goto error;
- }
-
- /* careful here, end may be a pointer into extra_buf... */
- strcat (buf, end);
- strcpy (extra_buf, buf);
- name = end = extra_buf;
-
- if (buf[0] == '/')
- dest = rpath + 1; /* it's an absolute symlink */
- else
- /* back up to previous component, ignore if at root already: */
- if (dest > rpath + 1)
- while ((--dest)[-1] != '/');
- }
- else
- num_links = 0;
- }
- }
- if (dest > rpath + 1 && dest[-1] == '/')
- --dest;
- *dest = '\0';
-
- return resolved ? strcpy (resolved, rpath) : rpath;
-
-error:
- if (resolved)
- strcpy (resolved, rpath);
- else
- free (rpath);
- return NULL;
-}
-
-char *
-realpath (const char *name, char *resolved)
-{
- if (resolved == NULL)
- {
- set_errno (EINVAL);
- return NULL;
- }
-
- return canonicalize (name, resolved);
-}
-
-#if 0
-char *
-canonicalize_file_name (const char *name)
-{
- return canonicalize (name, NULL);
-}
-#endif
+++ /dev/null
-/* (v)snprintf in terms of __(v)snprintf
- *
- * Useful with Solaris 2.5 libc, which appears to have the `__*' versions
- * of (v)snprintf.
- *
- * This file is in the public domain
- * (in case it matters)
- */
-
-#include <stdarg.h>
-#include <stdlib.h>
-
-extern int __vsnprintf (char *, size_t, const char *, va_list);
-
-int
-vsnprintf (char *string, size_t maxlen, const char *format, va_list args)
-{
- return __vsnprintf (string, maxlen, format, args);
-}
-
-int
-snprintf (char *string, size_t maxlen, const char *format, ...)
-{
- va_list args;
- int retval;
- va_start(args, format);
- retval = vsnprintf (string, maxlen, format, args);
- va_end(args);
- return retval;
-}
+++ /dev/null
-/* Error handler for noninteractive utilities
- Copyright (C) 1990,91,92,93,94,95,96,97,98 Free Software Foundation, Inc.
-
- This file is part of the GNU C Library. Its master source is NOT part of
- the C library, however. The master source lives in /gd/gnu/lib.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <gnomesupport-fake.h>
-
-#include <stdio.h>
-
-#if HAVE_VPRINTF || HAVE_DOPRNT || _LIBC
-# if __STDC__
-# include <stdarg.h>
-# define VA_START(args, lastarg) va_start(args, lastarg)
-# else
-# include <varargs.h>
-# define VA_START(args, lastarg) va_start(args)
-# endif
-#else
-# define va_alist a1, a2, a3, a4, a5, a6, a7, a8
-# define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
-#endif
-
-#if STDC_HEADERS || _LIBC
-# include <stdlib.h>
-# include <string.h>
-#else
-void exit ();
-#endif
-
-#include "error.h"
-
-#ifndef _
-# define _(String) String
-#endif
-
-/* If NULL, error will flush stdout, then print on stderr the program
- name, a colon and a space. Otherwise, error will call this
- function without parameters instead. */
-void (*error_print_progname) (
-#if __STDC__ - 0
- void
-#endif
- );
-
-/* This variable is incremented each time `error' is called. */
-unsigned int error_message_count;
-
-#if HAVE_PROGRAM_INVOCATION_NAME || _LIBC
-/* In the GNU C library, there is a predefined variable for this. */
-
-# define program_name program_invocation_name
-# include <errno.h>
-
-#else
-
-/* The calling program should define program_name and set it to the
- name of the executing program. */
-extern char *program_name;
-
-#endif
-
-#ifdef _LIBC
-/* In GNU libc we want do not want to use the common name `error' directly.
- Instead make it a weak alias. */
-# define error __error
-# define error_at_line __error_at_line
-
-# define strerror_r __strerror_r
-
-#else /* not _LIBC */
-
-# if ! HAVE_STRERROR_R
-# if HAVE_STRERROR
-# ifndef strerror /* On some systems, strerror is a macro */
-char *strerror ();
-# endif
-# else
-static char *
-private_strerror (errnum)
- int errnum;
-{
- extern char *sys_errlist[];
- extern int sys_nerr;
-
- if (errnum > 0 && errnum <= sys_nerr)
- return _(sys_errlist[errnum]);
- return _("Unknown system error");
-}
-# define strerror private_strerror
-# endif /* HAVE_STRERROR */
-# endif /* ! HAVE_STRERROR_R */
-#endif /* not _LIBC */
-
-/* Print the program name and error message MESSAGE, which is a printf-style
- format string with optional args.
- If ERRNUM is nonzero, print its corresponding system error message.
- Exit with status STATUS if it is nonzero. */
-/* VARARGS */
-
-void
-#if defined VA_START && __STDC__
-error (int status, int errnum, const char *message, ...)
-#else
-error (status, errnum, message, va_alist)
- int status;
- int errnum;
- char *message;
- va_dcl
-#endif
-{
-#ifdef VA_START
- va_list args;
-#endif
-
- if (error_print_progname)
- (*error_print_progname) ();
- else
- {
- fflush (stdout);
- fprintf (stderr, "%s: ", program_name);
- }
-
-#ifdef VA_START
- VA_START (args, message);
-# if HAVE_VPRINTF || _LIBC
- vfprintf (stderr, message, args);
-# else
- _doprnt (message, args, stderr);
-# endif
- va_end (args);
-#else
- fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
-#endif
-
- ++error_message_count;
- if (errnum)
- {
-#if defined HAVE_STRERROR_R || defined _LIBC
- char errbuf[1024];
- fprintf (stderr, ": %s", strerror_r (errnum, errbuf, sizeof errbuf));
-#else
- fprintf (stderr, ": %s", strerror (errnum));
-#endif
- }
- putc ('\n', stderr);
- fflush (stderr);
- if (status)
- exit (status);
-}
-
-/* Sometimes we want to have at most one error per line. This
- variable controls whether this mode is selected or not. */
-int error_one_per_line;
-
-void
-#if defined VA_START && __STDC__
-error_at_line (int status, int errnum, const char *file_name,
- unsigned int line_number, const char *message, ...)
-#else
-error_at_line (status, errnum, file_name, line_number, message, va_alist)
- int status;
- int errnum;
- const char *file_name;
- unsigned int line_number;
- char *message;
- va_dcl
-#endif
-{
-#ifdef VA_START
- va_list args;
-#endif
-
- if (error_one_per_line)
- {
- static const char *old_file_name;
- static unsigned int old_line_number;
-
- if (old_line_number == line_number &&
- (file_name == old_file_name || !strcmp (old_file_name, file_name)))
- /* Simply return and print nothing. */
- return;
-
- old_file_name = file_name;
- old_line_number = line_number;
- }
-
- if (error_print_progname)
- (*error_print_progname) ();
- else
- {
- fflush (stdout);
- fprintf (stderr, "%s:", program_name);
- }
-
- if (file_name != NULL)
- fprintf (stderr, "%s:%d: ", file_name, line_number);
-
-#ifdef VA_START
- VA_START (args, message);
-# if HAVE_VPRINTF || _LIBC
- vfprintf (stderr, message, args);
-# else
- _doprnt (message, args, stderr);
-# endif
- va_end (args);
-#else
- fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
-#endif
-
- ++error_message_count;
- if (errnum)
- {
-#if defined HAVE_STRERROR_R || defined _LIBC
- char errbuf[1024];
- fprintf (stderr, ": %s", strerror_r (errnum, errbuf, sizeof errbuf));
-#else
- fprintf (stderr, ": %s", strerror (errnum));
-#endif
- }
- putc ('\n', stderr);
- fflush (stderr);
- if (status)
- exit (status);
-}
-
-#ifdef _LIBC
-/* Make the weak alias. */
-# undef error
-# undef error_at_line
-weak_alias (__error, error)
-weak_alias (__error_at_line, error_at_line)
-#endif
+++ /dev/null
-/* Declaration for error-reporting function
- Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
-
- This file is part of the GNU C Library. Its master source is NOT part of
- the C library, however. The master source lives in /gd/gnu/lib.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _ERROR_H
-#define _ERROR_H 1
-
-#ifndef __attribute__
-/* This feature is available in gcc versions 2.5 and later. */
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
-# define __attribute__(Spec) /* empty */
-# endif
-/* The __-protected variants of `format' and `printf' attributes
- are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
-# define __format__ format
-# define __printf__ printf
-# endif
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if defined (__STDC__) && __STDC__
-
-/* Print a message with `fprintf (stderr, FORMAT, ...)';
- if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
- If STATUS is nonzero, terminate the program with `exit (STATUS)'. */
-
-extern void error (int status, int errnum, const char *format, ...)
- __attribute__ ((__format__ (__printf__, 3, 4)));
-
-extern void error_at_line (int status, int errnum, const char *fname,
- unsigned int lineno, const char *format, ...)
- __attribute__ ((__format__ (__printf__, 5, 6)));
-
-/* If NULL, error will flush stdout, then print on stderr the program
- name, a colon and a space. Otherwise, error will call this
- function without parameters instead. */
-extern void (*error_print_progname) (void);
-
-#else
-void error ();
-void error_at_line ();
-extern void (*error_print_progname) ();
-#endif
-
-/* This variable is incremented each time `error' is called. */
-extern unsigned int error_message_count;
-
-/* Sometimes we want to have at most one error per line. This
- variable controls whether this mode is selected or not. */
-extern int error_one_per_line;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* error.h */
+++ /dev/null
-/* (C) 1998 Red Hat Software, Inc. -- Licensing details are in the COPYING
- file accompanying popt source distributions, available from
- ftp://ftp.redhat.com/pub/code/popt */
-
-#include "system.h"
-#include "findme.h"
-
-const char * findProgramPath(const char * argv0) {
- char * path = getenv("PATH");
- char * pathbuf;
- char * start, * chptr;
- char * buf;
-
- /* If there is a / in the argv[0], it has to be an absolute
- path */
- if (strchr(argv0, '/'))
- return xstrdup(argv0);
-
- if (!path) return NULL;
-
- start = pathbuf = alloca(strlen(path) + 1);
- buf = malloc(strlen(path) + strlen(argv0) + 2);
- strcpy(pathbuf, path);
-
- chptr = NULL;
- do {
- if ((chptr = strchr(start, ':')))
- *chptr = '\0';
- sprintf(buf, "%s/%s", start, argv0);
-
- if (!access(buf, X_OK))
- return buf;
-
- if (chptr)
- start = chptr + 1;
- else
- start = NULL;
- } while (start && *start);
-
- free(buf);
-
- return NULL;
-}
+++ /dev/null
-/* (C) 1998 Red Hat Software, Inc. -- Licensing details are in the COPYING
- file accompanying popt source distributions, available from
- ftp://ftp.redhat.com/pub/code/popt */
-
-#ifndef H_FINDME
-#define H_FINDME
-
-const char * findProgramPath(const char * argv0);
-
-#endif
+++ /dev/null
-/* Getopt for GNU.
- NOTE: getopt is now part of the C library, so if you don't know what
- "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
- before changing it!
-
- Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97
- Free Software Foundation, Inc.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
- Ditto for AIX 3.2 and <stdlib.h>. */
-#ifndef _NO_PROTO
-#define _NO_PROTO
-#endif
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#if !defined (__STDC__) || !__STDC__
-/* This is a separate conditional since some stdc systems
- reject `defined (const)'. */
-#ifndef const
-#define const
-#endif
-#endif
-
-#include <stdio.h>
-
-/* Comment out all this code if we are using the GNU C Library, and are not
- actually compiling the library itself. This code is part of the GNU C
- Library, but also included in many other GNU distributions. Compiling
- and linking in this code is a waste when using the GNU C library
- (especially if it is a shared library). Rather than having every GNU
- program understand `configure --with-gnu-libc' and omit the object files,
- it is simpler to just do this in the source for each such file. */
-
-#define GETOPT_INTERFACE_VERSION 2
-#if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2
-#include <gnu-versions.h>
-#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
-#define ELIDE_CODE
-#endif
-#endif
-
-#ifndef ELIDE_CODE
-
-
-/* This needs to come after some library #include
- to get __GNU_LIBRARY__ defined. */
-#ifdef __GNU_LIBRARY__
-/* Don't include stdlib.h for non-GNU C libraries because some of them
- contain conflicting prototypes for getopt. */
-#include <stdlib.h>
-#include <unistd.h>
-#endif /* GNU C library. */
-
-#ifdef VMS
-#include <unixlib.h>
-#if HAVE_STRING_H - 0
-#include <string.h>
-#endif
-#endif
-
-#ifndef _
-/* This is for other GNU distributions with internationalized messages.
- When compiling libc, the _ macro is predefined. */
-#ifdef HAVE_LIBINTL_H
-# include <libintl.h>
-# define _(msgid) gettext (msgid)
-#else
-# define _(msgid) (msgid)
-#endif
-#endif
-
-/* This version of `getopt' appears to the caller like standard Unix `getopt'
- but it behaves differently for the user, since it allows the user
- to intersperse the options with the other arguments.
-
- As `getopt' works, it permutes the elements of ARGV so that,
- when it is done, all the options precede everything else. Thus
- all application programs are extended to handle flexible argument order.
-
- Setting the environment variable POSIXLY_CORRECT disables permutation.
- Then the behavior is completely standard.
-
- GNU application programs can use a third alternative mode in which
- they can distinguish the relative order of options and other arguments. */
-
-#include "getopt.h"
-
-/* For communication from `getopt' to the caller.
- When `getopt' finds an option that takes an argument,
- the argument value is returned here.
- Also, when `ordering' is RETURN_IN_ORDER,
- each non-option ARGV-element is returned here. */
-
-char *optarg = NULL;
-
-/* Index in ARGV of the next element to be scanned.
- This is used for communication to and from the caller
- and for communication between successive calls to `getopt'.
-
- On entry to `getopt', zero means this is the first call; initialize.
-
- When `getopt' returns -1, this is the index of the first of the
- non-option elements that the caller should itself scan.
-
- Otherwise, `optind' communicates from one call to the next
- how much of ARGV has been scanned so far. */
-
-/* 1003.2 says this must be 1 before any call. */
-int optind = 1;
-
-/* Formerly, initialization of getopt depended on optind==0, which
- causes problems with re-calling getopt as programs generally don't
- know that. */
-
-int __getopt_initialized = 0;
-
-/* The next char to be scanned in the option-element
- in which the last option character we returned was found.
- This allows us to pick up the scan where we left off.
-
- If this is zero, or a null string, it means resume the scan
- by advancing to the next ARGV-element. */
-
-static char *nextchar;
-
-/* Callers store zero here to inhibit the error message
- for unrecognized options. */
-
-int opterr = 1;
-
-/* Set to an option character which was unrecognized.
- This must be initialized on some systems to avoid linking in the
- system's own getopt implementation. */
-
-int optopt = '?';
-
-/* Describe how to deal with options that follow non-option ARGV-elements.
-
- If the caller did not specify anything,
- the default is REQUIRE_ORDER if the environment variable
- POSIXLY_CORRECT is defined, PERMUTE otherwise.
-
- REQUIRE_ORDER means don't recognize them as options;
- stop option processing when the first non-option is seen.
- This is what Unix does.
- This mode of operation is selected by either setting the environment
- variable POSIXLY_CORRECT, or using `+' as the first character
- of the list of option characters.
-
- PERMUTE is the default. We permute the contents of ARGV as we scan,
- so that eventually all the non-options are at the end. This allows options
- to be given in any order, even with programs that were not written to
- expect this.
-
- RETURN_IN_ORDER is an option available to programs that were written
- to expect options and other ARGV-elements in any order and that care about
- the ordering of the two. We describe each non-option ARGV-element
- as if it were the argument of an option with character code 1.
- Using `-' as the first character of the list of option characters
- selects this mode of operation.
-
- The special argument `--' forces an end of option-scanning regardless
- of the value of `ordering'. In the case of RETURN_IN_ORDER, only
- `--' can cause `getopt' to return -1 with `optind' != ARGC. */
-
-static enum
-{
- REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
-} ordering;
-
-/* Value of POSIXLY_CORRECT environment variable. */
-static char *posixly_correct;
-
-#ifdef __GNU_LIBRARY__
-/* We want to avoid inclusion of string.h with non-GNU libraries
- because there are many ways it can cause trouble.
- On some systems, it contains special magic macros that don't work
- in GCC. */
-#include <string.h>
-#define my_index strchr
-#else
-
-/* Avoid depending on library functions or files
- whose names are inconsistent. */
-
-char *getenv ();
-
-static char *
-my_index (str, chr)
- const char *str;
- int chr;
-{
- while (*str)
- {
- if (*str == chr)
- return (char *) str;
- str++;
- }
- return 0;
-}
-
-/* If using GCC, we can safely declare strlen this way.
- If not using GCC, it is ok not to declare it. */
-#ifdef __GNUC__
-/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
- That was relevant to code that was here before. */
-#if !defined (__STDC__) || !__STDC__
-/* gcc with -traditional declares the built-in strlen to return int,
- and has done so at least since version 2.4.5. -- rms. */
-extern int strlen (const char *);
-#endif /* not __STDC__ */
-#endif /* __GNUC__ */
-
-#endif /* not __GNU_LIBRARY__ */
-
-/* Handle permutation of arguments. */
-
-/* Describe the part of ARGV that contains non-options that have
- been skipped. `first_nonopt' is the index in ARGV of the first of them;
- `last_nonopt' is the index after the last of them. */
-
-static int first_nonopt;
-static int last_nonopt;
-
-#ifdef _LIBC
-/* Bash 2.0 gives us an environment variable containing flags
- indicating ARGV elements that should not be considered arguments. */
-
-/* Defined in getopt_init.c */
-extern char *__getopt_nonoption_flags;
-
-static int nonoption_flags_max_len;
-static int nonoption_flags_len;
-
-static int original_argc;
-static char *const *original_argv;
-
-/* Make sure the environment variable bash 2.0 puts in the environment
- is valid for the getopt call we must make sure that the ARGV passed
- to getopt is that one passed to the process. */
-static void
-__attribute__ ((unused))
-store_args_and_env (int argc, char *const *argv)
-{
- /* XXX This is no good solution. We should rather copy the args so
- that we can compare them later. But we must not use malloc(3). */
- original_argc = argc;
- original_argv = argv;
-}
-# ifdef text_set_element
-text_set_element (__libc_subinit, store_args_and_env);
-# endif /* text_set_element */
-
-# define SWAP_FLAGS(ch1, ch2) \
- if (nonoption_flags_len > 0) \
- { \
- char __tmp = __getopt_nonoption_flags[ch1]; \
- __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \
- __getopt_nonoption_flags[ch2] = __tmp; \
- }
-#else /* !_LIBC */
-# define SWAP_FLAGS(ch1, ch2)
-#endif /* _LIBC */
-
-/* Exchange two adjacent subsequences of ARGV.
- One subsequence is elements [first_nonopt,last_nonopt)
- which contains all the non-options that have been skipped so far.
- The other is elements [last_nonopt,optind), which contains all
- the options processed since those non-options were skipped.
-
- `first_nonopt' and `last_nonopt' are relocated so that they describe
- the new indices of the non-options in ARGV after they are moved. */
-
-#if defined (__STDC__) && __STDC__
-static void exchange (char **);
-#endif
-
-static void
-exchange (argv)
- char **argv;
-{
- int bottom = first_nonopt;
- int middle = last_nonopt;
- int top = optind;
- char *tem;
-
- /* Exchange the shorter segment with the far end of the longer segment.
- That puts the shorter segment into the right place.
- It leaves the longer segment in the right place overall,
- but it consists of two parts that need to be swapped next. */
-
-#ifdef _LIBC
- /* First make sure the handling of the `__getopt_nonoption_flags'
- string can work normally. Our top argument must be in the range
- of the string. */
- if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len)
- {
- /* We must extend the array. The user plays games with us and
- presents new arguments. */
- char *new_str = malloc (top + 1);
- if (new_str == NULL)
- nonoption_flags_len = nonoption_flags_max_len = 0;
- else
- {
- memset (__mempcpy (new_str, __getopt_nonoption_flags,
- nonoption_flags_max_len),
- '\0', top + 1 - nonoption_flags_max_len);
- nonoption_flags_max_len = top + 1;
- __getopt_nonoption_flags = new_str;
- }
- }
-#endif
-
- while (top > middle && middle > bottom)
- {
- if (top - middle > middle - bottom)
- {
- /* Bottom segment is the short one. */
- int len = middle - bottom;
- register int i;
-
- /* Swap it with the top part of the top segment. */
- for (i = 0; i < len; i++)
- {
- tem = argv[bottom + i];
- argv[bottom + i] = argv[top - (middle - bottom) + i];
- argv[top - (middle - bottom) + i] = tem;
- SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
- }
- /* Exclude the moved bottom segment from further swapping. */
- top -= len;
- }
- else
- {
- /* Top segment is the short one. */
- int len = top - middle;
- register int i;
-
- /* Swap it with the bottom part of the bottom segment. */
- for (i = 0; i < len; i++)
- {
- tem = argv[bottom + i];
- argv[bottom + i] = argv[middle + i];
- argv[middle + i] = tem;
- SWAP_FLAGS (bottom + i, middle + i);
- }
- /* Exclude the moved top segment from further swapping. */
- bottom += len;
- }
- }
-
- /* Update records for the slots the non-options now occupy. */
-
- first_nonopt += (optind - last_nonopt);
- last_nonopt = optind;
-}
-
-/* Initialize the internal data when the first call is made. */
-
-#if defined (__STDC__) && __STDC__
-static const char *_getopt_initialize (int, char *const *, const char *);
-#endif
-static const char *
-_getopt_initialize (argc, argv, optstring)
- int argc;
- char *const *argv;
- const char *optstring;
-{
- /* Start processing options with ARGV-element 1 (since ARGV-element 0
- is the program name); the sequence of previously skipped
- non-option ARGV-elements is empty. */
-
- first_nonopt = last_nonopt = optind;
-
- nextchar = NULL;
-
- posixly_correct = getenv ("POSIXLY_CORRECT");
-
- /* Determine how to handle the ordering of options and nonoptions. */
-
- if (optstring[0] == '-')
- {
- ordering = RETURN_IN_ORDER;
- ++optstring;
- }
- else if (optstring[0] == '+')
- {
- ordering = REQUIRE_ORDER;
- ++optstring;
- }
- else if (posixly_correct != NULL)
- ordering = REQUIRE_ORDER;
- else
- ordering = PERMUTE;
-
-#ifdef _LIBC
- if (posixly_correct == NULL
- && argc == original_argc && argv == original_argv)
- {
- if (nonoption_flags_max_len == 0)
- {
- if (__getopt_nonoption_flags == NULL
- || __getopt_nonoption_flags[0] == '\0')
- nonoption_flags_max_len = -1;
- else
- {
- const char *orig_str = __getopt_nonoption_flags;
- int len = nonoption_flags_max_len = strlen (orig_str);
- if (nonoption_flags_max_len < argc)
- nonoption_flags_max_len = argc;
- __getopt_nonoption_flags =
- (char *) malloc (nonoption_flags_max_len);
- if (__getopt_nonoption_flags == NULL)
- nonoption_flags_max_len = -1;
- else
- memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
- '\0', nonoption_flags_max_len - len);
- }
- }
- nonoption_flags_len = nonoption_flags_max_len;
- }
- else
- nonoption_flags_len = 0;
-#endif
-
- return optstring;
-}
-
-/* Scan elements of ARGV (whose length is ARGC) for option characters
- given in OPTSTRING.
-
- If an element of ARGV starts with '-', and is not exactly "-" or "--",
- then it is an option element. The characters of this element
- (aside from the initial '-') are option characters. If `getopt'
- is called repeatedly, it returns successively each of the option characters
- from each of the option elements.
-
- If `getopt' finds another option character, it returns that character,
- updating `optind' and `nextchar' so that the next call to `getopt' can
- resume the scan with the following option character or ARGV-element.
-
- If there are no more option characters, `getopt' returns -1.
- Then `optind' is the index in ARGV of the first ARGV-element
- that is not an option. (The ARGV-elements have been permuted
- so that those that are not options now come last.)
-
- OPTSTRING is a string containing the legitimate option characters.
- If an option character is seen that is not listed in OPTSTRING,
- return '?' after printing an error message. If you set `opterr' to
- zero, the error message is suppressed but we still return '?'.
-
- If a char in OPTSTRING is followed by a colon, that means it wants an arg,
- so the following text in the same ARGV-element, or the text of the following
- ARGV-element, is returned in `optarg'. Two colons mean an option that
- wants an optional arg; if there is text in the current ARGV-element,
- it is returned in `optarg', otherwise `optarg' is set to zero.
-
- If OPTSTRING starts with `-' or `+', it requests different methods of
- handling the non-option ARGV-elements.
- See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
-
- Long-named options begin with `--' instead of `-'.
- Their names may be abbreviated as long as the abbreviation is unique
- or is an exact match for some defined option. If they have an
- argument, it follows the option name in the same ARGV-element, separated
- from the option name by a `=', or else the in next ARGV-element.
- When `getopt' finds a long-named option, it returns 0 if that option's
- `flag' field is nonzero, the value of the option's `val' field
- if the `flag' field is zero.
-
- The elements of ARGV aren't really const, because we permute them.
- But we pretend they're const in the prototype to be compatible
- with other systems.
-
- LONGOPTS is a vector of `struct option' terminated by an
- element containing a name which is zero.
-
- LONGIND returns the index in LONGOPT of the long-named option found.
- It is only valid when a long-named option has been found by the most
- recent call.
-
- If LONG_ONLY is nonzero, '-' as well as '--' can introduce
- long-named options. */
-
-int
-_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
- int argc;
- char *const *argv;
- const char *optstring;
- const struct option *longopts;
- int *longind;
- int long_only;
-{
- optarg = NULL;
-
- if (optind == 0 || !__getopt_initialized)
- {
- if (optind == 0)
- optind = 1; /* Don't scan ARGV[0], the program name. */
- optstring = _getopt_initialize (argc, argv, optstring);
- __getopt_initialized = 1;
- }
-
- /* Test whether ARGV[optind] points to a non-option argument.
- Either it does not have option syntax, or there is an environment flag
- from the shell indicating it is not an option. The later information
- is only used when the used in the GNU libc. */
-#ifdef _LIBC
-#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \
- || (optind < nonoption_flags_len \
- && __getopt_nonoption_flags[optind] == '1'))
-#else
-#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
-#endif
-
- if (nextchar == NULL || *nextchar == '\0')
- {
- /* Advance to the next ARGV-element. */
-
- /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
- moved back by the user (who may also have changed the arguments). */
- if (last_nonopt > optind)
- last_nonopt = optind;
- if (first_nonopt > optind)
- first_nonopt = optind;
-
- if (ordering == PERMUTE)
- {
- /* If we have just processed some options following some non-options,
- exchange them so that the options come first. */
-
- if (first_nonopt != last_nonopt && last_nonopt != optind)
- exchange ((char **) argv);
- else if (last_nonopt != optind)
- first_nonopt = optind;
-
- /* Skip any additional non-options
- and extend the range of non-options previously skipped. */
-
- while (optind < argc && NONOPTION_P)
- optind++;
- last_nonopt = optind;
- }
-
- /* The special ARGV-element `--' means premature end of options.
- Skip it like a null option,
- then exchange with previous non-options as if it were an option,
- then skip everything else like a non-option. */
-
- if (optind != argc && !strcmp (argv[optind], "--"))
- {
- optind++;
-
- if (first_nonopt != last_nonopt && last_nonopt != optind)
- exchange ((char **) argv);
- else if (first_nonopt == last_nonopt)
- first_nonopt = optind;
- last_nonopt = argc;
-
- optind = argc;
- }
-
- /* If we have done all the ARGV-elements, stop the scan
- and back over any non-options that we skipped and permuted. */
-
- if (optind == argc)
- {
- /* Set the next-arg-index to point at the non-options
- that we previously skipped, so the caller will digest them. */
- if (first_nonopt != last_nonopt)
- optind = first_nonopt;
- return -1;
- }
-
- /* If we have come to a non-option and did not permute it,
- either stop the scan or describe it to the caller and pass it by. */
-
- if (NONOPTION_P)
- {
- if (ordering == REQUIRE_ORDER)
- return -1;
- optarg = argv[optind++];
- return 1;
- }
-
- /* We have found another option-ARGV-element.
- Skip the initial punctuation. */
-
- nextchar = (argv[optind] + 1
- + (longopts != NULL && argv[optind][1] == '-'));
- }
-
- /* Decode the current option-ARGV-element. */
-
- /* Check whether the ARGV-element is a long option.
-
- If long_only and the ARGV-element has the form "-f", where f is
- a valid short option, don't consider it an abbreviated form of
- a long option that starts with f. Otherwise there would be no
- way to give the -f short option.
-
- On the other hand, if there's a long option "fubar" and
- the ARGV-element is "-fu", do consider that an abbreviation of
- the long option, just like "--fu", and not "-f" with arg "u".
-
- This distinction seems to be the most useful approach. */
-
- if (longopts != NULL
- && (argv[optind][1] == '-'
- || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
- {
- char *nameend;
- const struct option *p;
- const struct option *pfound = NULL;
- int exact = 0;
- int ambig = 0;
- int indfound = -1;
- int option_index;
-
- for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
- /* Do nothing. */ ;
-
- /* Test all long options for either exact match
- or abbreviated matches. */
- for (p = longopts, option_index = 0; p->name; p++, option_index++)
- if (!strncmp (p->name, nextchar, nameend - nextchar))
- {
- if ((unsigned int) (nameend - nextchar)
- == (unsigned int) strlen (p->name))
- {
- /* Exact match found. */
- pfound = p;
- indfound = option_index;
- exact = 1;
- break;
- }
- else if (pfound == NULL)
- {
- /* First nonexact match found. */
- pfound = p;
- indfound = option_index;
- }
- else
- /* Second or later nonexact match found. */
- ambig = 1;
- }
-
- if (ambig && !exact)
- {
- if (opterr)
- fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
- argv[0], argv[optind]);
- nextchar += strlen (nextchar);
- optind++;
- optopt = 0;
- return '?';
- }
-
- if (pfound != NULL)
- {
- option_index = indfound;
- optind++;
- if (*nameend)
- {
- /* Don't test has_arg with >, because some C compilers don't
- allow it to be used on enums. */
- if (pfound->has_arg)
- optarg = nameend + 1;
- else
- {
- if (opterr)
- if (argv[optind - 1][1] == '-')
- /* --option */
- fprintf (stderr,
- _("%s: option `--%s' doesn't allow an argument\n"),
- argv[0], pfound->name);
- else
- /* +option or -option */
- fprintf (stderr,
- _("%s: option `%c%s' doesn't allow an argument\n"),
- argv[0], argv[optind - 1][0], pfound->name);
-
- nextchar += strlen (nextchar);
-
- optopt = pfound->val;
- return '?';
- }
- }
- else if (pfound->has_arg == 1)
- {
- if (optind < argc)
- optarg = argv[optind++];
- else
- {
- if (opterr)
- fprintf (stderr,
- _("%s: option `%s' requires an argument\n"),
- argv[0], argv[optind - 1]);
- nextchar += strlen (nextchar);
- optopt = pfound->val;
- return optstring[0] == ':' ? ':' : '?';
- }
- }
- nextchar += strlen (nextchar);
- if (longind != NULL)
- *longind = option_index;
- if (pfound->flag)
- {
- *(pfound->flag) = pfound->val;
- return 0;
- }
- return pfound->val;
- }
-
- /* Can't find it as a long option. If this is not getopt_long_only,
- or the option starts with '--' or is not a valid short
- option, then it's an error.
- Otherwise interpret it as a short option. */
- if (!long_only || argv[optind][1] == '-'
- || my_index (optstring, *nextchar) == NULL)
- {
- if (opterr)
- {
- if (argv[optind][1] == '-')
- /* --option */
- fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
- argv[0], nextchar);
- else
- /* +option or -option */
- fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
- argv[0], argv[optind][0], nextchar);
- }
- nextchar = (char *) "";
- optind++;
- optopt = 0;
- return '?';
- }
- }
-
- /* Look at and handle the next short option-character. */
-
- {
- char c = *nextchar++;
- char *temp = my_index (optstring, c);
-
- /* Increment `optind' when we start to process its last character. */
- if (*nextchar == '\0')
- ++optind;
-
- if (temp == NULL || c == ':')
- {
- if (opterr)
- {
- if (posixly_correct)
- /* 1003.2 specifies the format of this message. */
- fprintf (stderr, _("%s: illegal option -- %c\n"),
- argv[0], c);
- else
- fprintf (stderr, _("%s: invalid option -- %c\n"),
- argv[0], c);
- }
- optopt = c;
- return '?';
- }
- /* Convenience. Treat POSIX -W foo same as long option --foo */
- if (temp[0] == 'W' && temp[1] == ';')
- {
- char *nameend;
- const struct option *p;
- const struct option *pfound = NULL;
- int exact = 0;
- int ambig = 0;
- int indfound = 0;
- int option_index;
-
- /* This is an option that requires an argument. */
- if (*nextchar != '\0')
- {
- optarg = nextchar;
- /* If we end this ARGV-element by taking the rest as an arg,
- we must advance to the next element now. */
- optind++;
- }
- else if (optind == argc)
- {
- if (opterr)
- {
- /* 1003.2 specifies the format of this message. */
- fprintf (stderr, _("%s: option requires an argument -- %c\n"),
- argv[0], c);
- }
- optopt = c;
- if (optstring[0] == ':')
- c = ':';
- else
- c = '?';
- return c;
- }
- else
- /* We already incremented `optind' once;
- increment it again when taking next ARGV-elt as argument. */
- optarg = argv[optind++];
-
- /* optarg is now the argument, see if it's in the
- table of longopts. */
-
- for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++)
- /* Do nothing. */ ;
-
- /* Test all long options for either exact match
- or abbreviated matches. */
- for (p = longopts, option_index = 0; p->name; p++, option_index++)
- if (!strncmp (p->name, nextchar, nameend - nextchar))
- {
- if ((unsigned int) (nameend - nextchar) == strlen (p->name))
- {
- /* Exact match found. */
- pfound = p;
- indfound = option_index;
- exact = 1;
- break;
- }
- else if (pfound == NULL)
- {
- /* First nonexact match found. */
- pfound = p;
- indfound = option_index;
- }
- else
- /* Second or later nonexact match found. */
- ambig = 1;
- }
- if (ambig && !exact)
- {
- if (opterr)
- fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
- argv[0], argv[optind]);
- nextchar += strlen (nextchar);
- optind++;
- return '?';
- }
- if (pfound != NULL)
- {
- option_index = indfound;
- if (*nameend)
- {
- /* Don't test has_arg with >, because some C compilers don't
- allow it to be used on enums. */
- if (pfound->has_arg)
- optarg = nameend + 1;
- else
- {
- if (opterr)
- fprintf (stderr, _("\
-%s: option `-W %s' doesn't allow an argument\n"),
- argv[0], pfound->name);
-
- nextchar += strlen (nextchar);
- return '?';
- }
- }
- else if (pfound->has_arg == 1)
- {
- if (optind < argc)
- optarg = argv[optind++];
- else
- {
- if (opterr)
- fprintf (stderr,
- _("%s: option `%s' requires an argument\n"),
- argv[0], argv[optind - 1]);
- nextchar += strlen (nextchar);
- return optstring[0] == ':' ? ':' : '?';
- }
- }
- nextchar += strlen (nextchar);
- if (longind != NULL)
- *longind = option_index;
- if (pfound->flag)
- {
- *(pfound->flag) = pfound->val;
- return 0;
- }
- return pfound->val;
- }
- nextchar = NULL;
- return 'W'; /* Let the application handle it. */
- }
- if (temp[1] == ':')
- {
- if (temp[2] == ':')
- {
- /* This is an option that accepts an argument optionally. */
- if (*nextchar != '\0')
- {
- optarg = nextchar;
- optind++;
- }
- else
- optarg = NULL;
- nextchar = NULL;
- }
- else
- {
- /* This is an option that requires an argument. */
- if (*nextchar != '\0')
- {
- optarg = nextchar;
- /* If we end this ARGV-element by taking the rest as an arg,
- we must advance to the next element now. */
- optind++;
- }
- else if (optind == argc)
- {
- if (opterr)
- {
- /* 1003.2 specifies the format of this message. */
- fprintf (stderr,
- _("%s: option requires an argument -- %c\n"),
- argv[0], c);
- }
- optopt = c;
- if (optstring[0] == ':')
- c = ':';
- else
- c = '?';
- }
- else
- /* We already incremented `optind' once;
- increment it again when taking next ARGV-elt as argument. */
- optarg = argv[optind++];
- nextchar = NULL;
- }
- }
- return c;
- }
-}
-
-int
-getopt (argc, argv, optstring)
- int argc;
- char *const *argv;
- const char *optstring;
-{
- return _getopt_internal (argc, argv, optstring,
- (const struct option *) 0,
- (int *) 0,
- 0);
-}
-
-#endif /* Not ELIDE_CODE. */
-
-#ifdef TEST
-
-/* Compile with -DTEST to make an executable for use in testing
- the above definition of `getopt'. */
-
-int
-main (argc, argv)
- int argc;
- char **argv;
-{
- int c;
- int digit_optind = 0;
-
- while (1)
- {
- int this_option_optind = optind ? optind : 1;
-
- c = getopt (argc, argv, "abc:d:0123456789");
- if (c == -1)
- break;
-
- switch (c)
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- if (digit_optind != 0 && digit_optind != this_option_optind)
- printf ("digits occur in two different argv-elements.\n");
- digit_optind = this_option_optind;
- printf ("option %c\n", c);
- break;
-
- case 'a':
- printf ("option a\n");
- break;
-
- case 'b':
- printf ("option b\n");
- break;
-
- case 'c':
- printf ("option c with value `%s'\n", optarg);
- break;
-
- case '?':
- break;
-
- default:
- printf ("?? getopt returned character code 0%o ??\n", c);
- }
- }
-
- if (optind < argc)
- {
- printf ("non-option ARGV-elements: ");
- while (optind < argc)
- printf ("%s ", argv[optind++]);
- printf ("\n");
- }
-
- exit (0);
-}
-
-#endif /* TEST */
+++ /dev/null
-/* Declarations for getopt.
- Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _GETOPT_H
-#define _GETOPT_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* For communication from `getopt' to the caller.
- When `getopt' finds an option that takes an argument,
- the argument value is returned here.
- Also, when `ordering' is RETURN_IN_ORDER,
- each non-option ARGV-element is returned here. */
-
-extern char *optarg;
-
-/* Index in ARGV of the next element to be scanned.
- This is used for communication to and from the caller
- and for communication between successive calls to `getopt'.
-
- On entry to `getopt', zero means this is the first call; initialize.
-
- When `getopt' returns -1, this is the index of the first of the
- non-option elements that the caller should itself scan.
-
- Otherwise, `optind' communicates from one call to the next
- how much of ARGV has been scanned so far. */
-
-extern int optind;
-
-/* Callers store zero here to inhibit the error message `getopt' prints
- for unrecognized options. */
-
-extern int opterr;
-
-/* Set to an option character which was unrecognized. */
-
-extern int optopt;
-
-/* Describe the long-named options requested by the application.
- The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
- of `struct option' terminated by an element containing a name which is
- zero.
-
- The field `has_arg' is:
- no_argument (or 0) if the option does not take an argument,
- required_argument (or 1) if the option requires an argument,
- optional_argument (or 2) if the option takes an optional argument.
-
- If the field `flag' is not NULL, it points to a variable that is set
- to the value given in the field `val' when the option is found, but
- left unchanged if the option is not found.
-
- To have a long-named option do something other than set an `int' to
- a compiled-in constant, such as set a value from `optarg', set the
- option's `flag' field to zero and its `val' field to a nonzero
- value (the equivalent single-letter option character, if there is
- one). For long options that have a zero `flag' field, `getopt'
- returns the contents of the `val' field. */
-
-struct option
-{
-#if defined (__STDC__) && __STDC__
- const char *name;
-#else
- char *name;
-#endif
- /* has_arg can't be an enum because some compilers complain about
- type mismatches in all the code that assumes it is an int. */
- int has_arg;
- int *flag;
- int val;
-};
-
-/* Names for the values of the `has_arg' field of `struct option'. */
-
-#define no_argument 0
-#define required_argument 1
-#define optional_argument 2
-
-#if defined (__STDC__) && __STDC__
-#ifdef __GNU_LIBRARY__
-/* Many other libraries have conflicting prototypes for getopt, with
- differences in the consts, in stdlib.h. To avoid compilation
- errors, only prototype getopt for the GNU C library. */
-extern int getopt (int argc, char *const *argv, const char *shortopts);
-#else /* not __GNU_LIBRARY__ */
-#ifndef __cplusplus
-/* C++ is more pedantic, and demands a full prototype, not this.
- Hope that stdlib.h has a prototype for `getopt'. */
-extern int getopt ();
-#endif /* __cplusplus */
-#endif /* __GNU_LIBRARY__ */
-extern int getopt_long (int argc, char *const *argv, const char *shortopts,
- const struct option *longopts, int *longind);
-extern int getopt_long_only (int argc, char *const *argv,
- const char *shortopts,
- const struct option *longopts, int *longind);
-
-/* Internal only. Users should not call this directly. */
-extern int _getopt_internal (int argc, char *const *argv,
- const char *shortopts,
- const struct option *longopts, int *longind,
- int long_only);
-#else /* not __STDC__ */
-extern int getopt ();
-extern int getopt_long ();
-extern int getopt_long_only ();
-
-extern int _getopt_internal ();
-#endif /* __STDC__ */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* getopt.h */
+++ /dev/null
-/* getopt_long and getopt_long_only entry points for GNU getopt.
- Copyright (C) 1987,88,89,90,91,92,93,94,96,97 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "getopt.h"
-
-#if !defined (__STDC__) || !__STDC__
-/* This is a separate conditional since some stdc systems
- reject `defined (const)'. */
-#ifndef const
-#define const
-#endif
-#endif
-
-#include <stdio.h>
-
-/* Comment out all this code if we are using the GNU C Library, and are not
- actually compiling the library itself. This code is part of the GNU C
- Library, but also included in many other GNU distributions. Compiling
- and linking in this code is a waste when using the GNU C library
- (especially if it is a shared library). Rather than having every GNU
- program understand `configure --with-gnu-libc' and omit the object files,
- it is simpler to just do this in the source for each such file. */
-
-#define GETOPT_INTERFACE_VERSION 2
-#if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2
-#include <gnu-versions.h>
-#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
-#define ELIDE_CODE
-#endif
-#endif
-
-#ifndef ELIDE_CODE
-
-
-/* This needs to come after some library #include
- to get __GNU_LIBRARY__ defined. */
-#ifdef __GNU_LIBRARY__
-#include <stdlib.h>
-#endif
-
-#ifndef NULL
-#define NULL 0
-#endif
-
-int
-getopt_long (argc, argv, options, long_options, opt_index)
- int argc;
- char *const *argv;
- const char *options;
- const struct option *long_options;
- int *opt_index;
-{
- return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
-}
-
-/* Like getopt_long, but '-' as well as '--' can indicate a long option.
- If an option that starts with '-' (not '--') doesn't match a long option,
- but does match a short option, it is parsed as a short option
- instead. */
-
-int
-getopt_long_only (argc, argv, options, long_options, opt_index)
- int argc;
- char *const *argv;
- const char *options;
- const struct option *long_options;
- int *opt_index;
-{
- return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
-}
-
-
-#endif /* Not ELIDE_CODE. */
-
-#ifdef TEST
-
-#include <stdio.h>
-
-int
-main (argc, argv)
- int argc;
- char **argv;
-{
- int c;
- int digit_optind = 0;
-
- while (1)
- {
- int this_option_optind = optind ? optind : 1;
- int option_index = 0;
- static struct option long_options[] =
- {
- {"add", 1, 0, 0},
- {"append", 0, 0, 0},
- {"delete", 1, 0, 0},
- {"verbose", 0, 0, 0},
- {"create", 0, 0, 0},
- {"file", 1, 0, 0},
- {0, 0, 0, 0}
- };
-
- c = getopt_long (argc, argv, "abc:d:0123456789",
- long_options, &option_index);
- if (c == -1)
- break;
-
- switch (c)
- {
- case 0:
- printf ("option %s", long_options[option_index].name);
- if (optarg)
- printf (" with arg %s", optarg);
- printf ("\n");
- break;
-
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- if (digit_optind != 0 && digit_optind != this_option_optind)
- printf ("digits occur in two different argv-elements.\n");
- digit_optind = this_option_optind;
- printf ("option %c\n", c);
- break;
-
- case 'a':
- printf ("option a\n");
- break;
-
- case 'b':
- printf ("option b\n");
- break;
-
- case 'c':
- printf ("option c with value `%s'\n", optarg);
- break;
-
- case 'd':
- printf ("option d with value `%s'\n", optarg);
- break;
-
- case '?':
- break;
-
- default:
- printf ("?? getopt returned character code 0%o ??\n", c);
- }
- }
-
- if (optind < argc)
- {
- printf ("non-option ARGV-elements: ");
- while (optind < argc)
- printf ("%s ", argv[optind++]);
- printf ("\n");
- }
-
- exit (0);
-}
-
-#endif /* TEST */
+++ /dev/null
-/* Gnome-specific code to help with argp integration.
- Written by Tom Tromey <tromey@cygnus.com>. */
-
-#include <config.h>
-
-#ifndef HAVE_PROGRAM_INVOCATION_SHORT_NAME
-char *program_invocation_short_name;
-#endif
-
-#ifndef HAVE_PROGRAM_INVOCATION_NAME
-char *program_invocation_name;
-#endif
+++ /dev/null
-/* Gnome-specific code to help with argp integration.
- Written by Tom Tromey <tromey@cygnus.com>. */
-
-#ifndef __GNOME_ARGP_H__
-#define __GNOME_ARGP_H__
-
-#ifndef HAVE_STRNDUP
-/* Like strdup, but only copy N chars. */
-extern char *strndup (const char *s, size_t n);
-#endif
-
-/* Some systems, like Red Hat 4.0, define these but don't declare
- them. Hopefully it is safe to always declare them here. */
-extern char *program_invocation_short_name;
-extern char *program_invocation_name;
-
-#define __mempcpy(To,From,Len) ((char *)memcpy ((To), (From), (Len)) + (Len))
-
-#endif /* __GNOME_ARGP_H__ */
+++ /dev/null
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: gnome-support
-Description: GNOME support library
-Version: @VERSION@
-Requires: gnome-common-2.0
-Libs: -lgnomesupport-1.3
-Cflags:
\ No newline at end of file
+++ /dev/null
-#ifndef GNOMESUPPORT_FAKE_H_
-#define GNOMESUPPORT_FAKE_H_
-
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <stddef.h>
-/* ??? This is required to get `size_t' on some systems. */
-#include <sys/types.h>
-
-#include <gnomesupport.h>
-
-/* Some systems, like Red Hat 4.0, define these but don't declare
- them. Hopefully it is safe to always declare them here. */
-extern char *program_invocation_short_name;
-extern char *program_invocation_name;
-
-/* Override some of config.h.
- Gnomesupport provides the replacements for these, so you actually
- HAVE_ them. */
-
-#ifndef HAVE_STRERROR
-# define HAVE_STRERROR 1
-#endif
-
-#ifndef HAVE_PROGRAM_INVOCATION_NAME
-# define HAVE_PROGRAM_INVOCATION_NAME 1
-#endif
-
-#ifndef HAVE_PROGRAM_INVOCATION_SHORT_NAME
-# define HAVE_PROGRAM_INVOCATION_SHORT_NAME 1
-#endif
-
-#endif /* GNOMESUPPORT_FAKE_H_ */
+++ /dev/null
-# This program is used to generate gnomesupport.h
-
-# Print prologue
-BEGIN {
- print "/* gnomesupport.h */";
- print "/* This is a generated file. Please modify `gnomesupport.awk' */";
- print "";
- print "#ifndef GNOMESUPPORT_H";
- print "#define GNOMESUPPORT_H";
- print "";
- print "#include <stddef.h> /* for size_t */";
-}
-
-# For each `#define HAVE_FOO 1', set def["HAVE_FOO"] = 1
-/^\#define[ \t]/ { def[$2] = 1; }
-
-END {
- if (!def["HAVE_VASPRINTF"] || !def["HAVE_VSNPRINTF"]) {
- print "#include <stdarg.h>";
- }
-
- if (!def["HAVE_SCANDIR"] || def["NEED_DECLARATION_SCANDIR"]) {
- print "#include <sys/types.h>";
-
- if (def["HAVE_DIRENT_H"]) {
- print "#include <dirent.h>";
- print "#define NAMLEN(dirent) strlen((dirent)->d_name)";
- } else {
- print "#define dirent direct";
- print "#define NAMLEN(dirent) (dirent)->d_namlen";
-
- if (def["HAVE_SYS_NDIR_H"])
- print "#include <sys/ndir.h>";
- if (def["HAVE_SYS_DIR_H"])
- print "#include <sys/dir.h>";
- if (def["HAVE_NDIR_H"])
- print "#include <ndir.h>";
- }
- }
-
- print "";
- print "#ifdef __cplusplus";
- print "extern \"C\" {";
- print "#endif /* __cplusplus */";
-
- if (def["NEED_DECLARATION_GETHOSTNAME"]) {
- print "";
- print "/* Get name of current host. */";
- print "int gethostname(char */*name*/, int /*namelen*/);";
- }
-
- if (def["NEED_DECLARATION_SETREUID"]) {
- print "";
- print "/* Set real and effective user ID. */";
- print "int setreuid(uid_t /*ruid*/, uid_t /*euid*/);";
- }
-
- if (def["NEED_DECLARATION_SETREGID"]) {
- print "";
- print "/* Set real and effective group ID. */";
- print "int setregid(gid_t /*rgid*/, gid_t /*egid*/);";
- }
-
- if (def["NEED_DECLARATION_GETPAGESIZE"]) {
- print "";
- print "/* Get system page size. */";
- print "size_t getpagesize(void);";
- }
-
- if (!def["HAVE_MEMMOVE"]) {
- print "";
- print "/* Copies len bytes from src to dest. */";
- print "void * memmove (void */*dest*/, const void */*src*/, size_t /*len*/);";
- }
-
- if (!def["HAVE_MKSTEMP"]) {
- print "";
- print "/* Generate a unique temporary file name from TEMPLATE.";
- print " The last six characters of TEMPLATE must be "XXXXXX";";
- print " they are replaced with a string that makes the filename";
- print " unique. Returns a file descriptor open on the file for";
- print " reading and writing. */";
- print "int mkstemp (char */*template*/);";
- }
-
- if (!def["HAVE_SCANDIR"] || def["NEED_DECLARATION_SCANDIR"]) {
- print "";
- print "/* Scan the directory DIR, calling SELECTOR on each directory";
- print " entry. Entries for which SELECTOR returns nonzero are";
- print " individually malloc'd, sorted using qsort with CMP, and";
- print " collected in a malloc'd array in *NAMELIST. Returns the";
- print " number of entries selected, or -1 on error. */";
- print "int scandir (const char */*dir*/, struct dirent ***/*namelist*/,";
- print " int (*/*selector*/) (struct dirent *),";
- print " int (*/*cmp*/) (const void *, const void *));";
- print "";
- print "/* Function to compare two `struct dirent's alphabetically. */";
- print "int alphasort (const void */*a*/, const void */*b*/);";
- }
-
- if (!def["HAVE_STRERROR"]) {
- print "";
- print "/* Return a string describing the meaning of the `errno' code";
- print " in ERRNUM. */";
- print "extern char *strerror (int /*errnum*/);";
- }
-
- if (!def["HAVE_STRCASECMP"]) {
- print "";
- print "/* Compare S1 and S2, ignoring case. */";
- print "int strcasecmp (const char */*s1*/, const char */*s2*/);";
- }
-
- if (!def["HAVE_STRNDUP"]) {
- print "";
- print "/* Return a malloc'd copy of at most N bytes of STRING. The";
- print " resultant string is terminated even if no null terminator";
- print " appears before STRING[N]. */";
- print "char * strndup (const char */*s*/, size_t /*n*/);";
- }
-
- if (!def["HAVE_STRNLEN"]) {
- print "";
- print "/* Find the length of STRING, but scan at most MAXLEN";
- print " characters. If no '\\0' terminator is found in that many";
- print " characters, return MAXLEN. */";
- print "size_t strnlen (const char */*string*/, size_t /*maxlen*/);";
- }
-
- if (!def["HAVE_STRTOK_R"]) {
- print "";
- print "/* Divide S into tokens separated by characters in DELIM.";
- print " Information passed between calls are stored in SAVE_PTR. */";
- print "char * strtok_r (char */*s*/, const char */*delim*/,";
- print " char **/*save_ptr*/);";
- }
-
- if (!def["HAVE_STRTOD"]) {
- print "";
- print "/* Convert the initial portion of the string pointed to by";
- print " nptr to double representation and return the converted value.";
- print " If endptr is not NULL, a pointer to the character after the";
- print " last character used in the conversion is stored in the";
- print " location referenced by endptr. */";
- print "double strtod (const char */*nptr*/, char **/*endptr*/);";
- }
-
- if (!def["HAVE_STRTOL"]) {
- print "";
- print "/* Convert the initial portion of the string pointed to by";
- print " nptr to a long integer value according to the given base.";
- print " If endptr is not NULL, a pointer to the character after the";
- print " last character used in the conversion is stored in the";
- print " location referenced by endptr. */";
- print "long int strtol (const char */*nptr*/, char **/*endptr*/, int /*base*/);";
- }
-
- if (!def["HAVE_STRTOUL"]) {
- print "";
- print "/* Convert the initial portion of the string pointed to by";
- print " nptr to an unsigned long integer value according to the given base.";
- print " If endptr is not NULL, a pointer to the character after the";
- print " last character used in the conversion is stored in the";
- print " location referenced by endptr. */";
- print "unsigned long int strtoul (const char */*nptr*/, char **/*endptr*/,";
- print " int /*base*/);";
- }
-
- if (!def["HAVE_VASPRINTF"]) {
- print "";
- print "/* Write formatted output to a string dynamically allocated with";
- print " `malloc'. Store the address of the string in *PTR. */";
- print "int vasprintf (char **/*ptr*/, const char */*format*/,";
- print " va_list /*args*/);";
- print "int asprintf (char **/*ptr*/, const char */*format*/, ...);";
- }
-
- if (!def["HAVE_VSNPRINTF"]) {
- print "";
- print "/* Maximum chars of output to write is MAXLEN. */";
- print "int vsnprintf (char */*str*/, size_t /*maxlen*/,";
- print " char */*fmt*/, va_list /*ap*/);";
- print "int snprintf (char */*str*/, size_t /*maxlen*/,";
- print " char */*fmt*/, ...);";
- }
-
- if (!def["HAVE_REALPATH"]) {
- print "";
- print "/* Return the canonical absolute name of file NAME. A canonical name";
- print " does not contain any `.', `..' components nor any repeated path";
- print " separators ('/') or symlinks. All path components must exist.";
- print " If the canonical name is PATH_MAX chars or more, returns null with";
- print " `errno' set to ENAMETOOLONG; if the name fits in fewer than PATH_MAX";
- print " chars, returns the name in RESOLVED. If the name cannot be resolved";
- print " and RESOLVED is non-NULL, it contains the path of the first component";
- print " that cannot be resolved. If the path can be resolved, RESOLVED";
- print " holds the same value as the value returned. */";
- print "";
- print "char *realpath (char */*path*/, char /*resolved_path*/[]);";
- }
-
- print "";
- print "#ifdef __cplusplus";
- print "}";
- print "#endif /* __cplusplus */";
- print "";
- print "#endif /* GNOMESUPPORT_H */";
-}
+++ /dev/null
-/* Wrapper to implement ANSI C's memmove using BSD's bcopy. */
-/* This function is in the public domain. --Per Bothner. */
-
-#ifdef __STDC__
-#include <stddef.h>
-#else
-#define size_t unsigned long
-#endif
-
-void *
-memmove (s1, s2, n)
- void *s1;
- const void *s2;
- size_t n;
-{
- bcopy (s2, s1, n);
- return s1;
-}
+++ /dev/null
-/* Copyright (C) 1991, 1992, 1996, 1998 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/time.h>
-
-#ifdef _LIBC
-#include <stdint.h>
-#define gettimeofday __gettimeofday
-#define set_errno(e) __set_errno(e)
-typedef guint64 big_type;
-#else
-#define set_errno(e) errno = (e)
-/* FIXME: maybe check for long long. */
-typedef long big_type;
-#endif
-
-/* Generate a unique temporary file name from TEMPLATE.
- The last six characters of TEMPLATE must be "XXXXXX";
- they are replaced with a string that makes the filename unique.
- Returns a file descriptor open on the file for reading and writing. */
-int
-mkstemp (template)
- char *template;
-{
- static const char letters[]
- = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
- static big_type value;
- struct timeval tv;
- char *XXXXXX;
- size_t len;
- int count;
-
- len = strlen (template);
- if (len < 6 || strcmp (&template[len - 6], "XXXXXX"))
- {
- set_errno (EINVAL);
- return -1;
- }
-
- /* This is where the Xs start. */
- XXXXXX = &template[len - 6];
-
- /* Get some more or less random data. */
- gettimeofday (&tv, NULL);
- value += ((big_type) tv.tv_usec << 16) ^ tv.tv_sec ^ getpid ();
-
- for (count = 0; count < TMP_MAX; ++count)
- {
- big_type v = value;
- int fd;
-
- /* Fill in the random bits. */
- XXXXXX[0] = letters[v % 62];
- v /= 62;
- XXXXXX[1] = letters[v % 62];
- v /= 62;
- XXXXXX[2] = letters[v % 62];
- v /= 62;
- XXXXXX[3] = letters[v % 62];
- v /= 62;
- XXXXXX[4] = letters[v % 62];
- v /= 62;
- XXXXXX[5] = letters[v % 62];
-
- fd = open (template, O_RDWR|O_CREAT|O_EXCL, 0600);
- if (fd >= 0)
- /* The file does not exist. */
- return fd;
-
- /* This is a random value. It is only necessary that the next
- TMP_MAX values generated by adding 7777 to VALUE are different
- with (module 2^32). */
- value += 7777;
- }
-
- /* We return the null string if we can't find a unique file name. */
- template[0] = '\0';
- return -1;
-}
+++ /dev/null
-/* (C) 1998 Red Hat Software, Inc. -- Licensing details are in the COPYING
- file accompanying popt source distributions, available from
- ftp://ftp.redhat.com/pub/code/popt */
-
-#ifndef H_POPT
-#define H_POPT
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdio.h> /* for FILE * */
-
-#define POPT_OPTION_DEPTH 10
-
-#define POPT_ARG_NONE 0
-#define POPT_ARG_STRING 1
-#define POPT_ARG_INT 2
-#define POPT_ARG_LONG 3
-#define POPT_ARG_INCLUDE_TABLE 4 /* arg points to table */
-#define POPT_ARG_CALLBACK 5 /* table-wide callback... must be
- set first in table; arg points
- to callback, descrip points to
- callback data to pass */
-#define POPT_ARG_INTL_DOMAIN 6 /* set the translation domain
- for this table and any
- included tables; arg points
- to the domain string */
-#define POPT_ARG_VAL 7 /* arg should take value val */
-#define POPT_ARG_MASK 0x0000FFFF
-#define POPT_ARGFLAG_ONEDASH 0x80000000 /* allow -longoption */
-#define POPT_ARGFLAG_DOC_HIDDEN 0x40000000 /* don't show in help/usage */
-#define POPT_CBFLAG_PRE 0x80000000 /* call the callback before parse */
-#define POPT_CBFLAG_POST 0x40000000 /* call the callback after parse */
-#define POPT_CBFLAG_INC_DATA 0x20000000 /* use data from the include line,
- not the subtable */
-
-#define POPT_ERROR_NOARG -10
-#define POPT_ERROR_BADOPT -11
-#define POPT_ERROR_OPTSTOODEEP -13
-#define POPT_ERROR_BADQUOTE -15 /* only from poptParseArgString() */
-#define POPT_ERROR_ERRNO -16 /* only from poptParseArgString() */
-#define POPT_ERROR_BADNUMBER -17
-#define POPT_ERROR_OVERFLOW -18
-
-/* poptBadOption() flags */
-#define POPT_BADOPTION_NOALIAS (1 << 0) /* don't go into an alias */
-
-/* poptGetContext() flags */
-#define POPT_CONTEXT_NO_EXEC (1 << 0) /* ignore exec expansions */
-#define POPT_CONTEXT_KEEP_FIRST (1 << 1) /* pay attention to argv[0] */
-#define POPT_CONTEXT_POSIXMEHARDER (1 << 2) /* options can't follow args */
-
-struct poptOption {
- /*@observer@*/ /*@null@*/ const char * longName; /* may be NULL */
- char shortName; /* may be '\0' */
- int argInfo;
- /*@shared@*/ /*@null@*/ void * arg; /* depends on argInfo */
- int val; /* 0 means don't return, just update flag */
- /*@shared@*/ /*@null@*/ const char * descrip; /* description for autohelp -- may be NULL */
- /*@shared@*/ /*@null@*/ const char * argDescrip; /* argument description for autohelp */
-};
-
-struct poptAlias {
- /*@owned@*/ /*@null@*/ const char * longName; /* may be NULL */
- char shortName; /* may be '\0' */
- int argc;
- /*@owned@*/ const char ** argv; /* must be free()able */
-};
-
-extern struct poptOption poptHelpOptions[];
-#define POPT_AUTOHELP { NULL, '\0', POPT_ARG_INCLUDE_TABLE, poptHelpOptions, \
- 0, "Help options", NULL },
-
-typedef struct poptContext_s * poptContext;
-#ifndef __cplusplus
-typedef struct poptOption * poptOption;
-#endif
-
-enum poptCallbackReason { POPT_CALLBACK_REASON_PRE,
- POPT_CALLBACK_REASON_POST,
- POPT_CALLBACK_REASON_OPTION };
-typedef void (*poptCallbackType)(poptContext con,
- enum poptCallbackReason reason,
- const struct poptOption * opt,
- const char * arg, const void * data);
-
-/*@only@*/ poptContext poptGetContext(/*@keep@*/ const char * name,
- int argc, /*@keep@*/ const char ** argv,
- /*@keep@*/ const struct poptOption * options, int flags);
-void poptResetContext(poptContext con);
-
-/* returns 'val' element, -1 on last item, POPT_ERROR_* on error */
-int poptGetNextOpt(poptContext con);
-/* returns NULL if no argument is available */
-/*@observer@*/ /*@null@*/ const char * poptGetOptArg(poptContext con);
-/* returns NULL if no more options are available */
-/*@observer@*/ /*@null@*/ const char * poptGetArg(poptContext con);
-/*@observer@*/ /*@null@*/ const char * poptPeekArg(poptContext con);
-/*@observer@*/ /*@null@*/ const char ** poptGetArgs(poptContext con);
-/* returns the option which caused the most recent error */
-/*@observer@*/ const char * poptBadOption(poptContext con, int flags);
-void poptFreeContext( /*@only@*/ poptContext con);
-int poptStuffArgs(poptContext con, /*@keep@*/ const char ** argv);
-int poptAddAlias(poptContext con, struct poptAlias alias, int flags);
-int poptReadConfigFile(poptContext con, const char * fn);
-/* like above, but reads /etc/popt and $HOME/.popt along with environment
- vars */
-int poptReadDefaultConfig(poptContext con, int useEnv);
-/* argv should be freed -- this allows ', ", and \ quoting, but ' is treated
- the same as " and both may include \ quotes */
-int poptDupArgv(int argc, const char **argv,
- /*@out@*/ int * argcPtr, /*@out@*/ const char *** argvPtr);
-int poptParseArgvString(const char * s,
- /*@out@*/ int * argcPtr, /*@out@*/ const char *** argvPtr);
-/*@observer@*/ const char *const poptStrerror(const int error);
-void poptSetExecPath(poptContext con, const char * path, int allowAbsolute);
-void poptPrintHelp(poptContext con, FILE * f, int flags);
-void poptPrintUsage(poptContext con, FILE * f, int flags);
-void poptSetOtherOptionHelp(poptContext con, const char * text);
-/*@observer@*/ const char * poptGetInvocationName(poptContext con);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-/* (C) 1998 Red Hat Software, Inc. -- Licensing details are in the COPYING
- file accompanying popt source distributions, available from
- ftp://ftp.redhat.com/pub/code/popt */
-
-#include "system.h"
-#include "findme.h"
-#include "poptint.h"
-
-#ifndef HAVE_STRERROR
-static char * strerror(int errno) {
- extern int sys_nerr;
- extern char * sys_errlist[];
-
- if ((0 <= errno) && (errno < sys_nerr))
- return sys_errlist[errno];
- else
- return POPT_("unknown errno");
-}
-#endif
-
-void poptSetExecPath(poptContext con, const char * path, int allowAbsolute) {
- if (con->execPath) xfree(con->execPath);
- con->execPath = xstrdup(path);
- con->execAbsolute = allowAbsolute;
-}
-
-static void invokeCallbacks(poptContext con, const struct poptOption * table,
- int post) {
- const struct poptOption * opt = table;
- poptCallbackType cb;
-
- while (opt->longName || opt->shortName || opt->arg) {
- if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
- invokeCallbacks(con, opt->arg, post);
- } else if (((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK) &&
- ((!post && (opt->argInfo & POPT_CBFLAG_PRE)) ||
- ( post && (opt->argInfo & POPT_CBFLAG_POST)))) {
- cb = (poptCallbackType)opt->arg;
- cb(con, post ? POPT_CALLBACK_REASON_POST : POPT_CALLBACK_REASON_PRE,
- NULL, NULL, opt->descrip);
- }
- opt++;
- }
-}
-
-poptContext poptGetContext(const char * name, int argc, const char ** argv,
- const struct poptOption * options, int flags) {
- poptContext con = calloc(1, sizeof *con);
-
- con->os = con->optionStack;
- con->os->argc = argc;
- con->os->argv = argv;
- con->os->argb = NULL;
-
- if (!(flags & POPT_CONTEXT_KEEP_FIRST))
- con->os->next = 1; /* skip argv[0] */
-
- con->leftovers = calloc( (argc + 1), sizeof(char *) );
- con->options = options;
- con->aliases = NULL;
- con->numAliases = 0;
- con->flags = flags;
- con->execs = NULL;
- con->numExecs = 0;
- con->finalArgvAlloced = argc * 2;
- con->finalArgv = calloc( con->finalArgvAlloced, sizeof(*con->finalArgv) );
- con->execAbsolute = 1;
-
- if (getenv("POSIXLY_CORRECT") || getenv("POSIX_ME_HARDER"))
- con->flags |= POPT_CONTEXT_POSIXMEHARDER;
-
- if (name)
- con->appName = strcpy(malloc(strlen(name) + 1), name);
-
- invokeCallbacks(con, con->options, 0);
-
- return con;
-}
-
-static void cleanOSE(struct optionStackEntry *os)
-{
- if (os->nextArg) {
- xfree(os->nextArg);
- os->nextArg = NULL;
- }
- if (os->argv) {
- xfree(os->argv);
- os->argv = NULL;
- }
- if (os->argb) {
- PBM_FREE(os->argb);
- os->argb = NULL;
- }
-}
-
-void poptResetContext(poptContext con) {
- int i;
-
- while (con->os > con->optionStack) {
- cleanOSE(con->os--);
- }
- if (con->os->argb) {
- PBM_FREE(con->os->argb);
- con->os->argb = NULL;
- }
- con->os->currAlias = NULL;
- con->os->nextCharArg = NULL;
- con->os->nextArg = NULL;
- con->os->next = 1; /* skip argv[0] */
-
- con->numLeftovers = 0;
- con->nextLeftover = 0;
- con->restLeftover = 0;
- con->doExec = NULL;
-
- for (i = 0; i < con->finalArgvCount; i++) {
- if (con->finalArgv[i]) {
- xfree(con->finalArgv[i]);
- con->finalArgv[i] = NULL;
- }
- }
-
- con->finalArgvCount = 0;
-}
-
-/* Only one of longName, shortName may be set at a time */
-static int handleExec(poptContext con, char * longName, char shortName) {
- int i;
-
- i = con->numExecs - 1;
- if (longName) {
- while (i >= 0 && (!con->execs[i].longName ||
- strcmp(con->execs[i].longName, longName))) i--;
- } else {
- while (i >= 0 &&
- con->execs[i].shortName != shortName) i--;
- }
-
- if (i < 0) return 0;
-
- if (con->flags & POPT_CONTEXT_NO_EXEC)
- return 1;
-
- if (con->doExec == NULL) {
- con->doExec = con->execs + i;
- return 1;
- }
-
- /* We already have an exec to do; remember this option for next
- time 'round */
- if ((con->finalArgvCount + 1) >= (con->finalArgvAlloced)) {
- con->finalArgvAlloced += 10;
- con->finalArgv = realloc(con->finalArgv,
- sizeof(*con->finalArgv) * con->finalArgvAlloced);
- }
-
- i = con->finalArgvCount++;
- { char *s = malloc((longName ? strlen(longName) : 0) + 3);
- if (longName)
- sprintf(s, "--%s", longName);
- else
- sprintf(s, "-%c", shortName);
- con->finalArgv[i] = s;
- }
-
- return 1;
-}
-
-/* Only one of longName, shortName may be set at a time */
-static int handleAlias(poptContext con, const char * longName, char shortName,
- /*@keep@*/ const char * nextCharArg) {
- int i;
-
- if (con->os->currAlias && con->os->currAlias->longName && longName &&
- !strcmp(con->os->currAlias->longName, longName))
- return 0;
- if (con->os->currAlias && shortName &&
- shortName == con->os->currAlias->shortName)
- return 0;
-
- i = con->numAliases - 1;
- if (longName) {
- while (i >= 0 && (!con->aliases[i].longName ||
- strcmp(con->aliases[i].longName, longName))) i--;
- } else {
- while (i >= 0 &&
- con->aliases[i].shortName != shortName) i--;
- }
-
- if (i < 0) return 0;
-
- if ((con->os - con->optionStack + 1) == POPT_OPTION_DEPTH)
- return POPT_ERROR_OPTSTOODEEP;
-
- if (nextCharArg && *nextCharArg)
- con->os->nextCharArg = nextCharArg;
-
- con->os++;
- con->os->next = 0;
- con->os->stuffed = 0;
- con->os->nextArg = NULL;
- con->os->nextCharArg = NULL;
- con->os->currAlias = con->aliases + i;
- poptDupArgv(con->os->currAlias->argc, con->os->currAlias->argv,
- &con->os->argc, &con->os->argv);
- con->os->argb = NULL;
-
- return 1;
-}
-
-static void execCommand(poptContext con) {
- const char ** argv;
- int pos = 0;
- const char * script = con->doExec->script;
-
- argv = malloc(sizeof(*argv) *
- (6 + con->numLeftovers + con->finalArgvCount));
-
- if (!con->execAbsolute && strchr(script, '/')) return;
-
- if (!strchr(script, '/') && con->execPath) {
- char *s = alloca(strlen(con->execPath) + strlen(script) + 2);
- sprintf(s, "%s/%s", con->execPath, script);
- argv[pos] = s;
- } else {
- argv[pos] = script;
- }
- pos++;
-
- argv[pos] = findProgramPath(con->os->argv[0]);
- if (argv[pos]) pos++;
- argv[pos++] = ";";
-
- memcpy(argv + pos, con->finalArgv, sizeof(*argv) * con->finalArgvCount);
- pos += con->finalArgvCount;
-
- if (con->numLeftovers) {
- argv[pos++] = "--";
- memcpy(argv + pos, con->leftovers, sizeof(*argv) * con->numLeftovers);
- pos += con->numLeftovers;
- }
-
- argv[pos++] = NULL;
-
-#ifdef __hpux
- setresuid(getuid(), getuid(),-1);
-#else
-/*
- * XXX " ... on BSD systems setuid() should be preferred over setreuid()"
- * XXX sez' Timur Bakeyev <mc@bat.ru>
- * XXX from Norbert Warmuth <nwarmuth@privat.circular.de>
- */
-#if defined(HAVE_SETUID)
- setuid(getuid());
-#elif defined (HAVE_SETREUID)
- setreuid(getuid(), getuid()); /*hlauer: not portable to hpux9.01 */
-#else
- ; /* Can't drop privileges */
-#endif
-#endif
-
- execvp(argv[0], (char *const *)argv);
-}
-
-/*@observer@*/ static const struct poptOption *
-findOption(const struct poptOption * table, const char * longName,
- char shortName,
- /*@out@*/ poptCallbackType * callback, /*@out@*/ const void ** callbackData,
- int singleDash)
-{
- const struct poptOption * opt = table;
- const struct poptOption * opt2;
- const struct poptOption * cb = NULL;
-
- /* This happens when a single - is given */
- if (singleDash && !shortName && !*longName)
- shortName = '-';
-
- while (opt->longName || opt->shortName || opt->arg) {
- if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
- opt2 = findOption(opt->arg, longName, shortName, callback,
- callbackData, singleDash);
- if (opt2) {
- if (*callback && !*callbackData)
- *callbackData = opt->descrip;
- return opt2;
- }
- } else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK) {
- cb = opt;
- } else if (longName && opt->longName &&
- (!singleDash || (opt->argInfo & POPT_ARGFLAG_ONEDASH)) &&
- !strcmp(longName, opt->longName)) {
- break;
- } else if (shortName && shortName == opt->shortName) {
- break;
- }
- opt++;
- }
-
- if (!opt->longName && !opt->shortName) return NULL;
- *callbackData = NULL;
- *callback = NULL;
- if (cb) {
- *callback = (poptCallbackType)cb->arg;
- if (!(cb->argInfo & POPT_CBFLAG_INC_DATA))
- *callbackData = cb->descrip;
- }
-
- return opt;
-}
-
-static const char *findNextArg(poptContext con, unsigned argx, int delete)
-{
- struct optionStackEntry * os = con->os;
- const char * arg;
-
- do {
- int i;
- arg = NULL;
- while (os->next == os->argc && os > con->optionStack) os--;
- if (os->next == os->argc && os == con->optionStack) break;
- for (i = os->next; i < os->argc; i++) {
- if (os->argb && PBM_ISSET(i, os->argb)) continue;
- if (*os->argv[i] == '-') continue;
- if (--argx > 0) continue;
- arg = os->argv[i];
- if (delete) {
- if (os->argb == NULL) os->argb = PBM_ALLOC(os->argc);
- PBM_SET(i, os->argb);
- }
- break;
- }
- if (os > con->optionStack) os--;
- } while (arg == NULL);
- return arg;
-}
-
-static /*@only@*/ const char * expandNextArg(poptContext con, const char * s)
-{
- const char *a;
- size_t alen;
- char *t, *te;
- size_t tn = strlen(s) + 1;
- char c;
-
- te = t = malloc(tn);;
- while ((c = *s++) != '\0') {
- switch (c) {
- case '\\': /* escape */
- c = *s++;
- break;
- case '!':
- if (!(s[0] == '#' && s[1] == ':' && s[2] == '+'))
- break;
- if ((a = findNextArg(con, 1, 1)) == NULL)
- break;
- s += 3;
-
- alen = strlen(a);
- tn += alen;
- *te = '\0';
- t = realloc(t, tn);
- te = t + strlen(t);
- strncpy(te, a, alen); te += alen;
- continue;
- /*@notreached@*/ break;
- default:
- break;
- }
- *te++ = c;
- }
- *te = '\0';
- t = realloc(t, strlen(t)); /* XXX memory leak, hard to plug */
- return t;
-}
-
-/* returns 'val' element, -1 on last item, POPT_ERROR_* on error */
-int poptGetNextOpt(poptContext con)
-{
- const struct poptOption * opt = NULL;
- int done = 0;
-
- while (!done) {
- const char * origOptString = NULL;
- poptCallbackType cb = NULL;
- const void * cbData = NULL;
- const char * longArg = NULL;
-
- while (!con->os->nextCharArg && con->os->next == con->os->argc
- && con->os > con->optionStack) {
- cleanOSE(con->os--);
- }
- if (!con->os->nextCharArg && con->os->next == con->os->argc) {
- invokeCallbacks(con, con->options, 1);
- if (con->doExec) execCommand(con);
- return -1;
- }
-
- /* Process next long option */
- if (!con->os->nextCharArg) {
- char * localOptString, * optString;
-
- if (con->os->argb && PBM_ISSET(con->os->next, con->os->argb)) {
- con->os->next++;
- continue;
- }
- origOptString = con->os->argv[con->os->next++];
-
- if (con->restLeftover || *origOptString != '-') {
- con->leftovers[con->numLeftovers++] = origOptString;
- if (con->flags & POPT_CONTEXT_POSIXMEHARDER)
- con->restLeftover = 1;
- continue;
- }
-
- /* Make a copy we can hack at */
- localOptString = optString =
- strcpy(alloca(strlen(origOptString) + 1),
- origOptString);
-
- if (!optString[0])
- return POPT_ERROR_BADOPT;
-
- if (optString[1] == '-' && !optString[2]) {
- con->restLeftover = 1;
- continue;
- } else {
- char *oe;
- int singleDash;
-
- optString++;
- if (*optString == '-')
- singleDash = 0, optString++;
- else
- singleDash = 1;
-
- /* XXX aliases with arg substitution need "--alias=arg" */
- if (handleAlias(con, optString, '\0', NULL))
- continue;
- if (handleExec(con, optString, '\0'))
- continue;
-
- /* Check for "--long=arg" option. */
- for (oe = optString; *oe && *oe != '='; oe++)
- ;
- if (*oe == '=') {
- *oe++ = '\0';
- /* XXX longArg is mapped back to persistent storage. */
- longArg = origOptString + (oe - localOptString);
- }
-
- opt = findOption(con->options, optString, '\0', &cb, &cbData,
- singleDash);
- if (!opt && !singleDash)
- return POPT_ERROR_BADOPT;
- }
-
- if (!opt)
- con->os->nextCharArg = origOptString + 1;
- }
-
- /* Process next short option */
- if (con->os->nextCharArg) {
- origOptString = con->os->nextCharArg;
-
- con->os->nextCharArg = NULL;
-
- if (handleAlias(con, NULL, *origOptString,
- origOptString + 1)) {
- origOptString++;
- continue;
- }
- if (handleExec(con, NULL, *origOptString))
- continue;
-
- opt = findOption(con->options, NULL, *origOptString, &cb,
- &cbData, 0);
- if (!opt)
- return POPT_ERROR_BADOPT;
-
- origOptString++;
- if (*origOptString)
- con->os->nextCharArg = origOptString;
- }
-
- if (opt->arg && (opt->argInfo & POPT_ARG_MASK) == POPT_ARG_NONE) {
- *((int *)opt->arg) = 1;
- } else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_VAL) {
- if (opt->arg)
- *((int *) opt->arg) = opt->val;
- } else if ((opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE) {
- if (con->os->nextArg) {
- xfree(con->os->nextArg);
- con->os->nextArg = NULL;
- }
- if (longArg) {
- con->os->nextArg = expandNextArg(con, longArg);
- } else if (con->os->nextCharArg) {
- con->os->nextArg = expandNextArg(con, con->os->nextCharArg);
- con->os->nextCharArg = NULL;
- } else {
- while (con->os->next == con->os->argc &&
- con->os > con->optionStack) {
- cleanOSE(con->os--);
- }
- if (con->os->next == con->os->argc)
- return POPT_ERROR_NOARG;
-
- con->os->nextArg = expandNextArg(con, con->os->argv[con->os->next++]);
- }
-
- if (opt->arg) {
- long aLong;
- char *end;
-
- switch (opt->argInfo & POPT_ARG_MASK) {
- case POPT_ARG_STRING:
- /* XXX memory leak, hard to plug */
- *((const char **) opt->arg) = xstrdup(con->os->nextArg);
- break;
-
- case POPT_ARG_INT:
- case POPT_ARG_LONG:
- aLong = strtol(con->os->nextArg, &end, 0);
- if (!(end && *end == '\0'))
- return POPT_ERROR_BADNUMBER;
-
- if (aLong == LONG_MIN || aLong == LONG_MAX)
- return POPT_ERROR_OVERFLOW;
- if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_LONG) {
- *((long *) opt->arg) = aLong;
- } else {
- if (aLong > INT_MAX || aLong < INT_MIN)
- return POPT_ERROR_OVERFLOW;
- *((int *) opt->arg) = aLong;
- }
- break;
-
- default:
- fprintf(stdout, POPT_("option type (%d) not implemented in popt\n"),
- opt->argInfo & POPT_ARG_MASK);
- exit(EXIT_FAILURE);
- }
- }
- }
-
- if (cb)
- cb(con, POPT_CALLBACK_REASON_OPTION, opt, con->os->nextArg, cbData);
- else if (opt->val && ((opt->argInfo & POPT_ARG_MASK) != POPT_ARG_VAL))
- done = 1;
-
- if ((con->finalArgvCount + 2) >= (con->finalArgvAlloced)) {
- con->finalArgvAlloced += 10;
- con->finalArgv = realloc(con->finalArgv,
- sizeof(*con->finalArgv) * con->finalArgvAlloced);
- }
-
- { char *s = malloc((opt->longName ? strlen(opt->longName) : 0) + 3);
- if (opt->longName)
- sprintf(s, "--%s", opt->longName);
- else
- sprintf(s, "-%c", opt->shortName);
- con->finalArgv[con->finalArgvCount++] = s;
- }
-
- if (opt->arg && (opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE
- && (opt->argInfo & POPT_ARG_MASK) != POPT_ARG_VAL) {
- con->finalArgv[con->finalArgvCount++] = xstrdup(con->os->nextArg);
- }
- }
-
- return opt->val;
-}
-
-const char * poptGetOptArg(poptContext con) {
- const char * ret = con->os->nextArg;
- con->os->nextArg = NULL;
- return ret;
-}
-
-const char * poptGetArg(poptContext con) {
- if (con->numLeftovers == con->nextLeftover) return NULL;
- return con->leftovers[con->nextLeftover++];
-}
-
-const char * poptPeekArg(poptContext con) {
- if (con->numLeftovers == con->nextLeftover) return NULL;
- return con->leftovers[con->nextLeftover];
-}
-
-const char ** poptGetArgs(poptContext con) {
- if (con->numLeftovers == con->nextLeftover) return NULL;
-
- /* some apps like [like RPM ;-) ] need this NULL terminated */
- con->leftovers[con->numLeftovers] = NULL;
-
- return (con->leftovers + con->nextLeftover);
-}
-
-void poptFreeContext(poptContext con) {
- int i;
-
- poptResetContext(con);
- if (con->os->argb) free(con->os->argb);
-
- for (i = 0; i < con->numAliases; i++) {
- if (con->aliases[i].longName) xfree(con->aliases[i].longName);
- free(con->aliases[i].argv);
- }
-
- for (i = 0; i < con->numExecs; i++) {
- if (con->execs[i].longName) xfree(con->execs[i].longName);
- xfree(con->execs[i].script);
- }
- if (con->execs) xfree(con->execs);
-
- free(con->leftovers);
- free(con->finalArgv);
- if (con->appName) xfree(con->appName);
- if (con->aliases) free(con->aliases);
- if (con->otherHelp) xfree(con->otherHelp);
- if (con->execPath) xfree(con->execPath);
- free(con);
-}
-
-int poptAddAlias(poptContext con, struct poptAlias newAlias,
- /*@unused@*/ int flags)
-{
- int aliasNum = con->numAliases++;
- struct poptAlias * alias;
-
- /* SunOS won't realloc(NULL, ...) */
- if (!con->aliases)
- con->aliases = malloc(sizeof(newAlias) * con->numAliases);
- else
- con->aliases = realloc(con->aliases,
- sizeof(newAlias) * con->numAliases);
- alias = con->aliases + aliasNum;
-
- alias->longName = (newAlias.longName)
- ? strcpy(malloc(strlen(newAlias.longName) + 1), newAlias.longName)
- : NULL;
- alias->shortName = newAlias.shortName;
- alias->argc = newAlias.argc;
- alias->argv = newAlias.argv;
-
- return 0;
-}
-
-const char * poptBadOption(poptContext con, int flags) {
- struct optionStackEntry * os;
-
- if (flags & POPT_BADOPTION_NOALIAS)
- os = con->optionStack;
- else
- os = con->os;
-
- return os->argv[os->next - 1];
-}
-
-#define POPT_ERROR_NOARG -10
-#define POPT_ERROR_BADOPT -11
-#define POPT_ERROR_OPTSTOODEEP -13
-#define POPT_ERROR_BADQUOTE -15 /* only from poptParseArgString() */
-#define POPT_ERROR_ERRNO -16 /* only from poptParseArgString() */
-
-const char *const poptStrerror(const int error) {
- switch (error) {
- case POPT_ERROR_NOARG:
- return POPT_("missing argument");
- case POPT_ERROR_BADOPT:
- return POPT_("unknown option");
- case POPT_ERROR_OPTSTOODEEP:
- return POPT_("aliases nested too deeply");
- case POPT_ERROR_BADQUOTE:
- return POPT_("error in paramter quoting");
- case POPT_ERROR_BADNUMBER:
- return POPT_("invalid numeric value");
- case POPT_ERROR_OVERFLOW:
- return POPT_("number too large or too small");
- case POPT_ERROR_ERRNO:
- return strerror(errno);
- default:
- return POPT_("unknown error");
- }
-}
-
-int poptStuffArgs(poptContext con, const char ** argv) {
- int argc;
-
- if ((con->os - con->optionStack) == POPT_OPTION_DEPTH)
- return POPT_ERROR_OPTSTOODEEP;
-
- for (argc = 0; argv[argc]; argc++)
- ;
-
- con->os++;
- con->os->next = 0;
- con->os->nextArg = NULL;
- con->os->nextCharArg = NULL;
- con->os->currAlias = NULL;
- poptDupArgv(argc, argv, &con->os->argc, &con->os->argv);
- con->os->argb = NULL;
- con->os->stuffed = 1;
-
- return 0;
-}
-
-const char * poptGetInvocationName(poptContext con) {
- return con->os->argv[0];
-}
+++ /dev/null
-/* (C) 1998 Red Hat Software, Inc. -- Licensing details are in the COPYING
- file accompanying popt source distributions, available from
- ftp://ftp.redhat.com/pub/code/popt */
-
-#include "system.h"
-#include "poptint.h"
-
-static void configLine(poptContext con, char * line) {
- int nameLength = strlen(con->appName);
- char * opt;
- struct poptAlias alias;
- char * entryType;
- char * longName = NULL;
- char shortName = '\0';
-
- if (strncmp(line, con->appName, nameLength)) return;
- line += nameLength;
- if (!*line || !isspace(*line)) return;
- while (*line && isspace(*line)) line++;
- entryType = line;
-
- while (!*line || !isspace(*line)) line++;
- *line++ = '\0';
- while (*line && isspace(*line)) line++;
- if (!*line) return;
- opt = line;
-
- while (!*line || !isspace(*line)) line++;
- *line++ = '\0';
- while (*line && isspace(*line)) line++;
- if (!*line) return;
-
- if (opt[0] == '-' && opt[1] == '-')
- longName = opt + 2;
- else if (opt[0] == '-' && !opt[2])
- shortName = opt[1];
-
- if (!strcmp(entryType, "alias")) {
- if (poptParseArgvString(line, &alias.argc, &alias.argv)) return;
- alias.longName = longName, alias.shortName = shortName;
- poptAddAlias(con, alias, 0);
- } else if (!strcmp(entryType, "exec")) {
- con->execs = realloc(con->execs,
- sizeof(*con->execs) * (con->numExecs + 1));
- if (longName)
- con->execs[con->numExecs].longName = xstrdup(longName);
- else
- con->execs[con->numExecs].longName = NULL;
-
- con->execs[con->numExecs].shortName = shortName;
- con->execs[con->numExecs].script = xstrdup(line);
-
- con->numExecs++;
- }
-}
-
-int poptReadConfigFile(poptContext con, const char * fn) {
- char * file, * chptr, * end;
- char * buf, * dst;
- int fd, rc;
- int fileLength;
-
- fd = open(fn, O_RDONLY);
- if (fd < 0) {
- if (errno == ENOENT)
- return 0;
- else
- return POPT_ERROR_ERRNO;
- }
-
- fileLength = lseek(fd, 0, SEEK_END);
- (void) lseek(fd, 0, 0);
-
- file = alloca(fileLength + 1);
- if (read(fd, file, fileLength) != fileLength) {
- rc = errno;
- close(fd);
- errno = rc;
- return POPT_ERROR_ERRNO;
- }
- close(fd);
-
- dst = buf = alloca(fileLength + 1);
-
- chptr = file;
- end = (file + fileLength);
- while (chptr < end) {
- switch (*chptr) {
- case '\n':
- *dst = '\0';
- dst = buf;
- while (*dst && isspace(*dst)) dst++;
- if (*dst && *dst != '#') {
- configLine(con, dst);
- }
- chptr++;
- break;
- case '\\':
- *dst++ = *chptr++;
- if (chptr < end) {
- if (*chptr == '\n')
- dst--, chptr++;
- /* \ at the end of a line does not insert a \n */
- else
- *dst++ = *chptr++;
- }
- break;
- default:
- *dst++ = *chptr++;
- break;
- }
- }
-
- return 0;
-}
-
-int poptReadDefaultConfig(poptContext con, /*@unused@*/ int useEnv) {
- char * fn, * home;
- int rc;
-
- if (!con->appName) return 0;
-
- rc = poptReadConfigFile(con, "/etc/popt");
- if (rc) return rc;
- if (getuid() != geteuid()) return 0;
-
- if ((home = getenv("HOME"))) {
- fn = alloca(strlen(home) + 20);
- strcpy(fn, home);
- strcat(fn, "/.popt");
- rc = poptReadConfigFile(con, fn);
- if (rc) return rc;
- }
-
- return 0;
-}
-
+++ /dev/null
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
-
-/* (C) 1998 Red Hat Software, Inc. -- Licensing details are in the COPYING
- file accompanying popt source distributions, available from
- ftp://ftp.redhat.com/pub/code/popt */
-
-#include "system.h"
-#include "poptint.h"
-
-static void displayArgs(poptContext con,
- /*@unused@*/ enum poptCallbackReason foo,
- struct poptOption * key,
- /*@unused@*/ const char * arg, /*@unused@*/ void * data) {
- if (key->shortName== '?')
- poptPrintHelp(con, stdout, 0);
- else
- poptPrintUsage(con, stdout, 0);
- exit(0);
-}
-
-struct poptOption poptHelpOptions[] = {
- { NULL, '\0', POPT_ARG_CALLBACK, (void *)&displayArgs, '\0', NULL, NULL },
- { "help", '?', 0, NULL, '?', N_("Show this help message"), NULL },
- { "usage", '\0', 0, NULL, 'u', N_("Display brief usage message"), NULL },
- { NULL, '\0', 0, NULL, 0, NULL, NULL }
-} ;
-
-
-/*@observer@*/ /*@null@*/ static const char *const
-getTableTranslationDomain(const struct poptOption *table)
-{
- const struct poptOption *opt;
-
- for(opt = table;
- opt->longName || opt->shortName || opt->arg;
- opt++) {
- if(opt->argInfo == POPT_ARG_INTL_DOMAIN)
- return opt->arg;
- }
-
- return NULL;
-}
-
-/*@observer@*/ /*@null@*/ static const char *const
-getArgDescrip(const struct poptOption * opt, const char *translation_domain)
-{
- if (!(opt->argInfo & POPT_ARG_MASK)) return NULL;
-
- if (opt == (poptHelpOptions + 1) || opt == (poptHelpOptions + 2))
- if (opt->argDescrip) return POPT_(opt->argDescrip);
-
- if (opt->argDescrip) return D_(translation_domain, opt->argDescrip);
- return POPT_("ARG");
-}
-
-static void singleOptionHelp(FILE * f, int maxLeftCol,
- const struct poptOption * opt,
- const char *translation_domain) {
- int indentLength = maxLeftCol + 5;
- int lineLength = 79 - indentLength;
- const char * help = D_(translation_domain, opt->descrip);
- int helpLength;
- const char * ch;
- char format[10];
- char * left;
- const char * argDescrip = getArgDescrip(opt, translation_domain);
-
- left = malloc(maxLeftCol + 1);
- *left = '\0';
-
- if (opt->longName && opt->shortName)
- sprintf(left, "-%c, --%s", opt->shortName, opt->longName);
- else if (opt->shortName)
- sprintf(left, "-%c", opt->shortName);
- else if (opt->longName)
- sprintf(left, "--%s", opt->longName);
- if (!*left) return ;
- if (argDescrip) {
- strcat(left, "=");
- strcat(left, argDescrip);
- }
-
- if (help)
- fprintf(f," %-*s ", maxLeftCol, left);
- else {
- fprintf(f," %s\n", left);
- goto out;
- }
-
- helpLength = strlen(help);
- while (helpLength > lineLength) {
- ch = help + lineLength - 1;
- while (ch > help && !isspace(*ch)) ch--;
- if (ch == help) break; /* give up */
- while (ch > (help + 1) && isspace(*ch)) ch--;
- ch++;
-
- sprintf(format, "%%.%ds\n%%%ds", (int) (ch - help), indentLength);
- fprintf(f, format, help, " ");
- help = ch;
- while (isspace(*help) && *help) help++;
- helpLength = strlen(help);
- }
-
- if (helpLength) fprintf(f, "%s\n", help);
-
-out:
- free(left);
-}
-
-static int maxArgWidth(const struct poptOption * opt,
- const char * translation_domain) {
- int max = 0;
- int this;
- const char * s;
-
- while (opt->longName || opt->shortName || opt->arg) {
- if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
- this = maxArgWidth(opt->arg, translation_domain);
- if (this > max) max = this;
- } else if (!(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN)) {
- this = opt->shortName ? 2 : 0;
- if (opt->longName) {
- if (this) this += 2;
- this += strlen(opt->longName) + 2;
- }
-
- s = getArgDescrip(opt, translation_domain);
- if (s)
- this += strlen(s) + 1;
- if (this > max) max = this;
- }
-
- opt++;
- }
-
- return max;
-}
-
-static void singleTableHelp(FILE * f, const struct poptOption * table,
- int left,
- const char *translation_domain) {
- const struct poptOption * opt;
- const char *sub_transdom;
-
- opt = table;
- while (opt->longName || opt->shortName || opt->arg) {
- if ((opt->longName || opt->shortName) &&
- !(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN))
- singleOptionHelp(f, left, opt, translation_domain);
- opt++;
- }
-
- opt = table;
- while (opt->longName || opt->shortName || opt->arg) {
- if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
- sub_transdom = getTableTranslationDomain(opt->arg);
- if(!sub_transdom)
- sub_transdom = translation_domain;
-
- if (opt->descrip)
- fprintf(f, "\n%s\n", D_(sub_transdom, opt->descrip));
-
- singleTableHelp(f, opt->arg, left, sub_transdom);
- }
- opt++;
- }
-}
-
-static int showHelpIntro(poptContext con, FILE * f) {
- int len = 6;
- const char * fn;
-
- fprintf(f, POPT_("Usage:"));
- if (!(con->flags & POPT_CONTEXT_KEEP_FIRST)) {
- fn = con->optionStack->argv[0];
- if (strchr(fn, '/')) fn = strchr(fn, '/') + 1;
- fprintf(f, " %s", fn);
- len += strlen(fn) + 1;
- }
-
- return len;
-}
-
-void poptPrintHelp(poptContext con, FILE * f, /*@unused@*/ int flags) {
- int leftColWidth;
-
- showHelpIntro(con, f);
- if (con->otherHelp)
- fprintf(f, " %s\n", con->otherHelp);
- else
- fprintf(f, " %s\n", POPT_("[OPTION...]"));
-
- leftColWidth = maxArgWidth(con->options, NULL);
- singleTableHelp(f, con->options, leftColWidth, NULL);
-}
-
-static int singleOptionUsage(FILE * f, int cursor,
- const struct poptOption * opt,
- const char *translation_domain) {
- int len = 3;
- char shortStr[2] = { '\0', '\0' };
- const char * item = shortStr;
- const char * argDescrip = getArgDescrip(opt, translation_domain);
-
- if (opt->shortName) {
- if (!(opt->argInfo & POPT_ARG_MASK))
- return cursor; /* we did these already */
- len++;
- *shortStr = opt->shortName;
- shortStr[1] = '\0';
- } else if (opt->longName) {
- len += 1 + strlen(opt->longName);
- item = opt->longName;
- }
-
- if (len == 3) return cursor;
-
- if (argDescrip)
- len += strlen(argDescrip) + 1;
-
- if ((cursor + len) > 79) {
- fprintf(f, "\n ");
- cursor = 7;
- }
-
- fprintf(f, " [-%s%s%s%s]", opt->shortName ? "" : "-", item,
- argDescrip ? (opt->shortName ? " " : "=") : "",
- argDescrip ? argDescrip : "");
-
- return cursor + len + 1;
-}
-
-static int singleTableUsage(FILE * f, int cursor, const struct poptOption * table,
- const char *translation_domain) {
- const struct poptOption * opt;
-
- opt = table;
- while (opt->longName || opt->shortName || opt->arg) {
- if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INTL_DOMAIN)
- translation_domain = (const char *)opt->arg;
- else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE)
- cursor = singleTableUsage(f, cursor, opt->arg,
- translation_domain);
- else if ((opt->longName || opt->shortName) &&
- !(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN))
- cursor = singleOptionUsage(f, cursor, opt, translation_domain);
-
- opt++;
- }
-
- return cursor;
-}
-
-static int showShortOptions(const struct poptOption * opt, FILE * f,
- char * str) {
- char s[300]; /* this is larger then the ascii set, so
- it should do just fine */
-
- s[0] = '\0';
- if (str == NULL) {
- memset(s, 0, sizeof(s));
- str = s;
- }
-
- while (opt->longName || opt->shortName || opt->arg) {
- if (opt->shortName && !(opt->argInfo & POPT_ARG_MASK))
- str[strlen(str)] = opt->shortName;
- else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE)
- showShortOptions(opt->arg, f, str);
-
- opt++;
- }
-
- if (s != str || !*s)
- return 0;
-
- fprintf(f, " [-%s]", s);
- return strlen(s) + 4;
-}
-
-void poptPrintUsage(poptContext con, FILE * f, /*@unused@*/ int flags) {
- int cursor;
-
- cursor = showHelpIntro(con, f);
- cursor += showShortOptions(con->options, f, NULL);
- singleTableUsage(f, cursor, con->options, NULL);
-
- if (con->otherHelp) {
- cursor += strlen(con->otherHelp) + 1;
- if (cursor > 79) fprintf(f, "\n ");
- fprintf(f, " %s", con->otherHelp);
- }
-
- fprintf(f, "\n");
-}
-
-void poptSetOtherOptionHelp(poptContext con, const char * text) {
- if (con->otherHelp) xfree(con->otherHelp);
- con->otherHelp = xstrdup(text);
-}
+++ /dev/null
-/* (C) 1998 Red Hat Software, Inc. -- Licensing details are in the COPYING
- file accompanying popt source distributions, available from
- ftp://ftp.redhat.com/pub/code/popt */
-
-#ifndef H_POPTINT
-#define H_POPTINT
-
-/* Bit mask macros. */
-typedef unsigned int __pbm_bits;
-#define __PBM_NBITS (8 * sizeof (__pbm_bits))
-#define __PBM_IX(d) ((d) / __PBM_NBITS)
-#define __PBM_MASK(d) ((__pbm_bits) 1 << ((d) % __PBM_NBITS))
-typedef struct {
- __pbm_bits bits[1];
-} pbm_set;
-#define __PBM_BITS(set) ((set)->bits)
-
-#define PBM_ALLOC(d) calloc(__PBM_IX (d) + 1, sizeof(__pbm_bits))
-#define PBM_FREE(s) free(s);
-#define PBM_SET(d, s) (__PBM_BITS (s)[__PBM_IX (d)] |= __PBM_MASK (d))
-#define PBM_CLR(d, s) (__PBM_BITS (s)[__PBM_IX (d)] &= ~__PBM_MASK (d))
-#define PBM_ISSET(d, s) ((__PBM_BITS (s)[__PBM_IX (d)] & __PBM_MASK (d)) != 0)
-
-struct optionStackEntry {
- int argc;
- /*@only@*/ const char ** argv;
- /*@only@*/ pbm_set * argb;
- int next;
- /*@only@*/ const char * nextArg;
- /*@keep@*/ const char * nextCharArg;
- /*@dependent@*/ struct poptAlias * currAlias;
- int stuffed;
-};
-
-struct execEntry {
- const char * longName;
- char shortName;
- const char * script;
-};
-
-struct poptContext_s {
- struct optionStackEntry optionStack[POPT_OPTION_DEPTH];
- /*@dependent@*/ struct optionStackEntry * os;
- /*@owned@*/ const char ** leftovers;
- int numLeftovers;
- int nextLeftover;
- /*@keep@*/ const struct poptOption * options;
- int restLeftover;
- /*@only@*/ const char * appName;
- /*@only@*/ struct poptAlias * aliases;
- int numAliases;
- int flags;
- struct execEntry * execs;
- int numExecs;
- /*@only@*/ const char ** finalArgv;
- int finalArgvCount;
- int finalArgvAlloced;
- /*@dependent@*/ struct execEntry * doExec;
- /*@only@*/ const char * execPath;
- int execAbsolute;
- /*@only@*/ const char * otherHelp;
-};
-
-#define xfree(_a) free((void *)_a)
-
-#ifdef HAVE_LIBINTL_H
-#include <libintl.h>
-#endif
-
-#if defined(HAVE_GETTEXT) && !defined(__LCLINT__)
-#define _(foo) gettext(foo)
-#else
-#define _(foo) (foo)
-#endif
-
-#if defined(HAVE_DGETTEXT) && !defined(__LCLINT__)
-#define D_(dom, str) dgettext(dom, str)
-#define POPT_(foo) D_("popt", foo)
-#else
-#define POPT_(foo) (foo)
-#define D_(dom, str) (str)
-#endif
-
-#define N_(foo) (foo)
-
-#endif
+++ /dev/null
-/* (C) 1998 Red Hat Software, Inc. -- Licensing details are in the COPYING
- file accompanying popt source distributions, available from
- ftp://ftp.redhat.com/pub/code/popt */
-
-#include "system.h"
-#include "poptint.h"
-
-#define POPT_ARGV_ARRAY_GROW_DELTA 5
-
-int poptDupArgv(int argc, const char **argv,
- int * argcPtr, const char *** argvPtr)
-{
- size_t nb = (argc + 1) * sizeof(*argv);
- const char ** argv2;
- char * dst;
- int i;
-
- for (i = 0; i < argc; i++) {
- if (argv[i] == NULL)
- return POPT_ERROR_NOARG;
- nb += strlen(argv[i]) + 1;
- }
-
- dst = malloc(nb);
- argv2 = (void *) dst;
- dst += (argc + 1) * sizeof(*argv);
-
- for (i = 0; i < argc; i++) {
- argv2[i] = dst;
- dst += strlen(strcpy(dst, argv[i])) + 1;
- }
- argv2[argc] = NULL;
-
- *argvPtr = argv2;
- *argcPtr = argc;
- return 0;
-}
-
-int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr)
-{
- const char * src;
- char quote = '\0';
- int argvAlloced = POPT_ARGV_ARRAY_GROW_DELTA;
- const char ** argv = malloc(sizeof(*argv) * argvAlloced);
- int argc = 0;
- int buflen = strlen(s) + 1;
- char * buf = memset(alloca(buflen), 0, buflen);
-
- argv[argc] = buf;
-
- for (src = s; *src; src++) {
- if (quote == *src) {
- quote = '\0';
- } else if (quote) {
- if (*src == '\\') {
- src++;
- if (!*src) {
- free(argv);
- return POPT_ERROR_BADQUOTE;
- }
- 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 POPT_ERROR_BADQUOTE;
- }
- /*@fallthrough@*/
- default:
- *buf++ = *src;
- break;
- }
- }
-
- if (strlen(argv[argc])) {
- argc++, buf++;
- }
-
-#if 0
- { char * dst = malloc((argc + 1) * sizeof(*argv) + (buf - argv[0]));
- const char ** argv2 = (void *) dst;
- int i;
-
- dst += (argc + 1) * sizeof(*argv);
- memcpy(argv2, argv, argc * sizeof(*argv));
- argv2[argc] = NULL;
- memcpy(dst, argv[0], buf - argv[0]);
-
- for (i = 0; i < argc; i++)
- argv2[i] = dst + (argv[i] - argv[0]);
-
- *argvPtr = argv2;
- *argcPtr = argc;
- }
-#else
- (void) poptDupArgv(argc, argv, argcPtr, argvPtr);
-#endif
-
- free(argv);
-
- return 0;
-}
+++ /dev/null
-/* Copyright (C) 1992, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/types.h>
-
-#if HAVE_DIRENT_H
-# include <dirent.h>
-# define NAMLEN(dirent) strlen((dirent)->d_name)
-#else
-# define dirent direct
-# define NAMLEN(dirent) (dirent)->d_namlen
-# if HAVE_SYS_NDIR_H
-# include <sys/ndir.h>
-# endif
-# if HAVE_SYS_DIR_H
-# include <sys/dir.h>
-# endif
-# if HAVE_NDIR_H
-# include <ndir.h>
-# endif
-#endif
-
-#undef PARAMS
-#if defined (__GNUC__) || __STDC__
-# define PARAMS(args) args
-#else
-# define PARAMS(args) ()
-#endif
-
-#define set_errno(e) (errno = (e))
-
-int
-scandir (dir, namelist, select, cmp)
- const char *dir;
- struct dirent ***namelist;
- int (*select) PARAMS ((struct dirent *));
- int (*cmp) PARAMS ((const void *, const void *));
-{
- DIR *dp = opendir (dir);
- struct dirent **v = NULL;
- size_t vsize = 0, i;
- struct dirent *d;
- int save;
-
- if (dp == NULL)
- return -1;
-
- save = errno;
- set_errno (0);
-
- i = 0;
- while ((d = readdir (dp)) != NULL)
- if (select == NULL || (*select) (d))
- {
- size_t dsize;
-
- /* Ignore errors from select or readdir */
- set_errno (0);
-
- if (i == vsize)
- {
- struct dirent **new;
- if (vsize == 0)
- vsize = 10;
- else
- vsize *= 2;
- new = (struct dirent **) realloc (v, vsize * sizeof (*v));
- if (new == NULL)
- {
- lose:
- set_errno (ENOMEM);
- break;
- }
- v = new;
- }
-
- dsize = &d->d_name[1 + NAMLEN (d)] - (char *) d;
- v[i] = (struct dirent *) malloc (dsize);
- if (v[i] == NULL)
- goto lose;
-
- memcpy (v[i++], d, dsize);
- }
-
- if (errno != 0)
- {
- save = errno;
- (void) closedir (dp);
- while (i > 0)
- free (v[--i]);
- free (v);
- set_errno (save);
- return -1;
- }
-
- (void) closedir (dp);
- set_errno (save);
-
- /* Sort the list if we have a comparison function to sort with. */
- if (cmp != NULL)
- qsort (v, i, sizeof (*v), cmp);
- *namelist = v;
- return i;
-}
-
-int
-alphasort (const void *a, const void *b)
-{
- return strcmp ((*(const struct dirent **) a)->d_name,
- (*(const struct dirent **) b)->d_name);
-}
+++ /dev/null
-/* Copyright (C) 1991, 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <ctype.h>
-#include <string.h>
-
-#ifndef weak_alias
-# define __strcasecmp strcasecmp
-# define TOLOWER(Ch) tolower (Ch)
-#else
-# ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# define __strcasecmp __strcasecmp_l
-# define TOLOWER(Ch) __tolower_l ((Ch), loc)
-# else
-# define TOLOWER(Ch) tolower (Ch)
-# endif
-#endif
-
-#ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# define LOCALE_PARAM , loc
-# define LOCALE_PARAM_DECL __locale_t loc;
-#else
-# define LOCALE_PARAM
-# define LOCALE_PARAM_DECL
-#endif
-
-/* Compare S1 and S2, ignoring case, returning less than, equal to or
- greater than zero if S1 is lexicographically less than,
- equal to or greater than S2. */
-int
-__strcasecmp (s1, s2 LOCALE_PARAM)
- const char *s1;
- const char *s2;
- LOCALE_PARAM_DECL
-{
- const unsigned char *p1 = (const unsigned char *) s1;
- const unsigned char *p2 = (const unsigned char *) s2;
- unsigned char c1, c2;
-
- if (p1 == p2)
- return 0;
-
- do
- {
- c1 = TOLOWER (*p1++);
- c2 = TOLOWER (*p2++);
- if (c1 == '\0')
- break;
- }
- while (c1 == c2);
-
- return c1 - c2;
-}
-#ifndef __strcasecmp
-weak_alias (__strcasecmp, strcasecmp)
-#endif
+++ /dev/null
-/* Extended support for using errno values.
- Written by Fred Fish. fnf@cygnus.com
- This file is in the public domain. --Per Bothner. */
-
-#include "config.h"
-
-#ifndef PARAMS
-#if defined (__GNUC__) || __STDC__ || defined __cplusplus
-# define PARAMS(args) args
-#else
-# define PARAMS(args) ()
-#endif
-#endif
-
-
-#ifdef HAVE_SYS_ERRLIST
-/* Note that errno.h (not sure what OS) or stdio.h (BSD 4.4, at least)
- might declare sys_errlist in a way that the compiler might consider
- incompatible with our later declaration, perhaps by using const
- attributes. So we hide the declaration in errno.h (if any) using a
- macro. */
-#define sys_errlist sys_errlist__
-#endif
-
-#include <stdio.h>
-#include <errno.h>
-
-#ifdef HAVE_SYS_ERRLIST
-#undef sys_errlist
-#endif
-
-/* Routines imported from standard C runtime libraries. */
-
-#ifdef __STDC__
-#include <stddef.h>
-extern void *malloc (size_t size); /* 4.10.3.3 */
-extern void *memset (void *s, int c, size_t n); /* 4.11.6.1 */
-#else /* !__STDC__ */
-extern char *malloc (); /* Standard memory allocater */
-extern char *memset ();
-#endif /* __STDC__ */
-
-#ifndef MAX
-# define MAX(a,b) ((a) > (b) ? (a) : (b))
-#endif
-
-static void init_error_tables PARAMS ((void));
-
-/* Translation table for errno values. See intro(2) in most UNIX systems
- Programmers Reference Manuals.
-
- Note that this table is generally only accessed when it is used at runtime
- to initialize errno name and message tables that are indexed by errno
- value.
-
- Not all of these errnos will exist on all systems. This table is the only
- thing that should have to be updated as new error numbers are introduced.
- It's sort of ugly, but at least its portable. */
-
-struct error_info
-{
- int value; /* The numeric value from <errno.h> */
- const char *name; /* The equivalent symbolic value */
-#ifndef HAVE_SYS_ERRLIST
- const char *msg; /* Short message about this value */
-#endif
-};
-
-#ifndef HAVE_SYS_ERRLIST
-# define ENTRY(value, name, msg) {value, name, msg}
-#else
-# define ENTRY(value, name, msg) {value, name}
-#endif
-
-static const struct error_info error_table[] =
-{
-#if defined (EPERM)
- ENTRY(EPERM, "EPERM", "Not owner"),
-#endif
-#if defined (ENOENT)
- ENTRY(ENOENT, "ENOENT", "No such file or directory"),
-#endif
-#if defined (ESRCH)
- ENTRY(ESRCH, "ESRCH", "No such process"),
-#endif
-#if defined (EINTR)
- ENTRY(EINTR, "EINTR", "Interrupted system call"),
-#endif
-#if defined (EIO)
- ENTRY(EIO, "EIO", "I/O error"),
-#endif
-#if defined (ENXIO)
- ENTRY(ENXIO, "ENXIO", "No such device or address"),
-#endif
-#if defined (E2BIG)
- ENTRY(E2BIG, "E2BIG", "Arg list too long"),
-#endif
-#if defined (ENOEXEC)
- ENTRY(ENOEXEC, "ENOEXEC", "Exec format error"),
-#endif
-#if defined (EBADF)
- ENTRY(EBADF, "EBADF", "Bad file number"),
-#endif
-#if defined (ECHILD)
- ENTRY(ECHILD, "ECHILD", "No child processes"),
-#endif
-#if defined (EWOULDBLOCK) /* Put before EAGAIN, sometimes aliased */
- ENTRY(EWOULDBLOCK, "EWOULDBLOCK", "Operation would block"),
-#endif
-#if defined (EAGAIN)
- ENTRY(EAGAIN, "EAGAIN", "No more processes"),
-#endif
-#if defined (ENOMEM)
- ENTRY(ENOMEM, "ENOMEM", "Not enough space"),
-#endif
-#if defined (EACCES)
- ENTRY(EACCES, "EACCES", "Permission denied"),
-#endif
-#if defined (EFAULT)
- ENTRY(EFAULT, "EFAULT", "Bad address"),
-#endif
-#if defined (ENOTBLK)
- ENTRY(ENOTBLK, "ENOTBLK", "Block device required"),
-#endif
-#if defined (EBUSY)
- ENTRY(EBUSY, "EBUSY", "Device busy"),
-#endif
-#if defined (EEXIST)
- ENTRY(EEXIST, "EEXIST", "File exists"),
-#endif
-#if defined (EXDEV)
- ENTRY(EXDEV, "EXDEV", "Cross-device link"),
-#endif
-#if defined (ENODEV)
- ENTRY(ENODEV, "ENODEV", "No such device"),
-#endif
-#if defined (ENOTDIR)
- ENTRY(ENOTDIR, "ENOTDIR", "Not a directory"),
-#endif
-#if defined (EISDIR)
- ENTRY(EISDIR, "EISDIR", "Is a directory"),
-#endif
-#if defined (EINVAL)
- ENTRY(EINVAL, "EINVAL", "Invalid argument"),
-#endif
-#if defined (ENFILE)
- ENTRY(ENFILE, "ENFILE", "File table overflow"),
-#endif
-#if defined (EMFILE)
- ENTRY(EMFILE, "EMFILE", "Too many open files"),
-#endif
-#if defined (ENOTTY)
- ENTRY(ENOTTY, "ENOTTY", "Not a typewriter"),
-#endif
-#if defined (ETXTBSY)
- ENTRY(ETXTBSY, "ETXTBSY", "Text file busy"),
-#endif
-#if defined (EFBIG)
- ENTRY(EFBIG, "EFBIG", "File too large"),
-#endif
-#if defined (ENOSPC)
- ENTRY(ENOSPC, "ENOSPC", "No space left on device"),
-#endif
-#if defined (ESPIPE)
- ENTRY(ESPIPE, "ESPIPE", "Illegal seek"),
-#endif
-#if defined (EROFS)
- ENTRY(EROFS, "EROFS", "Read-only file system"),
-#endif
-#if defined (EMLINK)
- ENTRY(EMLINK, "EMLINK", "Too many links"),
-#endif
-#if defined (EPIPE)
- ENTRY(EPIPE, "EPIPE", "Broken pipe"),
-#endif
-#if defined (EDOM)
- ENTRY(EDOM, "EDOM", "Math argument out of domain of func"),
-#endif
-#if defined (ERANGE)
- ENTRY(ERANGE, "ERANGE", "Math result not representable"),
-#endif
-#if defined (ENOMSG)
- ENTRY(ENOMSG, "ENOMSG", "No message of desired type"),
-#endif
-#if defined (EIDRM)
- ENTRY(EIDRM, "EIDRM", "Identifier removed"),
-#endif
-#if defined (ECHRNG)
- ENTRY(ECHRNG, "ECHRNG", "Channel number out of range"),
-#endif
-#if defined (EL2NSYNC)
- ENTRY(EL2NSYNC, "EL2NSYNC", "Level 2 not synchronized"),
-#endif
-#if defined (EL3HLT)
- ENTRY(EL3HLT, "EL3HLT", "Level 3 halted"),
-#endif
-#if defined (EL3RST)
- ENTRY(EL3RST, "EL3RST", "Level 3 reset"),
-#endif
-#if defined (ELNRNG)
- ENTRY(ELNRNG, "ELNRNG", "Link number out of range"),
-#endif
-#if defined (EUNATCH)
- ENTRY(EUNATCH, "EUNATCH", "Protocol driver not attached"),
-#endif
-#if defined (ENOCSI)
- ENTRY(ENOCSI, "ENOCSI", "No CSI structure available"),
-#endif
-#if defined (EL2HLT)
- ENTRY(EL2HLT, "EL2HLT", "Level 2 halted"),
-#endif
-#if defined (EDEADLK)
- ENTRY(EDEADLK, "EDEADLK", "Deadlock condition"),
-#endif
-#if defined (ENOLCK)
- ENTRY(ENOLCK, "ENOLCK", "No record locks available"),
-#endif
-#if defined (EBADE)
- ENTRY(EBADE, "EBADE", "Invalid exchange"),
-#endif
-#if defined (EBADR)
- ENTRY(EBADR, "EBADR", "Invalid request descriptor"),
-#endif
-#if defined (EXFULL)
- ENTRY(EXFULL, "EXFULL", "Exchange full"),
-#endif
-#if defined (ENOANO)
- ENTRY(ENOANO, "ENOANO", "No anode"),
-#endif
-#if defined (EBADRQC)
- ENTRY(EBADRQC, "EBADRQC", "Invalid request code"),
-#endif
-#if defined (EBADSLT)
- ENTRY(EBADSLT, "EBADSLT", "Invalid slot"),
-#endif
-#if defined (EDEADLOCK)
- ENTRY(EDEADLOCK, "EDEADLOCK", "File locking deadlock error"),
-#endif
-#if defined (EBFONT)
- ENTRY(EBFONT, "EBFONT", "Bad font file format"),
-#endif
-#if defined (ENOSTR)
- ENTRY(ENOSTR, "ENOSTR", "Device not a stream"),
-#endif
-#if defined (ENODATA)
- ENTRY(ENODATA, "ENODATA", "No data available"),
-#endif
-#if defined (ETIME)
- ENTRY(ETIME, "ETIME", "Timer expired"),
-#endif
-#if defined (ENOSR)
- ENTRY(ENOSR, "ENOSR", "Out of streams resources"),
-#endif
-#if defined (ENONET)
- ENTRY(ENONET, "ENONET", "Machine is not on the network"),
-#endif
-#if defined (ENOPKG)
- ENTRY(ENOPKG, "ENOPKG", "Package not installed"),
-#endif
-#if defined (EREMOTE)
- ENTRY(EREMOTE, "EREMOTE", "Object is remote"),
-#endif
-#if defined (ENOLINK)
- ENTRY(ENOLINK, "ENOLINK", "Link has been severed"),
-#endif
-#if defined (EADV)
- ENTRY(EADV, "EADV", "Advertise error"),
-#endif
-#if defined (ESRMNT)
- ENTRY(ESRMNT, "ESRMNT", "Srmount error"),
-#endif
-#if defined (ECOMM)
- ENTRY(ECOMM, "ECOMM", "Communication error on send"),
-#endif
-#if defined (EPROTO)
- ENTRY(EPROTO, "EPROTO", "Protocol error"),
-#endif
-#if defined (EMULTIHOP)
- ENTRY(EMULTIHOP, "EMULTIHOP", "Multihop attempted"),
-#endif
-#if defined (EDOTDOT)
- ENTRY(EDOTDOT, "EDOTDOT", "RFS specific error"),
-#endif
-#if defined (EBADMSG)
- ENTRY(EBADMSG, "EBADMSG", "Not a data message"),
-#endif
-#if defined (ENAMETOOLONG)
- ENTRY(ENAMETOOLONG, "ENAMETOOLONG", "File name too long"),
-#endif
-#if defined (EOVERFLOW)
- ENTRY(EOVERFLOW, "EOVERFLOW", "Value too large for defined data type"),
-#endif
-#if defined (ENOTUNIQ)
- ENTRY(ENOTUNIQ, "ENOTUNIQ", "Name not unique on network"),
-#endif
-#if defined (EBADFD)
- ENTRY(EBADFD, "EBADFD", "File descriptor in bad state"),
-#endif
-#if defined (EREMCHG)
- ENTRY(EREMCHG, "EREMCHG", "Remote address changed"),
-#endif
-#if defined (ELIBACC)
- ENTRY(ELIBACC, "ELIBACC", "Can not access a needed shared library"),
-#endif
-#if defined (ELIBBAD)
- ENTRY(ELIBBAD, "ELIBBAD", "Accessing a corrupted shared library"),
-#endif
-#if defined (ELIBSCN)
- ENTRY(ELIBSCN, "ELIBSCN", ".lib section in a.out corrupted"),
-#endif
-#if defined (ELIBMAX)
- ENTRY(ELIBMAX, "ELIBMAX", "Attempting to link in too many shared libraries"),
-#endif
-#if defined (ELIBEXEC)
- ENTRY(ELIBEXEC, "ELIBEXEC", "Cannot exec a shared library directly"),
-#endif
-#if defined (EILSEQ)
- ENTRY(EILSEQ, "EILSEQ", "Illegal byte sequence"),
-#endif
-#if defined (ENOSYS)
- ENTRY(ENOSYS, "ENOSYS", "Operation not applicable"),
-#endif
-#if defined (ELOOP)
- ENTRY(ELOOP, "ELOOP", "Too many symbolic links encountered"),
-#endif
-#if defined (ERESTART)
- ENTRY(ERESTART, "ERESTART", "Interrupted system call should be restarted"),
-#endif
-#if defined (ESTRPIPE)
- ENTRY(ESTRPIPE, "ESTRPIPE", "Streams pipe error"),
-#endif
-#if defined (ENOTEMPTY)
- ENTRY(ENOTEMPTY, "ENOTEMPTY", "Directory not empty"),
-#endif
-#if defined (EUSERS)
- ENTRY(EUSERS, "EUSERS", "Too many users"),
-#endif
-#if defined (ENOTSOCK)
- ENTRY(ENOTSOCK, "ENOTSOCK", "Socket operation on non-socket"),
-#endif
-#if defined (EDESTADDRREQ)
- ENTRY(EDESTADDRREQ, "EDESTADDRREQ", "Destination address required"),
-#endif
-#if defined (EMSGSIZE)
- ENTRY(EMSGSIZE, "EMSGSIZE", "Message too long"),
-#endif
-#if defined (EPROTOTYPE)
- ENTRY(EPROTOTYPE, "EPROTOTYPE", "Protocol wrong type for socket"),
-#endif
-#if defined (ENOPROTOOPT)
- ENTRY(ENOPROTOOPT, "ENOPROTOOPT", "Protocol not available"),
-#endif
-#if defined (EPROTONOSUPPORT)
- ENTRY(EPROTONOSUPPORT, "EPROTONOSUPPORT", "Protocol not supported"),
-#endif
-#if defined (ESOCKTNOSUPPORT)
- ENTRY(ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT", "Socket type not supported"),
-#endif
-#if defined (EOPNOTSUPP)
- ENTRY(EOPNOTSUPP, "EOPNOTSUPP", "Operation not supported on transport endpoint"),
-#endif
-#if defined (EPFNOSUPPORT)
- ENTRY(EPFNOSUPPORT, "EPFNOSUPPORT", "Protocol family not supported"),
-#endif
-#if defined (EAFNOSUPPORT)
- ENTRY(EAFNOSUPPORT, "EAFNOSUPPORT", "Address family not supported by protocol"),
-#endif
-#if defined (EADDRINUSE)
- ENTRY(EADDRINUSE, "EADDRINUSE", "Address already in use"),
-#endif
-#if defined (EADDRNOTAVAIL)
- ENTRY(EADDRNOTAVAIL, "EADDRNOTAVAIL","Cannot assign requested address"),
-#endif
-#if defined (ENETDOWN)
- ENTRY(ENETDOWN, "ENETDOWN", "Network is down"),
-#endif
-#if defined (ENETUNREACH)
- ENTRY(ENETUNREACH, "ENETUNREACH", "Network is unreachable"),
-#endif
-#if defined (ENETRESET)
- ENTRY(ENETRESET, "ENETRESET", "Network dropped connection because of reset"),
-#endif
-#if defined (ECONNABORTED)
- ENTRY(ECONNABORTED, "ECONNABORTED", "Software caused connection abort"),
-#endif
-#if defined (ECONNRESET)
- ENTRY(ECONNRESET, "ECONNRESET", "Connection reset by peer"),
-#endif
-#if defined (ENOBUFS)
- ENTRY(ENOBUFS, "ENOBUFS", "No buffer space available"),
-#endif
-#if defined (EISCONN)
- ENTRY(EISCONN, "EISCONN", "Transport endpoint is already connected"),
-#endif
-#if defined (ENOTCONN)
- ENTRY(ENOTCONN, "ENOTCONN", "Transport endpoint is not connected"),
-#endif
-#if defined (ESHUTDOWN)
- ENTRY(ESHUTDOWN, "ESHUTDOWN", "Cannot send after transport endpoint shutdown"),
-#endif
-#if defined (ETOOMANYREFS)
- ENTRY(ETOOMANYREFS, "ETOOMANYREFS", "Too many references: cannot splice"),
-#endif
-#if defined (ETIMEDOUT)
- ENTRY(ETIMEDOUT, "ETIMEDOUT", "Connection timed out"),
-#endif
-#if defined (ECONNREFUSED)
- ENTRY(ECONNREFUSED, "ECONNREFUSED", "Connection refused"),
-#endif
-#if defined (EHOSTDOWN)
- ENTRY(EHOSTDOWN, "EHOSTDOWN", "Host is down"),
-#endif
-#if defined (EHOSTUNREACH)
- ENTRY(EHOSTUNREACH, "EHOSTUNREACH", "No route to host"),
-#endif
-#if defined (EALREADY)
- ENTRY(EALREADY, "EALREADY", "Operation already in progress"),
-#endif
-#if defined (EINPROGRESS)
- ENTRY(EINPROGRESS, "EINPROGRESS", "Operation now in progress"),
-#endif
-#if defined (ESTALE)
- ENTRY(ESTALE, "ESTALE", "Stale NFS file handle"),
-#endif
-#if defined (EUCLEAN)
- ENTRY(EUCLEAN, "EUCLEAN", "Structure needs cleaning"),
-#endif
-#if defined (ENOTNAM)
- ENTRY(ENOTNAM, "ENOTNAM", "Not a XENIX named type file"),
-#endif
-#if defined (ENAVAIL)
- ENTRY(ENAVAIL, "ENAVAIL", "No XENIX semaphores available"),
-#endif
-#if defined (EISNAM)
- ENTRY(EISNAM, "EISNAM", "Is a named type file"),
-#endif
-#if defined (EREMOTEIO)
- ENTRY(EREMOTEIO, "EREMOTEIO", "Remote I/O error"),
-#endif
- ENTRY(0, NULL, NULL)
-};
-
-#ifdef EVMSERR
-/* This is not in the table, because the numeric value of EVMSERR (32767)
- lies outside the range of sys_errlist[]. */
-static struct { int value; const char *name, *msg; }
- evmserr = { EVMSERR, "EVMSERR", "VMS-specific error" };
-#endif
-
-/* Translation table allocated and initialized at runtime. Indexed by the
- errno value to find the equivalent symbolic value. */
-
-static const char **error_names;
-static int num_error_names = 0;
-
-/* Translation table allocated and initialized at runtime, if it does not
- already exist in the host environment. Indexed by the errno value to find
- the descriptive string.
-
- We don't export it for use in other modules because even though it has the
- same name, it differs from other implementations in that it is dynamically
- initialized rather than statically initialized. */
-
-#ifndef HAVE_SYS_ERRLIST
-
-static int sys_nerr;
-static const char **sys_errlist;
-
-#else
-
-extern int sys_nerr;
-extern char *sys_errlist[];
-
-#endif
-
-
-/*
-
-NAME
-
- init_error_tables -- initialize the name and message tables
-
-SYNOPSIS
-
- static void init_error_tables ();
-
-DESCRIPTION
-
- Using the error_table, which is initialized at compile time, generate
- the error_names and the sys_errlist (if needed) tables, which are
- indexed at runtime by a specific errno value.
-
-BUGS
-
- The initialization of the tables may fail under low memory conditions,
- in which case we don't do anything particularly useful, but we don't
- bomb either. Who knows, it might succeed at a later point if we free
- some memory in the meantime. In any case, the other routines know
- how to deal with lack of a table after trying to initialize it. This
- may or may not be considered to be a bug, that we don't specifically
- warn about this particular failure mode.
-
-*/
-
-static void
-init_error_tables ()
-{
- const struct error_info *eip;
- int nbytes;
-
- /* If we haven't already scanned the error_table once to find the maximum
- errno value, then go find it now. */
-
- if (num_error_names == 0)
- {
- for (eip = error_table; eip -> name != NULL; eip++)
- {
- if (eip -> value >= num_error_names)
- {
- num_error_names = eip -> value + 1;
- }
- }
- }
-
- /* Now attempt to allocate the error_names table, zero it out, and then
- initialize it from the statically initialized error_table. */
-
- if (error_names == NULL)
- {
- nbytes = num_error_names * sizeof (char *);
- if ((error_names = (const char **) malloc (nbytes)) != NULL)
- {
- memset (error_names, 0, nbytes);
- for (eip = error_table; eip -> name != NULL; eip++)
- {
- error_names[eip -> value] = eip -> name;
- }
- }
- }
-
-#ifndef HAVE_SYS_ERRLIST
-
- /* Now attempt to allocate the sys_errlist table, zero it out, and then
- initialize it from the statically initialized error_table. */
-
- if (sys_errlist == NULL)
- {
- nbytes = num_error_names * sizeof (char *);
- if ((sys_errlist = (const char **) malloc (nbytes)) != NULL)
- {
- memset (sys_errlist, 0, nbytes);
- sys_nerr = num_error_names;
- for (eip = error_table; eip -> name != NULL; eip++)
- {
- sys_errlist[eip -> value] = eip -> msg;
- }
- }
- }
-
-#endif
-
-}
-
-/*
-
-NAME
-
- errno_max -- return the max errno value
-
-SYNOPSIS
-
- int errno_max ();
-
-DESCRIPTION
-
- Returns the maximum errno value for which a corresponding symbolic
- name or message is available. Note that in the case where
- we use the sys_errlist supplied by the system, it is possible for
- there to be more symbolic names than messages, or vice versa.
- In fact, the manual page for perror(3C) explicitly warns that one
- should check the size of the table (sys_nerr) before indexing it,
- since new error codes may be added to the system before they are
- added to the table. Thus sys_nerr might be smaller than value
- implied by the largest errno value defined in <errno.h>.
-
- We return the maximum value that can be used to obtain a meaningful
- symbolic name or message.
-
-*/
-
-int
-errno_max ()
-{
- int maxsize;
-
- if (error_names == NULL)
- {
- init_error_tables ();
- }
- maxsize = MAX (sys_nerr, num_error_names);
- return (maxsize - 1);
-}
-
-#ifndef HAVE_STRERROR
-
-/*
-
-NAME
-
- strerror -- map an error number to an error message string
-
-SYNOPSIS
-
- char *strerror (int errnoval)
-
-DESCRIPTION
-
- Maps an errno number to an error message string, the contents of
- which are implementation defined. On systems which have the external
- variables sys_nerr and sys_errlist, these strings will be the same
- as the ones used by perror().
-
- If the supplied error number is within the valid range of indices
- for the sys_errlist, but no message is available for the particular
- error number, then returns the string "Error NUM", where NUM is the
- error number.
-
- If the supplied error number is not a valid index into sys_errlist,
- returns NULL.
-
- The returned string is only guaranteed to be valid only until the
- next call to strerror.
-
-*/
-
-char *
-strerror (errnoval)
- int errnoval;
-{
- char *msg;
- static char buf[32];
-
-#ifndef HAVE_SYS_ERRLIST
-
- if (error_names == NULL)
- {
- init_error_tables ();
- }
-
-#endif
-
- if ((errnoval < 0) || (errnoval >= sys_nerr))
- {
-#ifdef EVMSERR
- if (errnoval == evmserr.value)
- msg = evmserr.msg;
- else
-#endif
- /* Out of range, just return NULL */
- msg = NULL;
- }
- else if ((sys_errlist == NULL) || (sys_errlist[errnoval] == NULL))
- {
- /* In range, but no sys_errlist or no entry at this index. */
- sprintf (buf, "Error %d", errnoval);
- msg = buf;
- }
- else
- {
- /* In range, and a valid message. Just return the message. */
- msg = (char *) sys_errlist[errnoval];
- }
-
- return (msg);
-}
-
-#endif /* ! HAVE_STRERROR */
-
-
-/*
-
-NAME
-
- strerrno -- map an error number to a symbolic name string
-
-SYNOPSIS
-
- const char *strerrno (int errnoval)
-
-DESCRIPTION
-
- Given an error number returned from a system call (typically
- returned in errno), returns a pointer to a string containing the
- symbolic name of that error number, as found in <errno.h>.
-
- If the supplied error number is within the valid range of indices
- for symbolic names, but no name is available for the particular
- error number, then returns the string "Error NUM", where NUM is
- the error number.
-
- If the supplied error number is not within the range of valid
- indices, then returns NULL.
-
-BUGS
-
- The contents of the location pointed to are only guaranteed to be
- valid until the next call to strerrno.
-
-*/
-
-const char *
-strerrno (errnoval)
- int errnoval;
-{
- const char *name;
- static char buf[32];
-
- if (error_names == NULL)
- {
- init_error_tables ();
- }
-
- if ((errnoval < 0) || (errnoval >= num_error_names))
- {
-#ifdef EVMSERR
- if (errnoval == evmserr.value)
- name = evmserr.name;
- else
-#endif
- /* Out of range, just return NULL */
- name = NULL;
- }
- else if ((error_names == NULL) || (error_names[errnoval] == NULL))
- {
- /* In range, but no error_names or no entry at this index. */
- sprintf (buf, "Error %d", errnoval);
- name = (const char *) buf;
- }
- else
- {
- /* In range, and a valid name. Just return the name. */
- name = error_names[errnoval];
- }
-
- return (name);
-}
-
-/*
-
-NAME
-
- strtoerrno -- map a symbolic errno name to a numeric value
-
-SYNOPSIS
-
- int strtoerrno (char *name)
-
-DESCRIPTION
-
- Given the symbolic name of a error number, map it to an errno value.
- If no translation is found, returns 0.
-
-*/
-
-int
-strtoerrno (name)
- const char *name;
-{
- int errnoval = 0;
-
- if (name != NULL)
- {
- if (error_names == NULL)
- {
- init_error_tables ();
- }
- for (errnoval = 0; errnoval < num_error_names; errnoval++)
- {
- if ((error_names[errnoval] != NULL) &&
- (strcmp (name, error_names[errnoval]) == 0))
- {
- break;
- }
- }
- if (errnoval == num_error_names)
- {
-#ifdef EVMSERR
- if (strcmp (name, evmserr.name) == 0)
- errnoval = evmserr.value;
- else
-#endif
- errnoval = 0;
- }
- }
- return (errnoval);
-}
-
-
-/* A simple little main that does nothing but print all the errno translations
- if MAIN is defined and this file is compiled and linked. */
-
-#ifdef MAIN
-
-#include <stdio.h>
-
-int
-main ()
-{
- int errn;
- int errnmax;
- const char *name;
- char *msg;
- char *strerror ();
-
- errnmax = errno_max ();
- printf ("%d entries in names table.\n", num_error_names);
- printf ("%d entries in messages table.\n", sys_nerr);
- printf ("%d is max useful index.\n", errnmax);
-
- /* Keep printing values until we get to the end of *both* tables, not
- *either* table. Note that knowing the maximum useful index does *not*
- relieve us of the responsibility of testing the return pointer for
- NULL. */
-
- for (errn = 0; errn <= errnmax; errn++)
- {
- name = strerrno (errn);
- name = (name == NULL) ? "<NULL>" : name;
- msg = strerror (errn);
- msg = (msg == NULL) ? "<NULL>" : msg;
- printf ("%-4d%-18s%s\n", errn, name, msg);
- }
-
- return 0;
-}
-
-#endif
+++ /dev/null
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdio.h>
-#include <sys/types.h>
-
-#if defined _LIBC || defined STDC_HEADERS
-# include <stdlib.h>
-# include <string.h>
-#else
-char *malloc ();
-#endif
-
-#ifndef weak_alias
-# define __strndup strndup
-#endif
-
-char *
-__strndup (s, n)
- const char *s;
- size_t n;
-{
- size_t len = strnlen (s, n);
- char *new = malloc (len + 1);
-
- if (new == NULL)
- return NULL;
-
- new[len] = '\0';
- return memcpy (new, s, len);
-}
-#ifdef weak_alias
-weak_alias (__strndup, strndup)
-#endif
+++ /dev/null
-/* Find the length of STRING, but scan at most MAXLEN characters.
- Copyright (C) 1996, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <string.h>
-
-/* Find the length of STRING, but scan at most MAXLEN characters.
- If no '\0' terminator is found in that many characters, return MAXLEN. */
-
-size_t
-strnlen (const char *string, size_t maxlen)
-{
- const char *end = memchr (string, '\0', maxlen);
- return end ? end - string : maxlen;
-}
+++ /dev/null
-/* Implementation of strtod for systems with atof.
- Copyright (C) 1991, 1995 Free Software Foundation, Inc.
-
-This file is part of the libiberty library. 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, 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-As a special exception, if you link this library with files
-compiled with a GNU compiler to produce an executable, this does not cause
-the resulting executable to be covered by the GNU General Public License.
-This exception does not however invalidate any other reasons why
-the executable file might be covered by the GNU General Public License. */
-
-#include <ctype.h>
-
-extern double atof ();
-
-/* Disclaimer: this is currently just used by CHILL in GDB and therefore
- has not been tested well. It may have been tested for nothing except
- that it compiles. */
-
-double
-strtod (str, ptr)
- char *str;
- char **ptr;
-{
- char *p;
-
- if (ptr == (char **)0)
- return atof (str);
-
- p = str;
-
- while (isspace (*p))
- ++p;
-
- if (*p == '+' || *p == '-')
- ++p;
-
- /* INF or INFINITY. */
- if ((p[0] == 'i' || p[0] == 'I')
- && (p[1] == 'n' || p[1] == 'N')
- && (p[2] == 'f' || p[2] == 'F'))
- {
- if ((p[3] == 'i' || p[3] == 'I')
- && (p[4] == 'n' || p[4] == 'N')
- && (p[5] == 'i' || p[5] == 'I')
- && (p[6] == 't' || p[6] == 'T')
- && (p[7] == 'y' || p[7] == 'Y'))
- {
- *ptr = p + 7;
- return atof (str);
- }
- else
- {
- *ptr = p + 3;
- return atof (str);
- }
- }
-
- /* NAN or NAN(foo). */
- if ((p[0] == 'n' || p[0] == 'N')
- && (p[1] == 'a' || p[1] == 'A')
- && (p[2] == 'n' || p[2] == 'N'))
- {
- p += 3;
- if (*p == '(')
- {
- ++p;
- while (*p != '\0' && *p != ')')
- ++p;
- if (*p == ')')
- ++p;
- }
- *ptr = p;
- return atof (str);
- }
-
- /* digits, with 0 or 1 periods in it. */
- if (isdigit (*p) || *p == '.')
- {
- int got_dot = 0;
- while (isdigit (*p) || (!got_dot && *p == '.'))
- {
- if (*p == '.')
- got_dot = 1;
- ++p;
- }
-
- /* Exponent. */
- if (*p == 'e' || *p == 'E')
- {
- int i;
- i = 1;
- if (p[i] == '+' || p[i] == '-')
- ++i;
- if (isdigit (p[i]))
- {
- while (isdigit (p[i]))
- ++i;
- *ptr = p + i;
- return atof (str);
- }
- }
- *ptr = p;
- return atof (str);
- }
- /* Didn't find any digits. Doesn't look like a number. */
- *ptr = str;
- return 0.0;
-}
+++ /dev/null
-/* Reentrant string tokenizer. Generic version.
- Copyright (C) 1991, 1996, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <string.h>
-
-#undef strtok_r
-
-/* Parse S into tokens separated by characters in DELIM.
- If S is NULL, the saved pointer in SAVE_PTR is used as
- the next starting point. For example:
- char s[] = "-abc-=-def";
- char *sp;
- x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
- x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
- x = strtok_r(NULL, "=", &sp); // x = NULL
- // s = "abc\0-def\0"
-*/
-char *
-strtok_r (s, delim, save_ptr)
- char *s;
- const char *delim;
- char **save_ptr;
-{
- char *token;
-
- if (s == NULL)
- s = *save_ptr;
-
- /* Scan leading delimiters. */
- s += strspn (s, delim);
- if (*s == '\0')
- return NULL;
-
- /* Find the end of the token. */
- token = s;
- s = strpbrk (token, delim);
- if (s == NULL)
- /* This token finishes the string. */
- *save_ptr = strchr (token, '\0');
- else
- {
- /* Terminate the token and make *SAVE_PTR point past it. */
- *s = '\0';
- *save_ptr = s + 1;
- }
- return token;
-}
+++ /dev/null
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <limits.h>
-#include <ctype.h>
-#include <errno.h>
-#if 0
-#include <stdlib.h>
-#endif
-
-/* FIXME: It'd be nice to configure around these, but the include files are too
- painful. These macros should at least be more portable than hardwired hex
- constants. */
-
-#ifndef ULONG_MAX
-#define ULONG_MAX ((unsigned long)(~0L)) /* 0xFFFFFFFF */
-#endif
-
-#ifndef LONG_MAX
-#define LONG_MAX ((long)(ULONG_MAX >> 1)) /* 0x7FFFFFFF */
-#endif
-
-#ifndef LONG_MIN
-#define LONG_MIN ((long)(~LONG_MAX)) /* 0x80000000 */
-#endif
-
-/*
- * Convert a string to a long integer.
- *
- * Ignores `locale' stuff. Assumes that the upper and lower case
- * alphabets and digits are each contiguous.
- */
-long
-strtol(nptr, endptr, base)
- const char *nptr;
- char **endptr;
- register int base;
-{
- register const char *s = nptr;
- register unsigned long acc;
- register int c;
- register unsigned long cutoff;
- register int neg = 0, any, cutlim;
-
- /*
- * Skip white space and pick up leading +/- sign if any.
- * If base is 0, allow 0x for hex and 0 for octal, else
- * assume decimal; if base is already 16, allow 0x.
- */
- do {
- c = *s++;
- } while (isspace(c));
- if (c == '-') {
- neg = 1;
- c = *s++;
- } else if (c == '+')
- c = *s++;
- if ((base == 0 || base == 16) &&
- c == '0' && (*s == 'x' || *s == 'X')) {
- c = s[1];
- s += 2;
- base = 16;
- }
- if (base == 0)
- base = c == '0' ? 8 : 10;
-
- /*
- * Compute the cutoff value between legal numbers and illegal
- * numbers. That is the largest legal value, divided by the
- * base. An input number that is greater than this value, if
- * followed by a legal input character, is too big. One that
- * is equal to this value may be valid or not; the limit
- * between valid and invalid numbers is then based on the last
- * digit. For instance, if the range for longs is
- * [-2147483648..2147483647] and the input base is 10,
- * cutoff will be set to 214748364 and cutlim to either
- * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
- * a value > 214748364, or equal but the next digit is > 7 (or 8),
- * the number is too big, and we will return a range error.
- *
- * Set any if any `digits' consumed; make it negative to indicate
- * overflow.
- */
- cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX;
- cutlim = cutoff % (unsigned long)base;
- cutoff /= (unsigned long)base;
- for (acc = 0, any = 0;; c = *s++) {
- if (isdigit(c))
- c -= '0';
- else if (isalpha(c))
- c -= isupper(c) ? 'A' - 10 : 'a' - 10;
- else
- break;
- if (c >= base)
- break;
- if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim)
- any = -1;
- else {
- any = 1;
- acc *= base;
- acc += c;
- }
- }
- if (any < 0) {
- acc = neg ? LONG_MIN : LONG_MAX;
- errno = ERANGE;
- } else if (neg)
- acc = -acc;
- if (endptr != 0)
- *endptr = (char *) (any ? s - 1 : nptr);
- return (acc);
-}
+++ /dev/null
-/*
- * Copyright (c) 1990 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <limits.h>
-#include <ctype.h>
-#include <errno.h>
-#if 0
-#include <stdlib.h>
-#endif
-
-#ifndef ULONG_MAX
-#define ULONG_MAX ((unsigned long)(~0L)) /* 0xFFFFFFFF */
-#endif
-
-/*
- * Convert a string to an unsigned long integer.
- *
- * Ignores `locale' stuff. Assumes that the upper and lower case
- * alphabets and digits are each contiguous.
- */
-unsigned long
-strtoul(nptr, endptr, base)
- const char *nptr;
- char **endptr;
- register int base;
-{
- register const char *s = nptr;
- register unsigned long acc;
- register int c;
- register unsigned long cutoff;
- register int neg = 0, any, cutlim;
-
- /*
- * See strtol for comments as to the logic used.
- */
- do {
- c = *s++;
- } while (isspace(c));
- if (c == '-') {
- neg = 1;
- c = *s++;
- } else if (c == '+')
- c = *s++;
- if ((base == 0 || base == 16) &&
- c == '0' && (*s == 'x' || *s == 'X')) {
- c = s[1];
- s += 2;
- base = 16;
- }
- if (base == 0)
- base = c == '0' ? 8 : 10;
- cutoff = (unsigned long)ULONG_MAX / (unsigned long)base;
- cutlim = (unsigned long)ULONG_MAX % (unsigned long)base;
- for (acc = 0, any = 0;; c = *s++) {
- if (isdigit(c))
- c -= '0';
- else if (isalpha(c))
- c -= isupper(c) ? 'A' - 10 : 'a' - 10;
- else
- break;
- if (c >= base)
- break;
- if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim)
- any = -1;
- else {
- any = 1;
- acc *= base;
- acc += c;
- }
- }
- if (any < 0) {
- acc = ULONG_MAX;
- errno = ERANGE;
- } else if (neg)
- acc = -acc;
- if (endptr != 0)
- *endptr = (char *) (any ? s - 1 : nptr);
- return (acc);
-}
+++ /dev/null
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-
-#if HAVE_MCHECK_H
-#include <mcheck.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#ifdef __NeXT
-/* access macros are not declared in non posix mode in unistd.h -
- don't try to use posix on NeXTstep 3.3 ! */
-#include <libc.h>
-#endif
-
-/* AIX requires this to be the first thing in the file. */
-#ifndef __GNUC__
-# if HAVE_ALLOCA_H
-# include <alloca.h>
-# else
-# ifdef _AIX
-#pragma alloca
-# else
-# ifndef alloca /* predefined by HP cc +Olibcalls */
-char *alloca ();
-# endif
-# endif
-# endif
-#elif defined(__GNUC__) && defined(__STRICT_ANSI__)
-#define alloca __builtin_alloca
-#endif
-
-/*@only@*/ char * xstrdup (const char *str);
-
-#if HAVE_MCHECK_H && defined(__GNUC__)
-#define vmefail() (fprintf(stderr, "virtual memory exhausted.\n"), exit(EXIT_FAILURE), NULL)
-#define xstrdup(_str) (strcpy((malloc(strlen(_str)+1) ? : vmefail()), (_str)))
-#else
-#define xstrdup(_str) strdup(_str)
-#endif /* HAVE_MCHECK_H && defined(__GNUC__) */
-
-
-#include "popt-gnome.h"
+++ /dev/null
-/* Like vsprintf but provides a pointer to malloc'd storage, which must
- be freed by the caller.
- Copyright (C) 1994 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 <stdio.h>
-#include <string.h>
-
-#if __STDC__
-# include <stdarg.h>
-#else
-# include <varargs.h>
-#endif
-
-#ifdef TEST
-int global_total_width;
-#endif
-
-unsigned long strtoul ();
-char *malloc ();
-
-static int
-int_vasprintf (result, format, args)
- char **result;
- const char *format;
- va_list *args;
-{
- const char *p = format;
- /* Add one to make sure that it is never zero, which might cause malloc
- to return NULL. */
- int total_width = strlen (format) + 1;
- va_list ap;
-
- memcpy (&ap, args, sizeof (va_list));
-
- while (*p != '\0')
- {
- if (*p++ == '%')
- {
- while (strchr ("-+ #0", *p))
- ++p;
- if (*p == '*')
- {
- ++p;
- total_width += abs (va_arg (ap, int));
- }
- else
- total_width += strtoul (p, &p, 10);
- if (*p == '.')
- {
- ++p;
- if (*p == '*')
- {
- ++p;
- total_width += abs (va_arg (ap, int));
- }
- else
- total_width += strtoul (p, &p, 10);
- }
- while (strchr ("hlL", *p))
- ++p;
- /* Should be big enough for any format specifier except %s
- and floats. */
- total_width += 30;
- switch (*p)
- {
- case 'd':
- case 'i':
- case 'o':
- case 'u':
- case 'x':
- case 'X':
- case 'c':
- (void) va_arg (ap, int);
- break;
- case 'f':
- case 'e':
- case 'E':
- case 'g':
- case 'G':
- (void) va_arg (ap, double);
- /* Since an ieee double can have an exponent of 307, we'll
- make the buffer wide enough to cover the gross case. */
- total_width += 307;
- break;
- case 's':
- total_width += strlen (va_arg (ap, char *));
- break;
- case 'p':
- case 'n':
- (void) va_arg (ap, char *);
- break;
- }
- }
- }
-#ifdef TEST
- global_total_width = total_width;
-#endif
- *result = malloc (total_width);
- if (*result != NULL)
- return vsprintf (*result, format, *args);
- else
- return 0;
-}
-
-int
-vasprintf (result, format, args)
- char **result;
- const char *format;
- va_list args;
-{
- return int_vasprintf (result, format, &args);
-}
-
-int
-asprintf
-#if __STDC__
- (char **result, const char *format, ...)
-#else
- (result, va_alist)
- char **result;
- va_dcl
-#endif
-{
- va_list args;
- int done;
-
-#if __STDC__
- va_start (args, format);
-#else
- char *format;
- va_start (args);
- format = va_arg (args, char *);
-#endif
- done = vasprintf (result, format, args);
- va_end (args);
-
- return done;
-}
-
-#ifdef TEST
-void
-checkit
-#if __STDC__
- (const char* format, ...)
-#else
- (va_alist)
- va_dcl
-#endif
-{
- va_list args;
- char *result;
-
-#if __STDC__
- va_start (args, format);
-#else
- char *format;
- va_start (args);
- format = va_arg (args, char *);
-#endif
- vasprintf (&result, format, args);
- if (strlen (result) < global_total_width)
- printf ("PASS: ");
- else
- printf ("FAIL: ");
- printf ("%d %s\n", global_total_width, result);
-}
-
-int
-main ()
-{
- checkit ("%d", 0x12345678);
- checkit ("%200d", 5);
- checkit ("%.300d", 6);
- checkit ("%100.150d", 7);
- checkit ("%s", "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\
-777777777777777777333333333333366666666666622222222222777777777777733333");
- checkit ("%f%s%d%s", 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx");
-}
-#endif /* TEST */
+++ /dev/null
-/*
- * Revision 12: http://theos.com/~deraadt/snprintf.c
- *
- * Copyright (c) 1997 Theo de Raadt
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <signal.h>
-#include <stdio.h>
-#if __STDC__
-#include <stdarg.h>
-#include <stdlib.h>
-#else
-#include <varargs.h>
-#endif
-#include <setjmp.h>
-
-#ifndef roundup
-#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
-#endif
-
-static int pgsize;
-static char *curobj;
-static int caught;
-static sigjmp_buf bail;
-
-#define EXTRABYTES 2 /* XXX: why 2? you don't want to know */
-
-static char *
-msetup(str, n)
- char *str;
- size_t n;
-{
- char *e;
-
- if (n == 0)
- return NULL;
- if (pgsize == 0)
- pgsize = getpagesize();
- curobj = (char *)malloc(n + EXTRABYTES + pgsize * 2);
- if (curobj == NULL)
- return NULL;
- e = curobj + n + EXTRABYTES;
- e = (char *)roundup((unsigned long)e, pgsize);
- if (mprotect(e, pgsize, PROT_NONE) == -1) {
- free(curobj);
- curobj = NULL;
- return NULL;
- }
- e = e - n - EXTRABYTES;
- *e = '\0';
- return (e);
-}
-
-static void
-mcatch()
-{
- siglongjmp(bail, 1);
-}
-
-static void
-mcleanup(str, n, p)
- char *str;
- size_t n;
- char *p;
-{
- g_strlcpy(str, p, n);
- if (mprotect((caddr_t)(p + n + EXTRABYTES), pgsize,
- PROT_READ|PROT_WRITE|PROT_EXEC) == -1)
- mprotect((caddr_t)(p + n + EXTRABYTES), pgsize,
- PROT_READ|PROT_WRITE);
- free(curobj);
-}
-
-int
-#if __STDC__
-vsnprintf(char *str, size_t n, char const *fmt, va_list ap)
-#else
-vsnprintf(str, n, fmt, ap)
- char *str;
- size_t n;
- char *fmt;
- char *ap;
-#endif
-{
- struct sigaction osa, nsa;
- char *p;
- int ret = n + 1; /* if we bail, indicated we overflowed */
-
- memset(&nsa, 0, sizeof nsa);
- nsa.sa_handler = mcatch;
- sigemptyset(&nsa.sa_mask);
-
- p = msetup(str, n);
- if (p == NULL) {
- *str = '\0';
- return 0;
- }
- if (sigsetjmp(bail, 1) == 0) {
- if (sigaction(SIGSEGV, &nsa, &osa) == -1) {
- mcleanup(str, n, p);
- return (0);
- }
- ret = vsprintf(p, fmt, ap);
- }
- mcleanup(str, n, p);
- (void) sigaction(SIGSEGV, &osa, NULL);
- return (ret);
-}
-
-int
-#if __STDC__
-snprintf(char *str, size_t n, char const *fmt, ...)
-#else
-snprintf(str, n, fmt, va_alist)
- char *str;
- size_t n;
- char *fmt;
- va_dcl
-#endif
-{
- va_list ap;
-#if __STDC__
- va_start(ap, fmt);
-#else
- va_start(ap);
-#endif
-
- return (vsnprintf(str, n, fmt, ap));
- va_end(ap);
-}
-
-
-