Install gnulib to make sure we can use argp in ltlfilt.
* lib/Makefile.am, lib/alloca.c, lib/alloca.in.h, lib/argp-ba.c, lib/argp-eexst.c, lib/argp-fmtstream.c, lib/argp-fmtstream.h, lib/argp-fs-xinl.c, lib/argp-help.c, lib/argp-namefrob.h, lib/argp-parse.c, lib/argp-pin.c, lib/argp-pv.c, lib/argp-pvh.c, lib/argp-xinl.c, lib/argp.h, lib/asnprintf.c, lib/basename-lgpl.c, lib/dirname-lgpl.c, lib/dirname.h, lib/dosname.h, lib/errno.in.h, lib/float+.h, lib/float.c, lib/float.in.h, lib/getopt.c, lib/getopt.in.h, lib/getopt1.c, lib/getopt_int.h, lib/gettext.h, lib/intprops.h, lib/itold.c, lib/malloc.c, lib/memchr.c, lib/memchr.valgrind, lib/mempcpy.c, lib/printf-args.c, lib/printf-args.h, lib/printf-parse.c, lib/printf-parse.h, lib/rawmemchr.c, lib/rawmemchr.valgrind, lib/size_max.h, lib/sleep.c, lib/stdalign.in.h, lib/stdbool.in.h, lib/stddef.in.h, lib/stdint.in.h, lib/stdio.in.h, lib/stdlib.in.h, lib/strcasecmp.c, lib/strchrnul.c, lib/strchrnul.valgrind, lib/strerror-override.c, lib/strerror-override.h, lib/strerror.c, lib/string.in.h, lib/strings.in.h, lib/stripslash.c, lib/strncasecmp.c, lib/strndup.c, lib/strnlen.c, lib/sys_types.in.h, lib/sysexits.in.h, lib/unistd.in.h, lib/vasnprintf.c, lib/vasnprintf.h, lib/verify.h, lib/vsnprintf.c, lib/wchar.in.h, lib/xsize.h, m4/00gnulib.m4, m4/alloca.m4, m4/argp.m4, m4/dirname.m4, m4/double-slash-root.m4, m4/errno_h.m4, m4/exponentd.m4, m4/extensions.m4, m4/float_h.m4, m4/getopt.m4, m4/gnulib-cache.m4, m4/gnulib-common.m4, m4/gnulib-comp.m4, m4/gnulib-tool.m4, m4/include_next.m4, m4/intmax_t.m4, m4/inttypes_h.m4, m4/longlong.m4, m4/malloc.m4, m4/math_h.m4, m4/memchr.m4, m4/mempcpy.m4, m4/mmap-anon.m4, m4/multiarch.m4, m4/nocrash.m4, m4/off_t.m4, m4/printf.m4, m4/rawmemchr.m4, m4/size_max.m4, m4/sleep.m4, m4/ssize_t.m4, m4/stdalign.m4, m4/stdbool.m4, m4/stddef_h.m4, m4/stdint.m4, m4/stdint_h.m4, m4/stdio_h.m4, m4/stdlib_h.m4, m4/strcase.m4, m4/strchrnul.m4, m4/strerror.m4, m4/string_h.m4, m4/strings_h.m4, m4/strndup.m4, m4/strnlen.m4, m4/sys_socket_h.m4, m4/sys_types_h.m4, m4/sysexits.m4, m4/unistd_h.m4, m4/vasnprintf.m4, m4/vsnprintf.m4, m4/warn-on-use.m4, m4/wchar_h.m4, m4/wchar_t.m4, m4/wint_t.m4, m4/xsize.m4, tools/snippet/_Noreturn.h, tools/snippet/arg-nonnull.h, tools/snippet/c++defs.h, tools/snippet/warn-on-use.h: New files from gnulib 1af55d85d9762a679b4302d5995f05ccd883e956. * configure.ac, Makefile.am: Adjust to compile gnulib. * src/bin/Makefile.am: Adjust to use gnulib. * README: Mention lib/.
This commit is contained in:
parent
f38f9df020
commit
93f6e21759
135 changed files with 33744 additions and 4 deletions
|
|
@ -36,13 +36,15 @@ if NEVER
|
||||||
NEVER_BENCH = bench
|
NEVER_BENCH = bench
|
||||||
endif
|
endif
|
||||||
|
|
||||||
SUBDIRS = $(MAYBE_BUDDY) $(MAYBE_LBTT) $(NEVER_BENCH) doc src wrap ltdl iface
|
SUBDIRS = $(MAYBE_BUDDY) $(MAYBE_LBTT) \
|
||||||
|
$(NEVER_BENCH) doc lib src wrap ltdl iface
|
||||||
|
|
||||||
UTF8 = utf8/doc/ReleaseNotes utf8/doc/utf8cpp.html utf8/utf8.h \
|
UTF8 = utf8/doc/ReleaseNotes utf8/doc/utf8cpp.html utf8/utf8.h \
|
||||||
utf8/utf8/checked.h utf8/utf8/core.h utf8/utf8/unchecked.h
|
utf8/utf8/checked.h utf8/utf8/core.h utf8/utf8/unchecked.h
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
EXTRA_DIST = HACKING ChangeLog.1 tools/gitlog-to-changelog $(UTF8)
|
EXTRA_DIST = HACKING ChangeLog.1 tools/gitlog-to-changelog $(UTF8) \
|
||||||
|
m4/gnulib-cache.m4
|
||||||
|
|
||||||
dist-hook: gen-ChangeLog
|
dist-hook: gen-ChangeLog
|
||||||
|
|
||||||
|
|
|
||||||
1
README
1
README
|
|
@ -172,6 +172,7 @@ Third party software
|
||||||
buddy/ A patched version of BuDDy 2.3 (a BDD library).
|
buddy/ A patched version of BuDDy 2.3 (a BDD library).
|
||||||
lbtt/ lbtt 1.2.1 (an LTL to Büchi automata test bench).
|
lbtt/ lbtt 1.2.1 (an LTL to Büchi automata test bench).
|
||||||
ltdl/ Libtool's portable dlopen() wrapper library.
|
ltdl/ Libtool's portable dlopen() wrapper library.
|
||||||
|
lib/ Gnulib's portability modules.
|
||||||
|
|
||||||
Build-system stuff
|
Build-system stuff
|
||||||
------------------
|
------------------
|
||||||
|
|
|
||||||
|
|
@ -50,12 +50,16 @@ if test "x${enable_python:-yes}" = xyes; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
|
gl_EARLY
|
||||||
|
|
||||||
AM_PROG_CC_C_O
|
AM_PROG_CC_C_O
|
||||||
AC_PROG_CXX
|
AC_PROG_CXX
|
||||||
|
|
||||||
AM_PROG_LEX
|
AM_PROG_LEX
|
||||||
AC_PROG_YACC
|
AC_PROG_YACC
|
||||||
|
|
||||||
|
gl_INIT
|
||||||
|
|
||||||
AC_LANG(C++)
|
AC_LANG(C++)
|
||||||
|
|
||||||
AC_HEADER_UNORDERED_MAP
|
AC_HEADER_UNORDERED_MAP
|
||||||
|
|
@ -125,6 +129,7 @@ AC_CONFIG_FILES([
|
||||||
iface/gspn/defs
|
iface/gspn/defs
|
||||||
iface/gspn/Makefile
|
iface/gspn/Makefile
|
||||||
iface/Makefile
|
iface/Makefile
|
||||||
|
lib/Makefile
|
||||||
src/bin/Makefile
|
src/bin/Makefile
|
||||||
src/eltlparse/Makefile
|
src/eltlparse/Makefile
|
||||||
src/eltltest/defs
|
src/eltltest/defs
|
||||||
|
|
|
||||||
1257
lib/Makefile.am
Normal file
1257
lib/Makefile.am
Normal file
File diff suppressed because it is too large
Load diff
478
lib/alloca.c
Normal file
478
lib/alloca.c
Normal file
|
|
@ -0,0 +1,478 @@
|
||||||
|
/* alloca.c -- allocate automatically reclaimed memory
|
||||||
|
(Mostly) portable public-domain implementation -- D A Gwyn
|
||||||
|
|
||||||
|
This implementation of the PWB library alloca function,
|
||||||
|
which is used to allocate space off the run-time stack so
|
||||||
|
that it is automatically reclaimed upon procedure exit,
|
||||||
|
was inspired by discussions with J. Q. Johnson of Cornell.
|
||||||
|
J.Otto Tennant <jot@cray.com> contributed the Cray support.
|
||||||
|
|
||||||
|
There are some preprocessor constants that can
|
||||||
|
be defined when compiling for your specific system, for
|
||||||
|
improved efficiency; however, the defaults should be okay.
|
||||||
|
|
||||||
|
The general concept of this implementation is to keep
|
||||||
|
track of all alloca-allocated blocks, and reclaim any
|
||||||
|
that are found to be deeper in the stack than the current
|
||||||
|
invocation. This heuristic does not reclaim storage as
|
||||||
|
soon as it becomes invalid, but it will do so eventually.
|
||||||
|
|
||||||
|
As a special case, alloca(0) reclaims storage without
|
||||||
|
allocating any. It is a good idea to use alloca(0) in
|
||||||
|
your main control loop, etc. to force garbage collection. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <alloca.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#ifdef emacs
|
||||||
|
# include "lisp.h"
|
||||||
|
# include "blockinput.h"
|
||||||
|
# ifdef EMACS_FREE
|
||||||
|
# undef free
|
||||||
|
# define free EMACS_FREE
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define memory_full() abort ()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If compiling with GCC 2, this file's not needed. */
|
||||||
|
#if !defined (__GNUC__) || __GNUC__ < 2
|
||||||
|
|
||||||
|
/* If someone has defined alloca as a macro,
|
||||||
|
there must be some other way alloca is supposed to work. */
|
||||||
|
# ifndef alloca
|
||||||
|
|
||||||
|
# ifdef emacs
|
||||||
|
# ifdef static
|
||||||
|
/* actually, only want this if static is defined as ""
|
||||||
|
-- this is for usg, in which emacs must undefine static
|
||||||
|
in order to make unexec workable
|
||||||
|
*/
|
||||||
|
# ifndef STACK_DIRECTION
|
||||||
|
you
|
||||||
|
lose
|
||||||
|
-- must know STACK_DIRECTION at compile-time
|
||||||
|
/* Using #error here is not wise since this file should work for
|
||||||
|
old and obscure compilers. */
|
||||||
|
# endif /* STACK_DIRECTION undefined */
|
||||||
|
# endif /* static */
|
||||||
|
# endif /* emacs */
|
||||||
|
|
||||||
|
/* If your stack is a linked list of frames, you have to
|
||||||
|
provide an "address metric" ADDRESS_FUNCTION macro. */
|
||||||
|
|
||||||
|
# if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||||
|
long i00afunc ();
|
||||||
|
# define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
|
||||||
|
# else
|
||||||
|
# define ADDRESS_FUNCTION(arg) &(arg)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Define STACK_DIRECTION if you know the direction of stack
|
||||||
|
growth for your system; otherwise it will be automatically
|
||||||
|
deduced at run-time.
|
||||||
|
|
||||||
|
STACK_DIRECTION > 0 => grows toward higher addresses
|
||||||
|
STACK_DIRECTION < 0 => grows toward lower addresses
|
||||||
|
STACK_DIRECTION = 0 => direction of growth unknown */
|
||||||
|
|
||||||
|
# ifndef STACK_DIRECTION
|
||||||
|
# define STACK_DIRECTION 0 /* Direction unknown. */
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if STACK_DIRECTION != 0
|
||||||
|
|
||||||
|
# define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
|
||||||
|
|
||||||
|
# else /* STACK_DIRECTION == 0; need run-time code. */
|
||||||
|
|
||||||
|
static int stack_dir; /* 1 or -1 once known. */
|
||||||
|
# define STACK_DIR stack_dir
|
||||||
|
|
||||||
|
static int
|
||||||
|
find_stack_direction (int *addr, int depth)
|
||||||
|
{
|
||||||
|
int dir, dummy = 0;
|
||||||
|
if (! addr)
|
||||||
|
addr = &dummy;
|
||||||
|
*addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
|
||||||
|
dir = depth ? find_stack_direction (addr, depth - 1) : 0;
|
||||||
|
return dir + dummy;
|
||||||
|
}
|
||||||
|
|
||||||
|
# endif /* STACK_DIRECTION == 0 */
|
||||||
|
|
||||||
|
/* An "alloca header" is used to:
|
||||||
|
(a) chain together all alloca'ed blocks;
|
||||||
|
(b) keep track of stack depth.
|
||||||
|
|
||||||
|
It is very important that sizeof(header) agree with malloc
|
||||||
|
alignment chunk size. The following default should work okay. */
|
||||||
|
|
||||||
|
# ifndef ALIGN_SIZE
|
||||||
|
# define ALIGN_SIZE sizeof(double)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
typedef union hdr
|
||||||
|
{
|
||||||
|
char align[ALIGN_SIZE]; /* To force sizeof(header). */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
union hdr *next; /* For chaining headers. */
|
||||||
|
char *deep; /* For stack depth measure. */
|
||||||
|
} h;
|
||||||
|
} header;
|
||||||
|
|
||||||
|
static header *last_alloca_header = NULL; /* -> last alloca header. */
|
||||||
|
|
||||||
|
/* Return a pointer to at least SIZE bytes of storage,
|
||||||
|
which will be automatically reclaimed upon exit from
|
||||||
|
the procedure that called alloca. Originally, this space
|
||||||
|
was supposed to be taken from the current stack frame of the
|
||||||
|
caller, but that method cannot be made to work for some
|
||||||
|
implementations of C, for example under Gould's UTX/32. */
|
||||||
|
|
||||||
|
void *
|
||||||
|
alloca (size_t size)
|
||||||
|
{
|
||||||
|
auto char probe; /* Probes stack depth: */
|
||||||
|
register char *depth = ADDRESS_FUNCTION (probe);
|
||||||
|
|
||||||
|
# if STACK_DIRECTION == 0
|
||||||
|
if (STACK_DIR == 0) /* Unknown growth direction. */
|
||||||
|
STACK_DIR = find_stack_direction (NULL, (size & 1) + 20);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Reclaim garbage, defined as all alloca'd storage that
|
||||||
|
was allocated from deeper in the stack than currently. */
|
||||||
|
|
||||||
|
{
|
||||||
|
register header *hp; /* Traverses linked list. */
|
||||||
|
|
||||||
|
# ifdef emacs
|
||||||
|
BLOCK_INPUT;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
for (hp = last_alloca_header; hp != NULL;)
|
||||||
|
if ((STACK_DIR > 0 && hp->h.deep > depth)
|
||||||
|
|| (STACK_DIR < 0 && hp->h.deep < depth))
|
||||||
|
{
|
||||||
|
register header *np = hp->h.next;
|
||||||
|
|
||||||
|
free (hp); /* Collect garbage. */
|
||||||
|
|
||||||
|
hp = np; /* -> next header. */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break; /* Rest are not deeper. */
|
||||||
|
|
||||||
|
last_alloca_header = hp; /* -> last valid storage. */
|
||||||
|
|
||||||
|
# ifdef emacs
|
||||||
|
UNBLOCK_INPUT;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size == 0)
|
||||||
|
return NULL; /* No allocation required. */
|
||||||
|
|
||||||
|
/* Allocate combined header + user data storage. */
|
||||||
|
|
||||||
|
{
|
||||||
|
/* Address of header. */
|
||||||
|
register header *new;
|
||||||
|
|
||||||
|
size_t combined_size = sizeof (header) + size;
|
||||||
|
if (combined_size < sizeof (header))
|
||||||
|
memory_full ();
|
||||||
|
|
||||||
|
new = malloc (combined_size);
|
||||||
|
|
||||||
|
if (! new)
|
||||||
|
memory_full ();
|
||||||
|
|
||||||
|
new->h.next = last_alloca_header;
|
||||||
|
new->h.deep = depth;
|
||||||
|
|
||||||
|
last_alloca_header = new;
|
||||||
|
|
||||||
|
/* User storage begins just after header. */
|
||||||
|
|
||||||
|
return (void *) (new + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||||
|
|
||||||
|
# ifdef DEBUG_I00AFUNC
|
||||||
|
# include <stdio.h>
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef CRAY_STACK
|
||||||
|
# define CRAY_STACK
|
||||||
|
# ifndef CRAY2
|
||||||
|
/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
|
||||||
|
struct stack_control_header
|
||||||
|
{
|
||||||
|
long shgrow:32; /* Number of times stack has grown. */
|
||||||
|
long shaseg:32; /* Size of increments to stack. */
|
||||||
|
long shhwm:32; /* High water mark of stack. */
|
||||||
|
long shsize:32; /* Current size of stack (all segments). */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The stack segment linkage control information occurs at
|
||||||
|
the high-address end of a stack segment. (The stack
|
||||||
|
grows from low addresses to high addresses.) The initial
|
||||||
|
part of the stack segment linkage control information is
|
||||||
|
0200 (octal) words. This provides for register storage
|
||||||
|
for the routine which overflows the stack. */
|
||||||
|
|
||||||
|
struct stack_segment_linkage
|
||||||
|
{
|
||||||
|
long ss[0200]; /* 0200 overflow words. */
|
||||||
|
long sssize:32; /* Number of words in this segment. */
|
||||||
|
long ssbase:32; /* Offset to stack base. */
|
||||||
|
long:32;
|
||||||
|
long sspseg:32; /* Offset to linkage control of previous
|
||||||
|
segment of stack. */
|
||||||
|
long:32;
|
||||||
|
long sstcpt:32; /* Pointer to task common address block. */
|
||||||
|
long sscsnm; /* Private control structure number for
|
||||||
|
microtasking. */
|
||||||
|
long ssusr1; /* Reserved for user. */
|
||||||
|
long ssusr2; /* Reserved for user. */
|
||||||
|
long sstpid; /* Process ID for pid based multi-tasking. */
|
||||||
|
long ssgvup; /* Pointer to multitasking thread giveup. */
|
||||||
|
long sscray[7]; /* Reserved for Cray Research. */
|
||||||
|
long ssa0;
|
||||||
|
long ssa1;
|
||||||
|
long ssa2;
|
||||||
|
long ssa3;
|
||||||
|
long ssa4;
|
||||||
|
long ssa5;
|
||||||
|
long ssa6;
|
||||||
|
long ssa7;
|
||||||
|
long sss0;
|
||||||
|
long sss1;
|
||||||
|
long sss2;
|
||||||
|
long sss3;
|
||||||
|
long sss4;
|
||||||
|
long sss5;
|
||||||
|
long sss6;
|
||||||
|
long sss7;
|
||||||
|
};
|
||||||
|
|
||||||
|
# else /* CRAY2 */
|
||||||
|
/* The following structure defines the vector of words
|
||||||
|
returned by the STKSTAT library routine. */
|
||||||
|
struct stk_stat
|
||||||
|
{
|
||||||
|
long now; /* Current total stack size. */
|
||||||
|
long maxc; /* Amount of contiguous space which would
|
||||||
|
be required to satisfy the maximum
|
||||||
|
stack demand to date. */
|
||||||
|
long high_water; /* Stack high-water mark. */
|
||||||
|
long overflows; /* Number of stack overflow ($STKOFEN) calls. */
|
||||||
|
long hits; /* Number of internal buffer hits. */
|
||||||
|
long extends; /* Number of block extensions. */
|
||||||
|
long stko_mallocs; /* Block allocations by $STKOFEN. */
|
||||||
|
long underflows; /* Number of stack underflow calls ($STKRETN). */
|
||||||
|
long stko_free; /* Number of deallocations by $STKRETN. */
|
||||||
|
long stkm_free; /* Number of deallocations by $STKMRET. */
|
||||||
|
long segments; /* Current number of stack segments. */
|
||||||
|
long maxs; /* Maximum number of stack segments so far. */
|
||||||
|
long pad_size; /* Stack pad size. */
|
||||||
|
long current_address; /* Current stack segment address. */
|
||||||
|
long current_size; /* Current stack segment size. This
|
||||||
|
number is actually corrupted by STKSTAT to
|
||||||
|
include the fifteen word trailer area. */
|
||||||
|
long initial_address; /* Address of initial segment. */
|
||||||
|
long initial_size; /* Size of initial segment. */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The following structure describes the data structure which trails
|
||||||
|
any stack segment. I think that the description in 'asdef' is
|
||||||
|
out of date. I only describe the parts that I am sure about. */
|
||||||
|
|
||||||
|
struct stk_trailer
|
||||||
|
{
|
||||||
|
long this_address; /* Address of this block. */
|
||||||
|
long this_size; /* Size of this block (does not include
|
||||||
|
this trailer). */
|
||||||
|
long unknown2;
|
||||||
|
long unknown3;
|
||||||
|
long link; /* Address of trailer block of previous
|
||||||
|
segment. */
|
||||||
|
long unknown5;
|
||||||
|
long unknown6;
|
||||||
|
long unknown7;
|
||||||
|
long unknown8;
|
||||||
|
long unknown9;
|
||||||
|
long unknown10;
|
||||||
|
long unknown11;
|
||||||
|
long unknown12;
|
||||||
|
long unknown13;
|
||||||
|
long unknown14;
|
||||||
|
};
|
||||||
|
|
||||||
|
# endif /* CRAY2 */
|
||||||
|
# endif /* not CRAY_STACK */
|
||||||
|
|
||||||
|
# ifdef CRAY2
|
||||||
|
/* Determine a "stack measure" for an arbitrary ADDRESS.
|
||||||
|
I doubt that "lint" will like this much. */
|
||||||
|
|
||||||
|
static long
|
||||||
|
i00afunc (long *address)
|
||||||
|
{
|
||||||
|
struct stk_stat status;
|
||||||
|
struct stk_trailer *trailer;
|
||||||
|
long *block, size;
|
||||||
|
long result = 0;
|
||||||
|
|
||||||
|
/* We want to iterate through all of the segments. The first
|
||||||
|
step is to get the stack status structure. We could do this
|
||||||
|
more quickly and more directly, perhaps, by referencing the
|
||||||
|
$LM00 common block, but I know that this works. */
|
||||||
|
|
||||||
|
STKSTAT (&status);
|
||||||
|
|
||||||
|
/* Set up the iteration. */
|
||||||
|
|
||||||
|
trailer = (struct stk_trailer *) (status.current_address
|
||||||
|
+ status.current_size
|
||||||
|
- 15);
|
||||||
|
|
||||||
|
/* There must be at least one stack segment. Therefore it is
|
||||||
|
a fatal error if "trailer" is null. */
|
||||||
|
|
||||||
|
if (trailer == 0)
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
/* Discard segments that do not contain our argument address. */
|
||||||
|
|
||||||
|
while (trailer != 0)
|
||||||
|
{
|
||||||
|
block = (long *) trailer->this_address;
|
||||||
|
size = trailer->this_size;
|
||||||
|
if (block == 0 || size == 0)
|
||||||
|
abort ();
|
||||||
|
trailer = (struct stk_trailer *) trailer->link;
|
||||||
|
if ((block <= address) && (address < (block + size)))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the result to the offset in this segment and add the sizes
|
||||||
|
of all predecessor segments. */
|
||||||
|
|
||||||
|
result = address - block;
|
||||||
|
|
||||||
|
if (trailer == 0)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (trailer->this_size <= 0)
|
||||||
|
abort ();
|
||||||
|
result += trailer->this_size;
|
||||||
|
trailer = (struct stk_trailer *) trailer->link;
|
||||||
|
}
|
||||||
|
while (trailer != 0);
|
||||||
|
|
||||||
|
/* We are done. Note that if you present a bogus address (one
|
||||||
|
not in any segment), you will get a different number back, formed
|
||||||
|
from subtracting the address of the first block. This is probably
|
||||||
|
not what you want. */
|
||||||
|
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
# else /* not CRAY2 */
|
||||||
|
/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
|
||||||
|
Determine the number of the cell within the stack,
|
||||||
|
given the address of the cell. The purpose of this
|
||||||
|
routine is to linearize, in some sense, stack addresses
|
||||||
|
for alloca. */
|
||||||
|
|
||||||
|
static long
|
||||||
|
i00afunc (long address)
|
||||||
|
{
|
||||||
|
long stkl = 0;
|
||||||
|
|
||||||
|
long size, pseg, this_segment, stack;
|
||||||
|
long result = 0;
|
||||||
|
|
||||||
|
struct stack_segment_linkage *ssptr;
|
||||||
|
|
||||||
|
/* Register B67 contains the address of the end of the
|
||||||
|
current stack segment. If you (as a subprogram) store
|
||||||
|
your registers on the stack and find that you are past
|
||||||
|
the contents of B67, you have overflowed the segment.
|
||||||
|
|
||||||
|
B67 also points to the stack segment linkage control
|
||||||
|
area, which is what we are really interested in. */
|
||||||
|
|
||||||
|
stkl = CRAY_STACKSEG_END ();
|
||||||
|
ssptr = (struct stack_segment_linkage *) stkl;
|
||||||
|
|
||||||
|
/* If one subtracts 'size' from the end of the segment,
|
||||||
|
one has the address of the first word of the segment.
|
||||||
|
|
||||||
|
If this is not the first segment, 'pseg' will be
|
||||||
|
nonzero. */
|
||||||
|
|
||||||
|
pseg = ssptr->sspseg;
|
||||||
|
size = ssptr->sssize;
|
||||||
|
|
||||||
|
this_segment = stkl - size;
|
||||||
|
|
||||||
|
/* It is possible that calling this routine itself caused
|
||||||
|
a stack overflow. Discard stack segments which do not
|
||||||
|
contain the target address. */
|
||||||
|
|
||||||
|
while (!(this_segment <= address && address <= stkl))
|
||||||
|
{
|
||||||
|
# ifdef DEBUG_I00AFUNC
|
||||||
|
fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
|
||||||
|
# endif
|
||||||
|
if (pseg == 0)
|
||||||
|
break;
|
||||||
|
stkl = stkl - pseg;
|
||||||
|
ssptr = (struct stack_segment_linkage *) stkl;
|
||||||
|
size = ssptr->sssize;
|
||||||
|
pseg = ssptr->sspseg;
|
||||||
|
this_segment = stkl - size;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = address - this_segment;
|
||||||
|
|
||||||
|
/* If you subtract pseg from the current end of the stack,
|
||||||
|
you get the address of the previous stack segment's end.
|
||||||
|
This seems a little convoluted to me, but I'll bet you save
|
||||||
|
a cycle somewhere. */
|
||||||
|
|
||||||
|
while (pseg != 0)
|
||||||
|
{
|
||||||
|
# ifdef DEBUG_I00AFUNC
|
||||||
|
fprintf (stderr, "%011o %011o\n", pseg, size);
|
||||||
|
# endif
|
||||||
|
stkl = stkl - pseg;
|
||||||
|
ssptr = (struct stack_segment_linkage *) stkl;
|
||||||
|
size = ssptr->sssize;
|
||||||
|
pseg = ssptr->sspseg;
|
||||||
|
result += size;
|
||||||
|
}
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
# endif /* not CRAY2 */
|
||||||
|
# endif /* CRAY */
|
||||||
|
|
||||||
|
# endif /* no alloca */
|
||||||
|
#endif /* not GCC 2 */
|
||||||
63
lib/alloca.in.h
Normal file
63
lib/alloca.in.h
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
/* Memory allocation on the stack.
|
||||||
|
|
||||||
|
Copyright (C) 1995, 1999, 2001-2004, 2006-2012 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 3, 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, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
|
||||||
|
means there is a real alloca function. */
|
||||||
|
#ifndef _GL_ALLOCA_H
|
||||||
|
#define _GL_ALLOCA_H
|
||||||
|
|
||||||
|
/* alloca (N) returns a pointer to N bytes of memory
|
||||||
|
allocated on the stack, which will last until the function returns.
|
||||||
|
Use of alloca should be avoided:
|
||||||
|
- inside arguments of function calls - undefined behaviour,
|
||||||
|
- in inline functions - the allocation may actually last until the
|
||||||
|
calling function returns,
|
||||||
|
- for huge N (say, N >= 65536) - you never know how large (or small)
|
||||||
|
the stack is, and when the stack cannot fulfill the memory allocation
|
||||||
|
request, the program just crashes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef alloca
|
||||||
|
# ifdef __GNUC__
|
||||||
|
# define alloca __builtin_alloca
|
||||||
|
# elif defined _AIX
|
||||||
|
# define alloca __alloca
|
||||||
|
# elif defined _MSC_VER
|
||||||
|
# include <malloc.h>
|
||||||
|
# define alloca _alloca
|
||||||
|
# elif defined __DECC && defined __VMS
|
||||||
|
# define alloca __ALLOCA
|
||||||
|
# elif defined __TANDEM && defined _TNS_E_TARGET
|
||||||
|
# ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
# endif
|
||||||
|
void *_alloca (unsigned short);
|
||||||
|
# pragma intrinsic (_alloca)
|
||||||
|
# define alloca _alloca
|
||||||
|
# else
|
||||||
|
# include <stddef.h>
|
||||||
|
# ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
# endif
|
||||||
|
void *alloca (size_t);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _GL_ALLOCA_H */
|
||||||
34
lib/argp-ba.c
Normal file
34
lib/argp-ba.c
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
/* Default definition for ARGP_PROGRAM_BUG_ADDRESS.
|
||||||
|
Copyright (C) 1996-1997, 1999, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* If set by the user program, it should point to string that is the
|
||||||
|
bug-reporting address for the program. It will be printed by argp_help if
|
||||||
|
the ARGP_HELP_BUG_ADDR flag is set (as it is by various standard help
|
||||||
|
messages), embedded in a sentence that says something like "Report bugs to
|
||||||
|
ADDR." */
|
||||||
|
const char *argp_program_bug_address
|
||||||
|
/* This variable should be zero-initialized. On most systems, putting it into
|
||||||
|
BSS is sufficient. Not so on Mac OS X 10.3 and 10.4, see
|
||||||
|
<http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>
|
||||||
|
<http://lists.gnu.org/archive/html/bug-gnulib/2009-08/msg00096.html>. */
|
||||||
|
#if defined __ELF__
|
||||||
|
/* On ELF systems, variables in BSS behave well. */
|
||||||
|
#else
|
||||||
|
= (const char *) 0
|
||||||
|
#endif
|
||||||
|
;
|
||||||
30
lib/argp-eexst.c
Normal file
30
lib/argp-eexst.c
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
/* Default definition for ARGP_ERR_EXIT_STATUS
|
||||||
|
Copyright (C) 1997, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <sysexits.h>
|
||||||
|
|
||||||
|
#include "argp.h"
|
||||||
|
|
||||||
|
/* The exit status that argp will use when exiting due to a parsing error.
|
||||||
|
If not defined or set by the user program, this defaults to EX_USAGE from
|
||||||
|
<sysexits.h>. */
|
||||||
|
error_t argp_err_exit_status = EX_USAGE;
|
||||||
435
lib/argp-fmtstream.c
Normal file
435
lib/argp-fmtstream.c
Normal file
|
|
@ -0,0 +1,435 @@
|
||||||
|
/* Word-wrapping and line-truncating streams
|
||||||
|
Copyright (C) 1997-1999, 2001-2003, 2005, 2009-2012 Free Software
|
||||||
|
Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* This package emulates glibc 'line_wrap_stream' semantics for systems that
|
||||||
|
don't have that. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#include "argp-fmtstream.h"
|
||||||
|
#include "argp-namefrob.h"
|
||||||
|
|
||||||
|
#ifndef ARGP_FMTSTREAM_USE_LINEWRAP
|
||||||
|
|
||||||
|
#ifndef isblank
|
||||||
|
#define isblank(ch) ((ch)==' ' || (ch)=='\t')
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined _LIBC && defined USE_IN_LIBIO
|
||||||
|
# include <wchar.h>
|
||||||
|
# include <libio/libioP.h>
|
||||||
|
# define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f, a)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define INIT_BUF_SIZE 200
|
||||||
|
#define PRINTF_SIZE_GUESS 150
|
||||||
|
|
||||||
|
/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines
|
||||||
|
written on it with LMARGIN spaces and limits them to RMARGIN columns
|
||||||
|
total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by
|
||||||
|
replacing the whitespace before them with a newline and WMARGIN spaces.
|
||||||
|
Otherwise, chars beyond RMARGIN are simply dropped until a newline.
|
||||||
|
Returns NULL if there was an error. */
|
||||||
|
argp_fmtstream_t
|
||||||
|
__argp_make_fmtstream (FILE *stream,
|
||||||
|
size_t lmargin, size_t rmargin, ssize_t wmargin)
|
||||||
|
{
|
||||||
|
argp_fmtstream_t fs;
|
||||||
|
|
||||||
|
fs = (struct argp_fmtstream *) malloc (sizeof (struct argp_fmtstream));
|
||||||
|
if (fs != NULL)
|
||||||
|
{
|
||||||
|
fs->stream = stream;
|
||||||
|
|
||||||
|
fs->lmargin = lmargin;
|
||||||
|
fs->rmargin = rmargin;
|
||||||
|
fs->wmargin = wmargin;
|
||||||
|
fs->point_col = 0;
|
||||||
|
fs->point_offs = 0;
|
||||||
|
|
||||||
|
fs->buf = (char *) malloc (INIT_BUF_SIZE);
|
||||||
|
if (! fs->buf)
|
||||||
|
{
|
||||||
|
free (fs);
|
||||||
|
fs = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fs->p = fs->buf;
|
||||||
|
fs->end = fs->buf + INIT_BUF_SIZE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fs;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
/* Not exported. */
|
||||||
|
#ifdef weak_alias
|
||||||
|
weak_alias (__argp_make_fmtstream, argp_make_fmtstream)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Flush FS to its stream, and free it (but don't close the stream). */
|
||||||
|
void
|
||||||
|
__argp_fmtstream_free (argp_fmtstream_t fs)
|
||||||
|
{
|
||||||
|
__argp_fmtstream_update (fs);
|
||||||
|
if (fs->p > fs->buf)
|
||||||
|
{
|
||||||
|
#ifdef USE_IN_LIBIO
|
||||||
|
__fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf);
|
||||||
|
#else
|
||||||
|
fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
free (fs->buf);
|
||||||
|
free (fs);
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
/* Not exported. */
|
||||||
|
#ifdef weak_alias
|
||||||
|
weak_alias (__argp_fmtstream_free, argp_fmtstream_free)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Process FS's buffer so that line wrapping is done from POINT_OFFS to the
|
||||||
|
end of its buffer. This code is mostly from glibc stdio/linewrap.c. */
|
||||||
|
void
|
||||||
|
__argp_fmtstream_update (argp_fmtstream_t fs)
|
||||||
|
{
|
||||||
|
char *buf, *nl;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
/* Scan the buffer for newlines. */
|
||||||
|
buf = fs->buf + fs->point_offs;
|
||||||
|
while (buf < fs->p)
|
||||||
|
{
|
||||||
|
size_t r;
|
||||||
|
|
||||||
|
if (fs->point_col == 0 && fs->lmargin != 0)
|
||||||
|
{
|
||||||
|
/* We are starting a new line. Print spaces to the left margin. */
|
||||||
|
const size_t pad = fs->lmargin;
|
||||||
|
if (fs->p + pad < fs->end)
|
||||||
|
{
|
||||||
|
/* We can fit in them in the buffer by moving the
|
||||||
|
buffer text up and filling in the beginning. */
|
||||||
|
memmove (buf + pad, buf, fs->p - buf);
|
||||||
|
fs->p += pad; /* Compensate for bigger buffer. */
|
||||||
|
memset (buf, ' ', pad); /* Fill in the spaces. */
|
||||||
|
buf += pad; /* Don't bother searching them. */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* No buffer space for spaces. Must flush. */
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < pad; i++)
|
||||||
|
{
|
||||||
|
#ifdef USE_IN_LIBIO
|
||||||
|
if (_IO_fwide (fs->stream, 0) > 0)
|
||||||
|
putwc_unlocked (L' ', fs->stream);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
putc_unlocked (' ', fs->stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fs->point_col = pad;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = fs->p - buf;
|
||||||
|
nl = memchr (buf, '\n', len);
|
||||||
|
|
||||||
|
if (fs->point_col < 0)
|
||||||
|
fs->point_col = 0;
|
||||||
|
|
||||||
|
if (!nl)
|
||||||
|
{
|
||||||
|
/* The buffer ends in a partial line. */
|
||||||
|
|
||||||
|
if (fs->point_col + len < fs->rmargin)
|
||||||
|
{
|
||||||
|
/* The remaining buffer text is a partial line and fits
|
||||||
|
within the maximum line width. Advance point for the
|
||||||
|
characters to be written and stop scanning. */
|
||||||
|
fs->point_col += len;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* Set the end-of-line pointer for the code below to
|
||||||
|
the end of the buffer. */
|
||||||
|
nl = fs->p;
|
||||||
|
}
|
||||||
|
else if (fs->point_col + (nl - buf) < (ssize_t) fs->rmargin)
|
||||||
|
{
|
||||||
|
/* The buffer contains a full line that fits within the maximum
|
||||||
|
line width. Reset point and scan the next line. */
|
||||||
|
fs->point_col = 0;
|
||||||
|
buf = nl + 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This line is too long. */
|
||||||
|
r = fs->rmargin - 1;
|
||||||
|
|
||||||
|
if (fs->wmargin < 0)
|
||||||
|
{
|
||||||
|
/* Truncate the line by overwriting the excess with the
|
||||||
|
newline and anything after it in the buffer. */
|
||||||
|
if (nl < fs->p)
|
||||||
|
{
|
||||||
|
memmove (buf + (r - fs->point_col), nl, fs->p - nl);
|
||||||
|
fs->p -= buf + (r - fs->point_col) - nl;
|
||||||
|
/* Reset point for the next line and start scanning it. */
|
||||||
|
fs->point_col = 0;
|
||||||
|
buf += r + 1; /* Skip full line plus \n. */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The buffer ends with a partial line that is beyond the
|
||||||
|
maximum line width. Advance point for the characters
|
||||||
|
written, and discard those past the max from the buffer. */
|
||||||
|
fs->point_col += len;
|
||||||
|
fs->p -= fs->point_col - r;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Do word wrap. Go to the column just past the maximum line
|
||||||
|
width and scan back for the beginning of the word there.
|
||||||
|
Then insert a line break. */
|
||||||
|
|
||||||
|
char *p, *nextline;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
p = buf + (r + 1 - fs->point_col);
|
||||||
|
while (p >= buf && !isblank ((unsigned char) *p))
|
||||||
|
--p;
|
||||||
|
nextline = p + 1; /* This will begin the next line. */
|
||||||
|
|
||||||
|
if (nextline > buf)
|
||||||
|
{
|
||||||
|
/* Swallow separating blanks. */
|
||||||
|
if (p >= buf)
|
||||||
|
do
|
||||||
|
--p;
|
||||||
|
while (p >= buf && isblank ((unsigned char) *p));
|
||||||
|
nl = p + 1; /* The newline will replace the first blank. */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* A single word that is greater than the maximum line width.
|
||||||
|
Oh well. Put it on an overlong line by itself. */
|
||||||
|
p = buf + (r + 1 - fs->point_col);
|
||||||
|
/* Find the end of the long word. */
|
||||||
|
if (p < nl)
|
||||||
|
do
|
||||||
|
++p;
|
||||||
|
while (p < nl && !isblank ((unsigned char) *p));
|
||||||
|
if (p == nl)
|
||||||
|
{
|
||||||
|
/* It already ends a line. No fussing required. */
|
||||||
|
fs->point_col = 0;
|
||||||
|
buf = nl + 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* We will move the newline to replace the first blank. */
|
||||||
|
nl = p;
|
||||||
|
/* Swallow separating blanks. */
|
||||||
|
do
|
||||||
|
++p;
|
||||||
|
while (isblank ((unsigned char) *p));
|
||||||
|
/* The next line will start here. */
|
||||||
|
nextline = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Note: There are a bunch of tests below for
|
||||||
|
NEXTLINE == BUF + LEN + 1; this case is where NL happens to fall
|
||||||
|
at the end of the buffer, and NEXTLINE is in fact empty (and so
|
||||||
|
we need not be careful to maintain its contents). */
|
||||||
|
|
||||||
|
if ((nextline == buf + len + 1
|
||||||
|
? fs->end - nl < fs->wmargin + 1
|
||||||
|
: nextline - (nl + 1) < fs->wmargin)
|
||||||
|
&& fs->p > nextline)
|
||||||
|
{
|
||||||
|
/* The margin needs more blanks than we removed. */
|
||||||
|
if (fs->end - fs->p > fs->wmargin + 1)
|
||||||
|
/* Make some space for them. */
|
||||||
|
{
|
||||||
|
size_t mv = fs->p - nextline;
|
||||||
|
memmove (nl + 1 + fs->wmargin, nextline, mv);
|
||||||
|
nextline = nl + 1 + fs->wmargin;
|
||||||
|
len = nextline + mv - buf;
|
||||||
|
*nl++ = '\n';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* Output the first line so we can use the space. */
|
||||||
|
{
|
||||||
|
#ifdef _LIBC
|
||||||
|
__fxprintf (fs->stream, "%.*s\n",
|
||||||
|
(int) (nl - fs->buf), fs->buf);
|
||||||
|
#else
|
||||||
|
if (nl > fs->buf)
|
||||||
|
fwrite_unlocked (fs->buf, 1, nl - fs->buf, fs->stream);
|
||||||
|
putc_unlocked ('\n', fs->stream);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
len += buf - fs->buf;
|
||||||
|
nl = buf = fs->buf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* We can fit the newline and blanks in before
|
||||||
|
the next word. */
|
||||||
|
*nl++ = '\n';
|
||||||
|
|
||||||
|
if (nextline - nl >= fs->wmargin
|
||||||
|
|| (nextline == buf + len + 1 && fs->end - nextline >= fs->wmargin))
|
||||||
|
/* Add blanks up to the wrap margin column. */
|
||||||
|
for (i = 0; i < fs->wmargin; ++i)
|
||||||
|
*nl++ = ' ';
|
||||||
|
else
|
||||||
|
for (i = 0; i < fs->wmargin; ++i)
|
||||||
|
#ifdef USE_IN_LIBIO
|
||||||
|
if (_IO_fwide (fs->stream, 0) > 0)
|
||||||
|
putwc_unlocked (L' ', fs->stream);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
putc_unlocked (' ', fs->stream);
|
||||||
|
|
||||||
|
/* Copy the tail of the original buffer into the current buffer
|
||||||
|
position. */
|
||||||
|
if (nl < nextline)
|
||||||
|
memmove (nl, nextline, buf + len - nextline);
|
||||||
|
len -= nextline - buf;
|
||||||
|
|
||||||
|
/* Continue the scan on the remaining lines in the buffer. */
|
||||||
|
buf = nl;
|
||||||
|
|
||||||
|
/* Restore bufp to include all the remaining text. */
|
||||||
|
fs->p = nl + len;
|
||||||
|
|
||||||
|
/* Reset the counter of what has been output this line. If wmargin
|
||||||
|
is 0, we want to avoid the lmargin getting added, so we set
|
||||||
|
point_col to a magic value of -1 in that case. */
|
||||||
|
fs->point_col = fs->wmargin ? fs->wmargin : -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember that we've scanned as far as the end of the buffer. */
|
||||||
|
fs->point_offs = fs->p - fs->buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ensure that FS has space for AMOUNT more bytes in its buffer, either by
|
||||||
|
growing the buffer, or by flushing it. True is returned iff we succeed. */
|
||||||
|
int
|
||||||
|
__argp_fmtstream_ensure (struct argp_fmtstream *fs, size_t amount)
|
||||||
|
{
|
||||||
|
if ((size_t) (fs->end - fs->p) < amount)
|
||||||
|
{
|
||||||
|
ssize_t wrote;
|
||||||
|
|
||||||
|
/* Flush FS's buffer. */
|
||||||
|
__argp_fmtstream_update (fs);
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
__fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf);
|
||||||
|
wrote = fs->p - fs->buf;
|
||||||
|
#else
|
||||||
|
wrote = fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream);
|
||||||
|
#endif
|
||||||
|
if (wrote == fs->p - fs->buf)
|
||||||
|
{
|
||||||
|
fs->p = fs->buf;
|
||||||
|
fs->point_offs = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fs->p -= wrote;
|
||||||
|
fs->point_offs -= wrote;
|
||||||
|
memmove (fs->buf, fs->buf + wrote, fs->p - fs->buf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((size_t) (fs->end - fs->buf) < amount)
|
||||||
|
/* Gotta grow the buffer. */
|
||||||
|
{
|
||||||
|
size_t old_size = fs->end - fs->buf;
|
||||||
|
size_t new_size = old_size + amount;
|
||||||
|
char *new_buf;
|
||||||
|
|
||||||
|
if (new_size < old_size || ! (new_buf = realloc (fs->buf, new_size)))
|
||||||
|
{
|
||||||
|
__set_errno (ENOMEM);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fs->buf = new_buf;
|
||||||
|
fs->end = new_buf + new_size;
|
||||||
|
fs->p = fs->buf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
__argp_fmtstream_printf (struct argp_fmtstream *fs, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
int out;
|
||||||
|
size_t avail;
|
||||||
|
size_t size_guess = PRINTF_SIZE_GUESS; /* How much space to reserve. */
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
if (! __argp_fmtstream_ensure (fs, size_guess))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
va_start (args, fmt);
|
||||||
|
avail = fs->end - fs->p;
|
||||||
|
out = __vsnprintf (fs->p, avail, fmt, args);
|
||||||
|
va_end (args);
|
||||||
|
if ((size_t) out >= avail)
|
||||||
|
size_guess = out + 1;
|
||||||
|
}
|
||||||
|
while ((size_t) out >= avail);
|
||||||
|
|
||||||
|
fs->p += out;
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
/* Not exported. */
|
||||||
|
#ifdef weak_alias
|
||||||
|
weak_alias (__argp_fmtstream_printf, argp_fmtstream_printf)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !ARGP_FMTSTREAM_USE_LINEWRAP */
|
||||||
354
lib/argp-fmtstream.h
Normal file
354
lib/argp-fmtstream.h
Normal file
|
|
@ -0,0 +1,354 @@
|
||||||
|
/* Word-wrapping and line-truncating streams.
|
||||||
|
Copyright (C) 1997, 2006-2012 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* This package emulates glibc 'line_wrap_stream' semantics for systems that
|
||||||
|
don't have that. If the system does have it, it is just a wrapper for
|
||||||
|
that. This header file is only used internally while compiling argp, and
|
||||||
|
shouldn't be installed. */
|
||||||
|
|
||||||
|
#ifndef _ARGP_FMTSTREAM_H
|
||||||
|
#define _ARGP_FMTSTREAM_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||||
|
The __-protected variants of the attributes 'format' and 'printf' are
|
||||||
|
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
||||||
|
We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
|
||||||
|
gnulib and libintl do '#define printf __printf__' when they override
|
||||||
|
the 'printf' function. */
|
||||||
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (_LIBC - 0 && !defined (USE_IN_LIBIO)) \
|
||||||
|
|| (defined (__GNU_LIBRARY__) && defined (HAVE_LINEWRAP_H))
|
||||||
|
/* line_wrap_stream is available, so use that. */
|
||||||
|
#define ARGP_FMTSTREAM_USE_LINEWRAP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARGP_FMTSTREAM_USE_LINEWRAP
|
||||||
|
/* Just be a simple wrapper for line_wrap_stream; the semantics are
|
||||||
|
*slightly* different, as line_wrap_stream doesn't actually make a new
|
||||||
|
object, it just modifies the given stream (reversibly) to do
|
||||||
|
line-wrapping. Since we control who uses this code, it doesn't matter. */
|
||||||
|
|
||||||
|
#include <linewrap.h>
|
||||||
|
|
||||||
|
typedef FILE *argp_fmtstream_t;
|
||||||
|
|
||||||
|
#define argp_make_fmtstream line_wrap_stream
|
||||||
|
#define __argp_make_fmtstream line_wrap_stream
|
||||||
|
#define argp_fmtstream_free line_unwrap_stream
|
||||||
|
#define __argp_fmtstream_free line_unwrap_stream
|
||||||
|
|
||||||
|
#define __argp_fmtstream_putc(fs,ch) putc(ch,fs)
|
||||||
|
#define argp_fmtstream_putc(fs,ch) putc(ch,fs)
|
||||||
|
#define __argp_fmtstream_puts(fs,str) fputs(str,fs)
|
||||||
|
#define argp_fmtstream_puts(fs,str) fputs(str,fs)
|
||||||
|
#define __argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs)
|
||||||
|
#define argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs)
|
||||||
|
#define __argp_fmtstream_printf fprintf
|
||||||
|
#define argp_fmtstream_printf fprintf
|
||||||
|
|
||||||
|
#define __argp_fmtstream_lmargin line_wrap_lmargin
|
||||||
|
#define argp_fmtstream_lmargin line_wrap_lmargin
|
||||||
|
#define __argp_fmtstream_set_lmargin line_wrap_set_lmargin
|
||||||
|
#define argp_fmtstream_set_lmargin line_wrap_set_lmargin
|
||||||
|
#define __argp_fmtstream_rmargin line_wrap_rmargin
|
||||||
|
#define argp_fmtstream_rmargin line_wrap_rmargin
|
||||||
|
#define __argp_fmtstream_set_rmargin line_wrap_set_rmargin
|
||||||
|
#define argp_fmtstream_set_rmargin line_wrap_set_rmargin
|
||||||
|
#define __argp_fmtstream_wmargin line_wrap_wmargin
|
||||||
|
#define argp_fmtstream_wmargin line_wrap_wmargin
|
||||||
|
#define __argp_fmtstream_set_wmargin line_wrap_set_wmargin
|
||||||
|
#define argp_fmtstream_set_wmargin line_wrap_set_wmargin
|
||||||
|
#define __argp_fmtstream_point line_wrap_point
|
||||||
|
#define argp_fmtstream_point line_wrap_point
|
||||||
|
|
||||||
|
#else /* !ARGP_FMTSTREAM_USE_LINEWRAP */
|
||||||
|
/* Guess we have to define our own version. */
|
||||||
|
|
||||||
|
struct argp_fmtstream
|
||||||
|
{
|
||||||
|
FILE *stream; /* The stream we're outputting to. */
|
||||||
|
|
||||||
|
size_t lmargin, rmargin; /* Left and right margins. */
|
||||||
|
ssize_t wmargin; /* Margin to wrap to, or -1 to truncate. */
|
||||||
|
|
||||||
|
/* Point in buffer to which we've processed for wrapping, but not output. */
|
||||||
|
size_t point_offs;
|
||||||
|
/* Output column at POINT_OFFS, or -1 meaning 0 but don't add lmargin. */
|
||||||
|
ssize_t point_col;
|
||||||
|
|
||||||
|
char *buf; /* Output buffer. */
|
||||||
|
char *p; /* Current end of text in BUF. */
|
||||||
|
char *end; /* Absolute end of BUF. */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct argp_fmtstream *argp_fmtstream_t;
|
||||||
|
|
||||||
|
/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines
|
||||||
|
written on it with LMARGIN spaces and limits them to RMARGIN columns
|
||||||
|
total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by
|
||||||
|
replacing the whitespace before them with a newline and WMARGIN spaces.
|
||||||
|
Otherwise, chars beyond RMARGIN are simply dropped until a newline.
|
||||||
|
Returns NULL if there was an error. */
|
||||||
|
extern argp_fmtstream_t __argp_make_fmtstream (FILE *__stream,
|
||||||
|
size_t __lmargin,
|
||||||
|
size_t __rmargin,
|
||||||
|
ssize_t __wmargin);
|
||||||
|
extern argp_fmtstream_t argp_make_fmtstream (FILE *__stream,
|
||||||
|
size_t __lmargin,
|
||||||
|
size_t __rmargin,
|
||||||
|
ssize_t __wmargin);
|
||||||
|
|
||||||
|
/* Flush __FS to its stream, and free it (but don't close the stream). */
|
||||||
|
extern void __argp_fmtstream_free (argp_fmtstream_t __fs);
|
||||||
|
extern void argp_fmtstream_free (argp_fmtstream_t __fs);
|
||||||
|
|
||||||
|
extern ssize_t __argp_fmtstream_printf (argp_fmtstream_t __fs,
|
||||||
|
const char *__fmt, ...)
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((printf, 2, 3));
|
||||||
|
extern ssize_t argp_fmtstream_printf (argp_fmtstream_t __fs,
|
||||||
|
const char *__fmt, ...)
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((printf, 2, 3));
|
||||||
|
|
||||||
|
#if _LIBC || !defined __OPTIMIZE__
|
||||||
|
extern int __argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
|
||||||
|
extern int argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
|
||||||
|
|
||||||
|
extern int __argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str);
|
||||||
|
extern int argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str);
|
||||||
|
|
||||||
|
extern size_t __argp_fmtstream_write (argp_fmtstream_t __fs,
|
||||||
|
const char *__str, size_t __len);
|
||||||
|
extern size_t argp_fmtstream_write (argp_fmtstream_t __fs,
|
||||||
|
const char *__str, size_t __len);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Access macros for various bits of state. */
|
||||||
|
#define argp_fmtstream_lmargin(__fs) ((__fs)->lmargin)
|
||||||
|
#define argp_fmtstream_rmargin(__fs) ((__fs)->rmargin)
|
||||||
|
#define argp_fmtstream_wmargin(__fs) ((__fs)->wmargin)
|
||||||
|
#define __argp_fmtstream_lmargin argp_fmtstream_lmargin
|
||||||
|
#define __argp_fmtstream_rmargin argp_fmtstream_rmargin
|
||||||
|
#define __argp_fmtstream_wmargin argp_fmtstream_wmargin
|
||||||
|
|
||||||
|
#if _LIBC || !defined __OPTIMIZE__
|
||||||
|
/* Set __FS's left margin to LMARGIN and return the old value. */
|
||||||
|
extern size_t argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,
|
||||||
|
size_t __lmargin);
|
||||||
|
extern size_t __argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,
|
||||||
|
size_t __lmargin);
|
||||||
|
|
||||||
|
/* Set __FS's right margin to __RMARGIN and return the old value. */
|
||||||
|
extern size_t argp_fmtstream_set_rmargin (argp_fmtstream_t __fs,
|
||||||
|
size_t __rmargin);
|
||||||
|
extern size_t __argp_fmtstream_set_rmargin (argp_fmtstream_t __fs,
|
||||||
|
size_t __rmargin);
|
||||||
|
|
||||||
|
/* Set __FS's wrap margin to __WMARGIN and return the old value. */
|
||||||
|
extern size_t argp_fmtstream_set_wmargin (argp_fmtstream_t __fs,
|
||||||
|
size_t __wmargin);
|
||||||
|
extern size_t __argp_fmtstream_set_wmargin (argp_fmtstream_t __fs,
|
||||||
|
size_t __wmargin);
|
||||||
|
|
||||||
|
/* Return the column number of the current output point in __FS. */
|
||||||
|
extern size_t argp_fmtstream_point (argp_fmtstream_t __fs);
|
||||||
|
extern size_t __argp_fmtstream_point (argp_fmtstream_t __fs);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Internal routines. */
|
||||||
|
extern void _argp_fmtstream_update (argp_fmtstream_t __fs);
|
||||||
|
extern void __argp_fmtstream_update (argp_fmtstream_t __fs);
|
||||||
|
extern int _argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
|
||||||
|
extern int __argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
|
||||||
|
|
||||||
|
#ifdef __OPTIMIZE__
|
||||||
|
/* Inline versions of above routines. */
|
||||||
|
|
||||||
|
#if !_LIBC
|
||||||
|
#define __argp_fmtstream_putc argp_fmtstream_putc
|
||||||
|
#define __argp_fmtstream_puts argp_fmtstream_puts
|
||||||
|
#define __argp_fmtstream_write argp_fmtstream_write
|
||||||
|
#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin
|
||||||
|
#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin
|
||||||
|
#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin
|
||||||
|
#define __argp_fmtstream_point argp_fmtstream_point
|
||||||
|
#define __argp_fmtstream_update _argp_fmtstream_update
|
||||||
|
#define __argp_fmtstream_ensure _argp_fmtstream_ensure
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ARGP_FS_EI
|
||||||
|
# ifdef __GNUC__
|
||||||
|
/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
|
||||||
|
inline semantics, unless -fgnu89-inline is used. It defines a macro
|
||||||
|
__GNUC_STDC_INLINE__ to indicate this situation or a macro
|
||||||
|
__GNUC_GNU_INLINE__ to indicate the opposite situation.
|
||||||
|
|
||||||
|
GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline
|
||||||
|
semantics but warns, unless -fgnu89-inline is used:
|
||||||
|
warning: C99 inline functions are not supported; using GNU89
|
||||||
|
warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute
|
||||||
|
It defines a macro __GNUC_GNU_INLINE__ to indicate this situation.
|
||||||
|
|
||||||
|
Whereas Apple GCC 4.0.1 build 5479 without -std=c99 or -std=gnu99
|
||||||
|
implements the GNU C inline semantics and defines the macro
|
||||||
|
__GNUC_GNU_INLINE__, but it does not warn and does not support
|
||||||
|
__attribute__ ((__gnu_inline__)).
|
||||||
|
|
||||||
|
All in all, these are the possible combinations. For every compiler,
|
||||||
|
we need to choose ARGP_FS_EI so that the corresponding table cell
|
||||||
|
contains an "ok".
|
||||||
|
|
||||||
|
\ ARGP_FS_EI inline extern extern
|
||||||
|
\ inline inline
|
||||||
|
CC \ __attribute__
|
||||||
|
((gnu_inline))
|
||||||
|
|
||||||
|
gcc 4.3.0 error ok ok
|
||||||
|
gcc 4.3.0 -std=gnu99 -fgnu89-inline error ok ok
|
||||||
|
gcc 4.3.0 -std=gnu99 ok error ok
|
||||||
|
|
||||||
|
gcc 4.2.2 error ok ok
|
||||||
|
gcc 4.2.2 -std=gnu99 -fgnu89-inline error ok ok
|
||||||
|
gcc 4.2.2 -std=gnu99 error warning ok
|
||||||
|
|
||||||
|
gcc 4.1.2 error ok warning
|
||||||
|
gcc 4.1.2 -std=gnu99 error ok warning
|
||||||
|
|
||||||
|
Apple gcc 4.0.1 error ok warning
|
||||||
|
Apple gcc 4.0.1 -std=gnu99 ok error warning
|
||||||
|
*/
|
||||||
|
# if defined __GNUC_STDC_INLINE__
|
||||||
|
# define ARGP_FS_EI inline
|
||||||
|
# elif __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)
|
||||||
|
# define ARGP_FS_EI extern inline __attribute__ ((__gnu_inline__))
|
||||||
|
# else
|
||||||
|
# define ARGP_FS_EI extern inline
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
/* With other compilers, assume the ISO C99 meaning of 'inline', if
|
||||||
|
the compiler supports 'inline' at all. */
|
||||||
|
# define ARGP_FS_EI inline
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ARGP_FS_EI size_t
|
||||||
|
__argp_fmtstream_write (argp_fmtstream_t __fs,
|
||||||
|
const char *__str, size_t __len)
|
||||||
|
{
|
||||||
|
if (__fs->p + __len <= __fs->end || __argp_fmtstream_ensure (__fs, __len))
|
||||||
|
{
|
||||||
|
memcpy (__fs->p, __str, __len);
|
||||||
|
__fs->p += __len;
|
||||||
|
return __len;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ARGP_FS_EI int
|
||||||
|
__argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str)
|
||||||
|
{
|
||||||
|
size_t __len = strlen (__str);
|
||||||
|
if (__len)
|
||||||
|
{
|
||||||
|
size_t __wrote = __argp_fmtstream_write (__fs, __str, __len);
|
||||||
|
return __wrote == __len ? 0 : -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ARGP_FS_EI int
|
||||||
|
__argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch)
|
||||||
|
{
|
||||||
|
if (__fs->p < __fs->end || __argp_fmtstream_ensure (__fs, 1))
|
||||||
|
return *__fs->p++ = __ch;
|
||||||
|
else
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set __FS's left margin to __LMARGIN and return the old value. */
|
||||||
|
ARGP_FS_EI size_t
|
||||||
|
__argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, size_t __lmargin)
|
||||||
|
{
|
||||||
|
size_t __old;
|
||||||
|
if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
|
||||||
|
__argp_fmtstream_update (__fs);
|
||||||
|
__old = __fs->lmargin;
|
||||||
|
__fs->lmargin = __lmargin;
|
||||||
|
return __old;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set __FS's right margin to __RMARGIN and return the old value. */
|
||||||
|
ARGP_FS_EI size_t
|
||||||
|
__argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, size_t __rmargin)
|
||||||
|
{
|
||||||
|
size_t __old;
|
||||||
|
if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
|
||||||
|
__argp_fmtstream_update (__fs);
|
||||||
|
__old = __fs->rmargin;
|
||||||
|
__fs->rmargin = __rmargin;
|
||||||
|
return __old;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set FS's wrap margin to __WMARGIN and return the old value. */
|
||||||
|
ARGP_FS_EI size_t
|
||||||
|
__argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, size_t __wmargin)
|
||||||
|
{
|
||||||
|
size_t __old;
|
||||||
|
if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
|
||||||
|
__argp_fmtstream_update (__fs);
|
||||||
|
__old = __fs->wmargin;
|
||||||
|
__fs->wmargin = __wmargin;
|
||||||
|
return __old;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the column number of the current output point in __FS. */
|
||||||
|
ARGP_FS_EI size_t
|
||||||
|
__argp_fmtstream_point (argp_fmtstream_t __fs)
|
||||||
|
{
|
||||||
|
if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
|
||||||
|
__argp_fmtstream_update (__fs);
|
||||||
|
return __fs->point_col >= 0 ? __fs->point_col : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !_LIBC
|
||||||
|
#undef __argp_fmtstream_putc
|
||||||
|
#undef __argp_fmtstream_puts
|
||||||
|
#undef __argp_fmtstream_write
|
||||||
|
#undef __argp_fmtstream_set_lmargin
|
||||||
|
#undef __argp_fmtstream_set_rmargin
|
||||||
|
#undef __argp_fmtstream_set_wmargin
|
||||||
|
#undef __argp_fmtstream_point
|
||||||
|
#undef __argp_fmtstream_update
|
||||||
|
#undef __argp_fmtstream_ensure
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __OPTIMIZE__ */
|
||||||
|
|
||||||
|
#endif /* ARGP_FMTSTREAM_USE_LINEWRAP */
|
||||||
|
|
||||||
|
#endif /* argp-fmtstream.h */
|
||||||
42
lib/argp-fs-xinl.c
Normal file
42
lib/argp-fs-xinl.c
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
/* Real definitions for extern inline functions in argp-fmtstream.h
|
||||||
|
Copyright (C) 1997, 2003-2004, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ARGP_FS_EI
|
||||||
|
#undef __OPTIMIZE__
|
||||||
|
#define __OPTIMIZE__ 1
|
||||||
|
#include "argp-fmtstream.h"
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Not exported. */
|
||||||
|
/* Add weak aliases. */
|
||||||
|
#if _LIBC - 0 && !defined (ARGP_FMTSTREAM_USE_LINEWRAP) && defined (weak_alias)
|
||||||
|
|
||||||
|
weak_alias (__argp_fmtstream_putc, argp_fmtstream_putc)
|
||||||
|
weak_alias (__argp_fmtstream_puts, argp_fmtstream_puts)
|
||||||
|
weak_alias (__argp_fmtstream_write, argp_fmtstream_write)
|
||||||
|
weak_alias (__argp_fmtstream_set_lmargin, argp_fmtstream_set_lmargin)
|
||||||
|
weak_alias (__argp_fmtstream_set_rmargin, argp_fmtstream_set_rmargin)
|
||||||
|
weak_alias (__argp_fmtstream_set_wmargin, argp_fmtstream_set_wmargin)
|
||||||
|
weak_alias (__argp_fmtstream_point, argp_fmtstream_point)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
1955
lib/argp-help.c
Normal file
1955
lib/argp-help.c
Normal file
File diff suppressed because it is too large
Load diff
157
lib/argp-namefrob.h
Normal file
157
lib/argp-namefrob.h
Normal file
|
|
@ -0,0 +1,157 @@
|
||||||
|
/* Name frobnication for compiling argp outside of glibc
|
||||||
|
Copyright (C) 1997, 2003, 2007, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#if !_LIBC
|
||||||
|
/* This code is written for inclusion in gnu-libc, and uses names in the
|
||||||
|
namespace reserved for libc. If we're not compiling in libc, define those
|
||||||
|
names to be the normal ones instead. */
|
||||||
|
|
||||||
|
/* argp-parse functions */
|
||||||
|
#undef __argp_parse
|
||||||
|
#define __argp_parse argp_parse
|
||||||
|
#undef __option_is_end
|
||||||
|
#define __option_is_end _option_is_end
|
||||||
|
#undef __option_is_short
|
||||||
|
#define __option_is_short _option_is_short
|
||||||
|
#undef __argp_input
|
||||||
|
#define __argp_input _argp_input
|
||||||
|
|
||||||
|
/* argp-help functions */
|
||||||
|
#undef __argp_help
|
||||||
|
#define __argp_help argp_help
|
||||||
|
#undef __argp_error
|
||||||
|
#define __argp_error argp_error
|
||||||
|
#undef __argp_failure
|
||||||
|
#define __argp_failure argp_failure
|
||||||
|
#undef __argp_state_help
|
||||||
|
#define __argp_state_help argp_state_help
|
||||||
|
#undef __argp_usage
|
||||||
|
#define __argp_usage argp_usage
|
||||||
|
|
||||||
|
/* argp-fmtstream functions */
|
||||||
|
#undef __argp_make_fmtstream
|
||||||
|
#define __argp_make_fmtstream argp_make_fmtstream
|
||||||
|
#undef __argp_fmtstream_free
|
||||||
|
#define __argp_fmtstream_free argp_fmtstream_free
|
||||||
|
#undef __argp_fmtstream_putc
|
||||||
|
#define __argp_fmtstream_putc argp_fmtstream_putc
|
||||||
|
#undef __argp_fmtstream_puts
|
||||||
|
#define __argp_fmtstream_puts argp_fmtstream_puts
|
||||||
|
#undef __argp_fmtstream_write
|
||||||
|
#define __argp_fmtstream_write argp_fmtstream_write
|
||||||
|
#undef __argp_fmtstream_printf
|
||||||
|
#define __argp_fmtstream_printf argp_fmtstream_printf
|
||||||
|
#undef __argp_fmtstream_set_lmargin
|
||||||
|
#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin
|
||||||
|
#undef __argp_fmtstream_set_rmargin
|
||||||
|
#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin
|
||||||
|
#undef __argp_fmtstream_set_wmargin
|
||||||
|
#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin
|
||||||
|
#undef __argp_fmtstream_point
|
||||||
|
#define __argp_fmtstream_point argp_fmtstream_point
|
||||||
|
#undef __argp_fmtstream_update
|
||||||
|
#define __argp_fmtstream_update _argp_fmtstream_update
|
||||||
|
#undef __argp_fmtstream_ensure
|
||||||
|
#define __argp_fmtstream_ensure _argp_fmtstream_ensure
|
||||||
|
#undef __argp_fmtstream_lmargin
|
||||||
|
#define __argp_fmtstream_lmargin argp_fmtstream_lmargin
|
||||||
|
#undef __argp_fmtstream_rmargin
|
||||||
|
#define __argp_fmtstream_rmargin argp_fmtstream_rmargin
|
||||||
|
#undef __argp_fmtstream_wmargin
|
||||||
|
#define __argp_fmtstream_wmargin argp_fmtstream_wmargin
|
||||||
|
|
||||||
|
/* normal libc functions we call */
|
||||||
|
#undef __flockfile
|
||||||
|
#define __flockfile flockfile
|
||||||
|
#undef __funlockfile
|
||||||
|
#define __funlockfile funlockfile
|
||||||
|
#undef __mempcpy
|
||||||
|
#define __mempcpy mempcpy
|
||||||
|
#undef __sleep
|
||||||
|
#define __sleep sleep
|
||||||
|
#undef __strcasecmp
|
||||||
|
#define __strcasecmp strcasecmp
|
||||||
|
#undef __strchrnul
|
||||||
|
#define __strchrnul strchrnul
|
||||||
|
#undef __strerror_r
|
||||||
|
#define __strerror_r strerror_r
|
||||||
|
#undef __strndup
|
||||||
|
#define __strndup strndup
|
||||||
|
#undef __vsnprintf
|
||||||
|
#define __vsnprintf vsnprintf
|
||||||
|
|
||||||
|
#if defined(HAVE_DECL_CLEARERR_UNLOCKED) && !HAVE_DECL_CLEARERR_UNLOCKED
|
||||||
|
# define clearerr_unlocked(x) clearerr (x)
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED
|
||||||
|
# define feof_unlocked(x) feof (x)
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED
|
||||||
|
# define ferror_unlocked(x) ferror (x)
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED
|
||||||
|
# define fflush_unlocked(x) fflush (x)
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED
|
||||||
|
# define fgets_unlocked(x,y,z) fgets (x,y,z)
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_DECL_FPUTC_UNLOCKED) && !HAVE_DECL_FPUTC_UNLOCKED
|
||||||
|
# define fputc_unlocked(x,y) fputc (x,y)
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED
|
||||||
|
# define fputs_unlocked(x,y) fputs (x,y)
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED
|
||||||
|
# define fread_unlocked(w,x,y,z) fread (w,x,y,z)
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED
|
||||||
|
# define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z)
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_DECL_GETC_UNLOCKED) && !HAVE_DECL_GETC_UNLOCKED
|
||||||
|
# define getc_unlocked(x) getc (x)
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_DECL_GETCHAR_UNLOCKED) && !HAVE_DECL_GETCHAR_UNLOCKED
|
||||||
|
# define getchar_unlocked() getchar ()
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_DECL_PUTC_UNLOCKED) && !HAVE_DECL_PUTC_UNLOCKED
|
||||||
|
# define putc_unlocked(x,y) putc (x,y)
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_DECL_PUTCHAR_UNLOCKED) && !HAVE_DECL_PUTCHAR_UNLOCKED
|
||||||
|
# define putchar_unlocked(x) putchar (x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !_LIBC */
|
||||||
|
|
||||||
|
#ifndef __set_errno
|
||||||
|
# define __set_errno(e) (errno = (e))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined GNULIB_ARGP_DISABLE_DIRNAME
|
||||||
|
# define __argp_base_name(arg) arg
|
||||||
|
#elif defined GNULIB_ARGP_EXTERN_BASENAME
|
||||||
|
extern char *__argp_base_name (const char *arg);
|
||||||
|
#else
|
||||||
|
# include "dirname.h"
|
||||||
|
# define __argp_base_name last_component
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
|
||||||
|
# define __argp_short_program_name() (program_invocation_short_name)
|
||||||
|
#else
|
||||||
|
extern char *__argp_short_program_name (void);
|
||||||
|
#endif
|
||||||
953
lib/argp-parse.c
Normal file
953
lib/argp-parse.c
Normal file
|
|
@ -0,0 +1,953 @@
|
||||||
|
/* Hierarchical argument parsing, layered over getopt
|
||||||
|
Copyright (C) 1995-2000, 2002-2004, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <alloca.h>
|
||||||
|
#include <stdalign.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <getopt_int.h>
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <libintl.h>
|
||||||
|
# undef dgettext
|
||||||
|
# define dgettext(domain, msgid) \
|
||||||
|
INTUSE(__dcgettext) (domain, msgid, LC_MESSAGES)
|
||||||
|
#else
|
||||||
|
# include "gettext.h"
|
||||||
|
#endif
|
||||||
|
#define N_(msgid) msgid
|
||||||
|
|
||||||
|
#include "argp.h"
|
||||||
|
#include "argp-namefrob.h"
|
||||||
|
|
||||||
|
#define alignto(n, d) ((((n) + (d) - 1) / (d)) * (d))
|
||||||
|
|
||||||
|
/* Getopt return values. */
|
||||||
|
#define KEY_END (-1) /* The end of the options. */
|
||||||
|
#define KEY_ARG 1 /* A non-option argument. */
|
||||||
|
#define KEY_ERR '?' /* An error parsing the options. */
|
||||||
|
|
||||||
|
/* The meta-argument used to prevent any further arguments being interpreted
|
||||||
|
as options. */
|
||||||
|
#define QUOTE "--"
|
||||||
|
|
||||||
|
/* The number of bits we steal in a long-option value for our own use. */
|
||||||
|
#define GROUP_BITS CHAR_BIT
|
||||||
|
|
||||||
|
/* The number of bits available for the user value. */
|
||||||
|
#define USER_BITS ((sizeof ((struct option *)0)->val * CHAR_BIT) - GROUP_BITS)
|
||||||
|
#define USER_MASK ((1 << USER_BITS) - 1)
|
||||||
|
|
||||||
|
/* EZ alias for ARGP_ERR_UNKNOWN. */
|
||||||
|
#define EBADKEY ARGP_ERR_UNKNOWN
|
||||||
|
|
||||||
|
/* Default options. */
|
||||||
|
|
||||||
|
/* When argp is given the --HANG switch, _ARGP_HANG is set and argp will sleep
|
||||||
|
for one second intervals, decrementing _ARGP_HANG until it's zero. Thus
|
||||||
|
you can force the program to continue by attaching a debugger and setting
|
||||||
|
it to 0 yourself. */
|
||||||
|
static volatile int _argp_hang;
|
||||||
|
|
||||||
|
#define OPT_PROGNAME -2
|
||||||
|
#define OPT_USAGE -3
|
||||||
|
#define OPT_HANG -4
|
||||||
|
|
||||||
|
static const struct argp_option argp_default_options[] =
|
||||||
|
{
|
||||||
|
{"help", '?', 0, 0, N_("give this help list"), -1},
|
||||||
|
{"usage", OPT_USAGE, 0, 0, N_("give a short usage message"), 0},
|
||||||
|
{"program-name",OPT_PROGNAME,N_("NAME"), OPTION_HIDDEN, N_("set the program name"), 0},
|
||||||
|
{"HANG", OPT_HANG, N_("SECS"), OPTION_ARG_OPTIONAL | OPTION_HIDDEN,
|
||||||
|
N_("hang for SECS seconds (default 3600)"), 0},
|
||||||
|
{NULL, 0, 0, 0, NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static error_t
|
||||||
|
argp_default_parser (int key, char *arg, struct argp_state *state)
|
||||||
|
{
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case '?':
|
||||||
|
__argp_state_help (state, state->out_stream, ARGP_HELP_STD_HELP);
|
||||||
|
break;
|
||||||
|
case OPT_USAGE:
|
||||||
|
__argp_state_help (state, state->out_stream,
|
||||||
|
ARGP_HELP_USAGE | ARGP_HELP_EXIT_OK);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPT_PROGNAME: /* Set the program name. */
|
||||||
|
#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_NAME
|
||||||
|
program_invocation_name = arg;
|
||||||
|
#endif
|
||||||
|
/* [Note that some systems only have PROGRAM_INVOCATION_SHORT_NAME (aka
|
||||||
|
__PROGNAME), in which case, PROGRAM_INVOCATION_NAME is just defined
|
||||||
|
to be that, so we have to be a bit careful here.] */
|
||||||
|
|
||||||
|
/* Update what we use for messages. */
|
||||||
|
state->name = __argp_base_name (arg);
|
||||||
|
|
||||||
|
#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
|
||||||
|
program_invocation_short_name = state->name;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((state->flags & (ARGP_PARSE_ARGV0 | ARGP_NO_ERRS))
|
||||||
|
== ARGP_PARSE_ARGV0)
|
||||||
|
/* Update what getopt uses too. */
|
||||||
|
state->argv[0] = arg;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPT_HANG:
|
||||||
|
_argp_hang = atoi (arg ? arg : "3600");
|
||||||
|
while (_argp_hang-- > 0)
|
||||||
|
__sleep (1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return EBADKEY;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct argp argp_default_argp =
|
||||||
|
{argp_default_options, &argp_default_parser, NULL, NULL, NULL, NULL, "libc"};
|
||||||
|
|
||||||
|
|
||||||
|
static const struct argp_option argp_version_options[] =
|
||||||
|
{
|
||||||
|
{"version", 'V', 0, 0, N_("print program version"), -1},
|
||||||
|
{NULL, 0, 0, 0, NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static error_t
|
||||||
|
argp_version_parser (int key, char *arg, struct argp_state *state)
|
||||||
|
{
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case 'V':
|
||||||
|
if (argp_program_version_hook)
|
||||||
|
(*argp_program_version_hook) (state->out_stream, state);
|
||||||
|
else if (argp_program_version)
|
||||||
|
fprintf (state->out_stream, "%s\n", argp_program_version);
|
||||||
|
else
|
||||||
|
__argp_error (state, "%s",
|
||||||
|
dgettext (state->root_argp->argp_domain,
|
||||||
|
"(PROGRAM ERROR) No version known!?"));
|
||||||
|
if (! (state->flags & ARGP_NO_EXIT))
|
||||||
|
exit (0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return EBADKEY;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct argp argp_version_argp =
|
||||||
|
{argp_version_options, &argp_version_parser, NULL, NULL, NULL, NULL, "libc"};
|
||||||
|
|
||||||
|
/* Returns the offset into the getopt long options array LONG_OPTIONS of a
|
||||||
|
long option with called NAME, or -1 if none is found. Passing NULL as
|
||||||
|
NAME will return the number of options. */
|
||||||
|
static int
|
||||||
|
find_long_option (struct option *long_options, const char *name)
|
||||||
|
{
|
||||||
|
struct option *l = long_options;
|
||||||
|
while (l->name != NULL)
|
||||||
|
if (name != NULL && strcmp (l->name, name) == 0)
|
||||||
|
return l - long_options;
|
||||||
|
else
|
||||||
|
l++;
|
||||||
|
if (name == NULL)
|
||||||
|
return l - long_options;
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* The state of a "group" during parsing. Each group corresponds to a
|
||||||
|
particular argp structure from the tree of such descending from the top
|
||||||
|
level argp passed to argp_parse. */
|
||||||
|
struct group
|
||||||
|
{
|
||||||
|
/* This group's parsing function. */
|
||||||
|
argp_parser_t parser;
|
||||||
|
|
||||||
|
/* Which argp this group is from. */
|
||||||
|
const struct argp *argp;
|
||||||
|
|
||||||
|
/* Points to the point in SHORT_OPTS corresponding to the end of the short
|
||||||
|
options for this group. We use it to determine from which group a
|
||||||
|
particular short options is from. */
|
||||||
|
char *short_end;
|
||||||
|
|
||||||
|
/* The number of non-option args successfully handled by this parser. */
|
||||||
|
unsigned args_processed;
|
||||||
|
|
||||||
|
/* This group's parser's parent's group. */
|
||||||
|
struct group *parent;
|
||||||
|
unsigned parent_index; /* And the our position in the parent. */
|
||||||
|
|
||||||
|
/* These fields are swapped into and out of the state structure when
|
||||||
|
calling this group's parser. */
|
||||||
|
void *input, **child_inputs;
|
||||||
|
void *hook;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Call GROUP's parser with KEY and ARG, swapping any group-specific info
|
||||||
|
from STATE before calling, and back into state afterwards. If GROUP has
|
||||||
|
no parser, EBADKEY is returned. */
|
||||||
|
static error_t
|
||||||
|
group_parse (struct group *group, struct argp_state *state, int key, char *arg)
|
||||||
|
{
|
||||||
|
if (group->parser)
|
||||||
|
{
|
||||||
|
error_t err;
|
||||||
|
state->hook = group->hook;
|
||||||
|
state->input = group->input;
|
||||||
|
state->child_inputs = group->child_inputs;
|
||||||
|
state->arg_num = group->args_processed;
|
||||||
|
err = (*group->parser)(key, arg, state);
|
||||||
|
group->hook = state->hook;
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return EBADKEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct parser
|
||||||
|
{
|
||||||
|
const struct argp *argp;
|
||||||
|
|
||||||
|
/* SHORT_OPTS is the getopt short options string for the union of all the
|
||||||
|
groups of options. */
|
||||||
|
char *short_opts;
|
||||||
|
/* LONG_OPTS is the array of getop long option structures for the union of
|
||||||
|
all the groups of options. */
|
||||||
|
struct option *long_opts;
|
||||||
|
/* OPT_DATA is the getopt data used for the re-entrant getopt. */
|
||||||
|
struct _getopt_data opt_data;
|
||||||
|
|
||||||
|
/* States of the various parsing groups. */
|
||||||
|
struct group *groups;
|
||||||
|
/* The end of the GROUPS array. */
|
||||||
|
struct group *egroup;
|
||||||
|
/* A vector containing storage for the CHILD_INPUTS field in all groups. */
|
||||||
|
void **child_inputs;
|
||||||
|
|
||||||
|
/* True if we think using getopt is still useful; if false, then
|
||||||
|
remaining arguments are just passed verbatim with ARGP_KEY_ARG. This is
|
||||||
|
cleared whenever getopt returns KEY_END, but may be set again if the user
|
||||||
|
moves the next argument pointer backwards. */
|
||||||
|
int try_getopt;
|
||||||
|
|
||||||
|
/* State block supplied to parsing routines. */
|
||||||
|
struct argp_state state;
|
||||||
|
|
||||||
|
/* Memory used by this parser. */
|
||||||
|
void *storage;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The next usable entries in the various parser tables being filled in by
|
||||||
|
convert_options. */
|
||||||
|
struct parser_convert_state
|
||||||
|
{
|
||||||
|
struct parser *parser;
|
||||||
|
char *short_end;
|
||||||
|
struct option *long_end;
|
||||||
|
void **child_inputs_end;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Converts all options in ARGP (which is put in GROUP) and ancestors
|
||||||
|
into getopt options stored in SHORT_OPTS and LONG_OPTS; SHORT_END and
|
||||||
|
CVT->LONG_END are the points at which new options are added. Returns the
|
||||||
|
next unused group entry. CVT holds state used during the conversion. */
|
||||||
|
static struct group *
|
||||||
|
convert_options (const struct argp *argp,
|
||||||
|
struct group *parent, unsigned parent_index,
|
||||||
|
struct group *group, struct parser_convert_state *cvt)
|
||||||
|
{
|
||||||
|
/* REAL is the most recent non-alias value of OPT. */
|
||||||
|
const struct argp_option *real = argp->options;
|
||||||
|
const struct argp_child *children = argp->children;
|
||||||
|
|
||||||
|
if (real || argp->parser)
|
||||||
|
{
|
||||||
|
const struct argp_option *opt;
|
||||||
|
|
||||||
|
if (real)
|
||||||
|
for (opt = real; !__option_is_end (opt); opt++)
|
||||||
|
{
|
||||||
|
if (! (opt->flags & OPTION_ALIAS))
|
||||||
|
/* OPT isn't an alias, so we can use values from it. */
|
||||||
|
real = opt;
|
||||||
|
|
||||||
|
if (! (real->flags & OPTION_DOC))
|
||||||
|
/* A real option (not just documentation). */
|
||||||
|
{
|
||||||
|
if (__option_is_short (opt))
|
||||||
|
/* OPT can be used as a short option. */
|
||||||
|
{
|
||||||
|
*cvt->short_end++ = opt->key;
|
||||||
|
if (real->arg)
|
||||||
|
{
|
||||||
|
*cvt->short_end++ = ':';
|
||||||
|
if (real->flags & OPTION_ARG_OPTIONAL)
|
||||||
|
*cvt->short_end++ = ':';
|
||||||
|
}
|
||||||
|
*cvt->short_end = '\0'; /* keep 0 terminated */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt->name
|
||||||
|
&& find_long_option (cvt->parser->long_opts, opt->name) < 0)
|
||||||
|
/* OPT can be used as a long option. */
|
||||||
|
{
|
||||||
|
cvt->long_end->name = opt->name;
|
||||||
|
cvt->long_end->has_arg =
|
||||||
|
(real->arg
|
||||||
|
? (real->flags & OPTION_ARG_OPTIONAL
|
||||||
|
? optional_argument
|
||||||
|
: required_argument)
|
||||||
|
: no_argument);
|
||||||
|
cvt->long_end->flag = 0;
|
||||||
|
/* we add a disambiguating code to all the user's
|
||||||
|
values (which is removed before we actually call
|
||||||
|
the function to parse the value); this means that
|
||||||
|
the user loses use of the high 8 bits in all his
|
||||||
|
values (the sign of the lower bits is preserved
|
||||||
|
however)... */
|
||||||
|
cvt->long_end->val =
|
||||||
|
((opt->key ? opt->key : real->key) & USER_MASK)
|
||||||
|
+ (((group - cvt->parser->groups) + 1) << USER_BITS);
|
||||||
|
|
||||||
|
/* Keep the LONG_OPTS list terminated. */
|
||||||
|
(++cvt->long_end)->name = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
group->parser = argp->parser;
|
||||||
|
group->argp = argp;
|
||||||
|
group->short_end = cvt->short_end;
|
||||||
|
group->args_processed = 0;
|
||||||
|
group->parent = parent;
|
||||||
|
group->parent_index = parent_index;
|
||||||
|
group->input = 0;
|
||||||
|
group->hook = 0;
|
||||||
|
group->child_inputs = 0;
|
||||||
|
|
||||||
|
if (children)
|
||||||
|
/* Assign GROUP's CHILD_INPUTS field some space from
|
||||||
|
CVT->child_inputs_end.*/
|
||||||
|
{
|
||||||
|
unsigned num_children = 0;
|
||||||
|
while (children[num_children].argp)
|
||||||
|
num_children++;
|
||||||
|
group->child_inputs = cvt->child_inputs_end;
|
||||||
|
cvt->child_inputs_end += num_children;
|
||||||
|
}
|
||||||
|
|
||||||
|
parent = group++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
parent = 0;
|
||||||
|
|
||||||
|
if (children)
|
||||||
|
{
|
||||||
|
unsigned index = 0;
|
||||||
|
while (children->argp)
|
||||||
|
group =
|
||||||
|
convert_options (children++->argp, parent, index++, group, cvt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find the merged set of getopt options, with keys appropriately prefixed. */
|
||||||
|
static void
|
||||||
|
parser_convert (struct parser *parser, const struct argp *argp, int flags)
|
||||||
|
{
|
||||||
|
struct parser_convert_state cvt;
|
||||||
|
|
||||||
|
cvt.parser = parser;
|
||||||
|
cvt.short_end = parser->short_opts;
|
||||||
|
cvt.long_end = parser->long_opts;
|
||||||
|
cvt.child_inputs_end = parser->child_inputs;
|
||||||
|
|
||||||
|
if (flags & ARGP_IN_ORDER)
|
||||||
|
*cvt.short_end++ = '-';
|
||||||
|
else if (flags & ARGP_NO_ARGS)
|
||||||
|
*cvt.short_end++ = '+';
|
||||||
|
*cvt.short_end = '\0';
|
||||||
|
|
||||||
|
cvt.long_end->name = NULL;
|
||||||
|
|
||||||
|
parser->argp = argp;
|
||||||
|
|
||||||
|
if (argp)
|
||||||
|
parser->egroup = convert_options (argp, 0, 0, parser->groups, &cvt);
|
||||||
|
else
|
||||||
|
parser->egroup = parser->groups; /* No parsers at all! */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Lengths of various parser fields which we will allocated. */
|
||||||
|
struct parser_sizes
|
||||||
|
{
|
||||||
|
size_t short_len; /* Getopt short options string. */
|
||||||
|
size_t long_len; /* Getopt long options vector. */
|
||||||
|
size_t num_groups; /* Group structures we allocate. */
|
||||||
|
size_t num_child_inputs; /* Child input slots. */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* For ARGP, increments the NUM_GROUPS field in SZS by the total number of
|
||||||
|
argp structures descended from it, and the SHORT_LEN & LONG_LEN fields by
|
||||||
|
the maximum lengths of the resulting merged getopt short options string and
|
||||||
|
long-options array, respectively. */
|
||||||
|
static void
|
||||||
|
calc_sizes (const struct argp *argp, struct parser_sizes *szs)
|
||||||
|
{
|
||||||
|
const struct argp_child *child = argp->children;
|
||||||
|
const struct argp_option *opt = argp->options;
|
||||||
|
|
||||||
|
if (opt || argp->parser)
|
||||||
|
{
|
||||||
|
szs->num_groups++;
|
||||||
|
if (opt)
|
||||||
|
{
|
||||||
|
int num_opts = 0;
|
||||||
|
while (!__option_is_end (opt++))
|
||||||
|
num_opts++;
|
||||||
|
szs->short_len += num_opts * 3; /* opt + up to 2 ':'s */
|
||||||
|
szs->long_len += num_opts;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (child)
|
||||||
|
while (child->argp)
|
||||||
|
{
|
||||||
|
calc_sizes ((child++)->argp, szs);
|
||||||
|
szs->num_child_inputs++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initializes PARSER to parse ARGP in a manner described by FLAGS. */
|
||||||
|
static error_t
|
||||||
|
parser_init (struct parser *parser, const struct argp *argp,
|
||||||
|
int argc, char **argv, int flags, void *input)
|
||||||
|
{
|
||||||
|
error_t err = 0;
|
||||||
|
struct group *group;
|
||||||
|
struct parser_sizes szs;
|
||||||
|
struct _getopt_data opt_data = _GETOPT_DATA_INITIALIZER;
|
||||||
|
char *storage;
|
||||||
|
size_t glen, gsum;
|
||||||
|
size_t clen, csum;
|
||||||
|
size_t llen, lsum;
|
||||||
|
size_t slen, ssum;
|
||||||
|
|
||||||
|
szs.short_len = (flags & ARGP_NO_ARGS) ? 0 : 1;
|
||||||
|
szs.long_len = 0;
|
||||||
|
szs.num_groups = 0;
|
||||||
|
szs.num_child_inputs = 0;
|
||||||
|
|
||||||
|
if (argp)
|
||||||
|
calc_sizes (argp, &szs);
|
||||||
|
|
||||||
|
/* Lengths of the various bits of storage used by PARSER. */
|
||||||
|
glen = (szs.num_groups + 1) * sizeof (struct group);
|
||||||
|
clen = szs.num_child_inputs * sizeof (void *);
|
||||||
|
llen = (szs.long_len + 1) * sizeof (struct option);
|
||||||
|
slen = szs.short_len + 1;
|
||||||
|
|
||||||
|
/* Sums of previous lengths, properly aligned. There's no need to
|
||||||
|
align gsum, since struct group is aligned at least as strictly as
|
||||||
|
void * (since it contains a void * member). And there's no need
|
||||||
|
to align lsum, since struct option is aligned at least as
|
||||||
|
strictly as char. */
|
||||||
|
gsum = glen;
|
||||||
|
csum = alignto (gsum + clen, alignof (struct option));
|
||||||
|
lsum = csum + llen;
|
||||||
|
ssum = lsum + slen;
|
||||||
|
|
||||||
|
parser->storage = malloc (ssum);
|
||||||
|
if (! parser->storage)
|
||||||
|
return ENOMEM;
|
||||||
|
|
||||||
|
storage = parser->storage;
|
||||||
|
parser->groups = parser->storage;
|
||||||
|
parser->child_inputs = (void **) (storage + gsum);
|
||||||
|
parser->long_opts = (struct option *) (storage + csum);
|
||||||
|
parser->short_opts = storage + lsum;
|
||||||
|
parser->opt_data = opt_data;
|
||||||
|
|
||||||
|
memset (parser->child_inputs, 0, clen);
|
||||||
|
parser_convert (parser, argp, flags);
|
||||||
|
|
||||||
|
memset (&parser->state, 0, sizeof (struct argp_state));
|
||||||
|
parser->state.root_argp = parser->argp;
|
||||||
|
parser->state.argc = argc;
|
||||||
|
parser->state.argv = argv;
|
||||||
|
parser->state.flags = flags;
|
||||||
|
parser->state.err_stream = stderr;
|
||||||
|
parser->state.out_stream = stdout;
|
||||||
|
parser->state.next = 0; /* Tell getopt to initialize. */
|
||||||
|
parser->state.pstate = parser;
|
||||||
|
|
||||||
|
parser->try_getopt = 1;
|
||||||
|
|
||||||
|
/* Call each parser for the first time, giving it a chance to propagate
|
||||||
|
values to child parsers. */
|
||||||
|
if (parser->groups < parser->egroup)
|
||||||
|
parser->groups->input = input;
|
||||||
|
for (group = parser->groups;
|
||||||
|
group < parser->egroup && (!err || err == EBADKEY);
|
||||||
|
group++)
|
||||||
|
{
|
||||||
|
if (group->parent)
|
||||||
|
/* If a child parser, get the initial input value from the parent. */
|
||||||
|
group->input = group->parent->child_inputs[group->parent_index];
|
||||||
|
|
||||||
|
if (!group->parser
|
||||||
|
&& group->argp->children && group->argp->children->argp)
|
||||||
|
/* For the special case where no parsing function is supplied for an
|
||||||
|
argp, propagate its input to its first child, if any (this just
|
||||||
|
makes very simple wrapper argps more convenient). */
|
||||||
|
group->child_inputs[0] = group->input;
|
||||||
|
|
||||||
|
err = group_parse (group, &parser->state, ARGP_KEY_INIT, 0);
|
||||||
|
}
|
||||||
|
if (err == EBADKEY)
|
||||||
|
err = 0; /* Some parser didn't understand. */
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
if (parser->state.flags & ARGP_NO_ERRS)
|
||||||
|
{
|
||||||
|
parser->opt_data.opterr = 0;
|
||||||
|
if (parser->state.flags & ARGP_PARSE_ARGV0)
|
||||||
|
/* getopt always skips ARGV[0], so we have to fake it out. As long
|
||||||
|
as OPTERR is 0, then it shouldn't actually try to access it. */
|
||||||
|
parser->state.argv--, parser->state.argc++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
parser->opt_data.opterr = 1; /* Print error messages. */
|
||||||
|
|
||||||
|
if (parser->state.argv == argv && argv[0])
|
||||||
|
/* There's an argv[0]; use it for messages. */
|
||||||
|
parser->state.name = __argp_base_name (argv[0]);
|
||||||
|
else
|
||||||
|
parser->state.name = __argp_short_program_name ();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free any storage consumed by PARSER (but not PARSER itself). */
|
||||||
|
static error_t
|
||||||
|
parser_finalize (struct parser *parser,
|
||||||
|
error_t err, int arg_ebadkey, int *end_index)
|
||||||
|
{
|
||||||
|
struct group *group;
|
||||||
|
|
||||||
|
if (err == EBADKEY && arg_ebadkey)
|
||||||
|
/* Suppress errors generated by unparsed arguments. */
|
||||||
|
err = 0;
|
||||||
|
|
||||||
|
if (! err)
|
||||||
|
{
|
||||||
|
if (parser->state.next == parser->state.argc)
|
||||||
|
/* We successfully parsed all arguments! Call all the parsers again,
|
||||||
|
just a few more times... */
|
||||||
|
{
|
||||||
|
for (group = parser->groups;
|
||||||
|
group < parser->egroup && (!err || err==EBADKEY);
|
||||||
|
group++)
|
||||||
|
if (group->args_processed == 0)
|
||||||
|
err = group_parse (group, &parser->state, ARGP_KEY_NO_ARGS, 0);
|
||||||
|
for (group = parser->egroup - 1;
|
||||||
|
group >= parser->groups && (!err || err==EBADKEY);
|
||||||
|
group--)
|
||||||
|
err = group_parse (group, &parser->state, ARGP_KEY_END, 0);
|
||||||
|
|
||||||
|
if (err == EBADKEY)
|
||||||
|
err = 0; /* Some parser didn't understand. */
|
||||||
|
|
||||||
|
/* Tell the user that all arguments are parsed. */
|
||||||
|
if (end_index)
|
||||||
|
*end_index = parser->state.next;
|
||||||
|
}
|
||||||
|
else if (end_index)
|
||||||
|
/* Return any remaining arguments to the user. */
|
||||||
|
*end_index = parser->state.next;
|
||||||
|
else
|
||||||
|
/* No way to return the remaining arguments, they must be bogus. */
|
||||||
|
{
|
||||||
|
if (!(parser->state.flags & ARGP_NO_ERRS)
|
||||||
|
&& parser->state.err_stream)
|
||||||
|
fprintf (parser->state.err_stream,
|
||||||
|
dgettext (parser->argp->argp_domain,
|
||||||
|
"%s: Too many arguments\n"),
|
||||||
|
parser->state.name);
|
||||||
|
err = EBADKEY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Okay, we're all done, with either an error or success; call the parsers
|
||||||
|
to indicate which one. */
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
/* Maybe print an error message. */
|
||||||
|
if (err == EBADKEY)
|
||||||
|
/* An appropriate message describing what the error was should have
|
||||||
|
been printed earlier. */
|
||||||
|
__argp_state_help (&parser->state, parser->state.err_stream,
|
||||||
|
ARGP_HELP_STD_ERR);
|
||||||
|
|
||||||
|
/* Since we didn't exit, give each parser an error indication. */
|
||||||
|
for (group = parser->groups; group < parser->egroup; group++)
|
||||||
|
group_parse (group, &parser->state, ARGP_KEY_ERROR, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* Notify parsers of success, and propagate back values from parsers. */
|
||||||
|
{
|
||||||
|
/* We pass over the groups in reverse order so that child groups are
|
||||||
|
given a chance to do there processing before passing back a value to
|
||||||
|
the parent. */
|
||||||
|
for (group = parser->egroup - 1
|
||||||
|
; group >= parser->groups && (!err || err == EBADKEY)
|
||||||
|
; group--)
|
||||||
|
err = group_parse (group, &parser->state, ARGP_KEY_SUCCESS, 0);
|
||||||
|
if (err == EBADKEY)
|
||||||
|
err = 0; /* Some parser didn't understand. */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Call parsers once more, to do any final cleanup. Errors are ignored. */
|
||||||
|
for (group = parser->egroup - 1; group >= parser->groups; group--)
|
||||||
|
group_parse (group, &parser->state, ARGP_KEY_FINI, 0);
|
||||||
|
|
||||||
|
if (err == EBADKEY)
|
||||||
|
err = EINVAL;
|
||||||
|
|
||||||
|
free (parser->storage);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Call the user parsers to parse the non-option argument VAL, at the current
|
||||||
|
position, returning any error. The state NEXT pointer is assumed to have
|
||||||
|
been adjusted (by getopt) to point after this argument; this function will
|
||||||
|
adjust it correctly to reflect however many args actually end up being
|
||||||
|
consumed. */
|
||||||
|
static error_t
|
||||||
|
parser_parse_arg (struct parser *parser, char *val)
|
||||||
|
{
|
||||||
|
/* Save the starting value of NEXT, first adjusting it so that the arg
|
||||||
|
we're parsing is again the front of the arg vector. */
|
||||||
|
int index = --parser->state.next;
|
||||||
|
error_t err = EBADKEY;
|
||||||
|
struct group *group;
|
||||||
|
int key = 0; /* Which of ARGP_KEY_ARG[S] we used. */
|
||||||
|
|
||||||
|
/* Try to parse the argument in each parser. */
|
||||||
|
for (group = parser->groups
|
||||||
|
; group < parser->egroup && err == EBADKEY
|
||||||
|
; group++)
|
||||||
|
{
|
||||||
|
parser->state.next++; /* For ARGP_KEY_ARG, consume the arg. */
|
||||||
|
key = ARGP_KEY_ARG;
|
||||||
|
err = group_parse (group, &parser->state, key, val);
|
||||||
|
|
||||||
|
if (err == EBADKEY)
|
||||||
|
/* This parser doesn't like ARGP_KEY_ARG; try ARGP_KEY_ARGS instead. */
|
||||||
|
{
|
||||||
|
parser->state.next--; /* For ARGP_KEY_ARGS, put back the arg. */
|
||||||
|
key = ARGP_KEY_ARGS;
|
||||||
|
err = group_parse (group, &parser->state, key, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! err)
|
||||||
|
{
|
||||||
|
if (key == ARGP_KEY_ARGS)
|
||||||
|
/* The default for ARGP_KEY_ARGS is to assume that if NEXT isn't
|
||||||
|
changed by the user, *all* arguments should be considered
|
||||||
|
consumed. */
|
||||||
|
parser->state.next = parser->state.argc;
|
||||||
|
|
||||||
|
if (parser->state.next > index)
|
||||||
|
/* Remember that we successfully processed a non-option
|
||||||
|
argument -- but only if the user hasn't gotten tricky and set
|
||||||
|
the clock back. */
|
||||||
|
(--group)->args_processed += (parser->state.next - index);
|
||||||
|
else
|
||||||
|
/* The user wants to reparse some args, give getopt another try. */
|
||||||
|
parser->try_getopt = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Call the user parsers to parse the option OPT, with argument VAL, at the
|
||||||
|
current position, returning any error. */
|
||||||
|
static error_t
|
||||||
|
parser_parse_opt (struct parser *parser, int opt, char *val)
|
||||||
|
{
|
||||||
|
/* The group key encoded in the high bits; 0 for short opts or
|
||||||
|
group_number + 1 for long opts. */
|
||||||
|
int group_key = opt >> USER_BITS;
|
||||||
|
error_t err = EBADKEY;
|
||||||
|
|
||||||
|
if (group_key == 0)
|
||||||
|
/* A short option. By comparing OPT's position in SHORT_OPTS to the
|
||||||
|
various starting positions in each group's SHORT_END field, we can
|
||||||
|
determine which group OPT came from. */
|
||||||
|
{
|
||||||
|
struct group *group;
|
||||||
|
char *short_index = strchr (parser->short_opts, opt);
|
||||||
|
|
||||||
|
if (short_index)
|
||||||
|
for (group = parser->groups; group < parser->egroup; group++)
|
||||||
|
if (group->short_end > short_index)
|
||||||
|
{
|
||||||
|
err = group_parse (group, &parser->state, opt,
|
||||||
|
parser->opt_data.optarg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* A long option. We use shifts instead of masking for extracting
|
||||||
|
the user value in order to preserve the sign. */
|
||||||
|
err =
|
||||||
|
group_parse (&parser->groups[group_key - 1], &parser->state,
|
||||||
|
(opt << GROUP_BITS) >> GROUP_BITS,
|
||||||
|
parser->opt_data.optarg);
|
||||||
|
|
||||||
|
if (err == EBADKEY)
|
||||||
|
/* At least currently, an option not recognized is an error in the
|
||||||
|
parser, because we pre-compute which parser is supposed to deal
|
||||||
|
with each option. */
|
||||||
|
{
|
||||||
|
static const char bad_key_err[] =
|
||||||
|
N_("(PROGRAM ERROR) Option should have been recognized!?");
|
||||||
|
if (group_key == 0)
|
||||||
|
__argp_error (&parser->state, "-%c: %s", opt,
|
||||||
|
dgettext (parser->argp->argp_domain, bad_key_err));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct option *long_opt = parser->long_opts;
|
||||||
|
while (long_opt->val != opt && long_opt->name)
|
||||||
|
long_opt++;
|
||||||
|
__argp_error (&parser->state, "--%s: %s",
|
||||||
|
long_opt->name ? long_opt->name : "???",
|
||||||
|
dgettext (parser->argp->argp_domain, bad_key_err));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the next argument in PARSER (as indicated by PARSER->state.next).
|
||||||
|
Any error from the parsers is returned, and *ARGP_EBADKEY indicates
|
||||||
|
whether a value of EBADKEY is due to an unrecognized argument (which is
|
||||||
|
generally not fatal). */
|
||||||
|
static error_t
|
||||||
|
parser_parse_next (struct parser *parser, int *arg_ebadkey)
|
||||||
|
{
|
||||||
|
int opt;
|
||||||
|
error_t err = 0;
|
||||||
|
|
||||||
|
if (parser->state.quoted && parser->state.next < parser->state.quoted)
|
||||||
|
/* The next argument pointer has been moved to before the quoted
|
||||||
|
region, so pretend we never saw the quoting "--", and give getopt
|
||||||
|
another chance. If the user hasn't removed it, getopt will just
|
||||||
|
process it again. */
|
||||||
|
parser->state.quoted = 0;
|
||||||
|
|
||||||
|
if (parser->try_getopt && !parser->state.quoted)
|
||||||
|
/* Give getopt a chance to parse this. */
|
||||||
|
{
|
||||||
|
/* Put it back in OPTIND for getopt. */
|
||||||
|
parser->opt_data.optind = parser->state.next;
|
||||||
|
/* Distinguish KEY_ERR from a real option. */
|
||||||
|
parser->opt_data.optopt = KEY_END;
|
||||||
|
if (parser->state.flags & ARGP_LONG_ONLY)
|
||||||
|
opt = _getopt_long_only_r (parser->state.argc, parser->state.argv,
|
||||||
|
parser->short_opts, parser->long_opts, 0,
|
||||||
|
&parser->opt_data);
|
||||||
|
else
|
||||||
|
opt = _getopt_long_r (parser->state.argc, parser->state.argv,
|
||||||
|
parser->short_opts, parser->long_opts, 0,
|
||||||
|
&parser->opt_data);
|
||||||
|
/* And see what getopt did. */
|
||||||
|
parser->state.next = parser->opt_data.optind;
|
||||||
|
|
||||||
|
if (opt == KEY_END)
|
||||||
|
/* Getopt says there are no more options, so stop using
|
||||||
|
getopt; we'll continue if necessary on our own. */
|
||||||
|
{
|
||||||
|
parser->try_getopt = 0;
|
||||||
|
if (parser->state.next > 1
|
||||||
|
&& strcmp (parser->state.argv[parser->state.next - 1], QUOTE)
|
||||||
|
== 0)
|
||||||
|
/* Not only is this the end of the options, but it's a
|
||||||
|
"quoted" region, which may have args that *look* like
|
||||||
|
options, so we definitely shouldn't try to use getopt past
|
||||||
|
here, whatever happens. */
|
||||||
|
parser->state.quoted = parser->state.next;
|
||||||
|
}
|
||||||
|
else if (opt == KEY_ERR && parser->opt_data.optopt != KEY_END)
|
||||||
|
/* KEY_ERR can have the same value as a valid user short
|
||||||
|
option, but in the case of a real error, getopt sets OPTOPT
|
||||||
|
to the offending character, which can never be KEY_END. */
|
||||||
|
{
|
||||||
|
*arg_ebadkey = 0;
|
||||||
|
return EBADKEY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
opt = KEY_END;
|
||||||
|
|
||||||
|
if (opt == KEY_END)
|
||||||
|
{
|
||||||
|
/* We're past what getopt considers the options. */
|
||||||
|
if (parser->state.next >= parser->state.argc
|
||||||
|
|| (parser->state.flags & ARGP_NO_ARGS))
|
||||||
|
/* Indicate that we're done. */
|
||||||
|
{
|
||||||
|
*arg_ebadkey = 1;
|
||||||
|
return EBADKEY;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* A non-option arg; simulate what getopt might have done. */
|
||||||
|
{
|
||||||
|
opt = KEY_ARG;
|
||||||
|
parser->opt_data.optarg = parser->state.argv[parser->state.next++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt == KEY_ARG)
|
||||||
|
/* A non-option argument; try each parser in turn. */
|
||||||
|
err = parser_parse_arg (parser, parser->opt_data.optarg);
|
||||||
|
else
|
||||||
|
err = parser_parse_opt (parser, opt, parser->opt_data.optarg);
|
||||||
|
|
||||||
|
if (err == EBADKEY)
|
||||||
|
*arg_ebadkey = (opt == KEY_END || opt == KEY_ARG);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the options strings in ARGC & ARGV according to the argp in ARGP.
|
||||||
|
FLAGS is one of the ARGP_ flags above. If END_INDEX is non-NULL, the
|
||||||
|
index in ARGV of the first unparsed option is returned in it. If an
|
||||||
|
unknown option is present, EINVAL is returned; if some parser routine
|
||||||
|
returned a non-zero value, it is returned; otherwise 0 is returned. */
|
||||||
|
error_t
|
||||||
|
__argp_parse (const struct argp *argp, int argc, char **argv, unsigned flags,
|
||||||
|
int *end_index, void *input)
|
||||||
|
{
|
||||||
|
error_t err;
|
||||||
|
struct parser parser;
|
||||||
|
|
||||||
|
/* If true, then err == EBADKEY is a result of a non-option argument failing
|
||||||
|
to be parsed (which in some cases isn't actually an error). */
|
||||||
|
int arg_ebadkey = 0;
|
||||||
|
|
||||||
|
#ifndef _LIBC
|
||||||
|
if (!(flags & ARGP_PARSE_ARGV0))
|
||||||
|
{
|
||||||
|
#if HAVE_DECL_PROGRAM_INVOCATION_NAME
|
||||||
|
if (!program_invocation_name)
|
||||||
|
program_invocation_name = argv[0];
|
||||||
|
#endif
|
||||||
|
#if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
|
||||||
|
if (!program_invocation_short_name)
|
||||||
|
program_invocation_short_name = __argp_base_name (argv[0]);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (! (flags & ARGP_NO_HELP))
|
||||||
|
/* Add our own options. */
|
||||||
|
{
|
||||||
|
struct argp_child *child = alloca (4 * sizeof (struct argp_child));
|
||||||
|
struct argp *top_argp = alloca (sizeof (struct argp));
|
||||||
|
|
||||||
|
/* TOP_ARGP has no options, it just serves to group the user & default
|
||||||
|
argps. */
|
||||||
|
memset (top_argp, 0, sizeof (*top_argp));
|
||||||
|
top_argp->children = child;
|
||||||
|
|
||||||
|
memset (child, 0, 4 * sizeof (struct argp_child));
|
||||||
|
|
||||||
|
if (argp)
|
||||||
|
(child++)->argp = argp;
|
||||||
|
(child++)->argp = &argp_default_argp;
|
||||||
|
if (argp_program_version || argp_program_version_hook)
|
||||||
|
(child++)->argp = &argp_version_argp;
|
||||||
|
child->argp = 0;
|
||||||
|
|
||||||
|
argp = top_argp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Construct a parser for these arguments. */
|
||||||
|
err = parser_init (&parser, argp, argc, argv, flags, input);
|
||||||
|
|
||||||
|
if (! err)
|
||||||
|
/* Parse! */
|
||||||
|
{
|
||||||
|
while (! err)
|
||||||
|
err = parser_parse_next (&parser, &arg_ebadkey);
|
||||||
|
err = parser_finalize (&parser, err, arg_ebadkey, end_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
#ifdef weak_alias
|
||||||
|
weak_alias (__argp_parse, argp_parse)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Return the input field for ARGP in the parser corresponding to STATE; used
|
||||||
|
by the help routines. */
|
||||||
|
void *
|
||||||
|
__argp_input (const struct argp *argp, const struct argp_state *state)
|
||||||
|
{
|
||||||
|
if (state)
|
||||||
|
{
|
||||||
|
struct group *group;
|
||||||
|
struct parser *parser = state->pstate;
|
||||||
|
|
||||||
|
for (group = parser->groups; group < parser->egroup; group++)
|
||||||
|
if (group->argp == argp)
|
||||||
|
return group->input;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#ifdef weak_alias
|
||||||
|
weak_alias (__argp_input, _argp_input)
|
||||||
|
#endif
|
||||||
26
lib/argp-pin.c
Normal file
26
lib/argp-pin.c
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
/* Full and short program names for argp module
|
||||||
|
Copyright (C) 2005, 2009-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_PROGRAM_INVOCATION_SHORT_NAME
|
||||||
|
char *program_invocation_short_name = 0;
|
||||||
|
#endif
|
||||||
|
#ifndef HAVE_PROGRAM_INVOCATION_NAME
|
||||||
|
char *program_invocation_name = 0;
|
||||||
|
#endif
|
||||||
34
lib/argp-pv.c
Normal file
34
lib/argp-pv.c
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
/* Default definition for ARGP_PROGRAM_VERSION.
|
||||||
|
Copyright (C) 1996-1997, 1999, 2006, 2009-2012 Free Software Foundation,
|
||||||
|
Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* If set by the user program to a non-zero value, then a default option
|
||||||
|
--version is added (unless the ARGP_NO_HELP flag is used), which will
|
||||||
|
print this string followed by a newline and exit (unless the
|
||||||
|
ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */
|
||||||
|
const char *argp_program_version
|
||||||
|
/* This variable should be zero-initialized. On most systems, putting it into
|
||||||
|
BSS is sufficient. Not so on Mac OS X 10.3 and 10.4, see
|
||||||
|
<http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>
|
||||||
|
<http://lists.gnu.org/archive/html/bug-gnulib/2009-08/msg00096.html>. */
|
||||||
|
#if defined __ELF__
|
||||||
|
/* On ELF systems, variables in BSS behave well. */
|
||||||
|
#else
|
||||||
|
= (const char *) 0
|
||||||
|
#endif
|
||||||
|
;
|
||||||
31
lib/argp-pvh.c
Normal file
31
lib/argp-pvh.c
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
/* Default definition for ARGP_PROGRAM_VERSION_HOOK.
|
||||||
|
Copyright (C) 1996-1997, 1999, 2004, 2009-2012 Free Software Foundation,
|
||||||
|
Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "argp.h"
|
||||||
|
|
||||||
|
/* If set by the user program to a non-zero value, then a default option
|
||||||
|
--version is added (unless the ARGP_NO_HELP flag is used), which calls
|
||||||
|
this function with a stream to print the version to and a pointer to the
|
||||||
|
current parsing state, and then exits (unless the ARGP_NO_EXIT flag is
|
||||||
|
used). This variable takes precedent over ARGP_PROGRAM_VERSION. */
|
||||||
|
void (*argp_program_version_hook) (FILE *stream, struct argp_state *state) = NULL;
|
||||||
42
lib/argp-xinl.c
Normal file
42
lib/argp-xinl.c
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
/* Real definitions for extern inline functions in argp.h
|
||||||
|
Copyright (C) 1997-1998, 2004, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined _LIBC || defined HAVE_FEATURES_H
|
||||||
|
# include <features.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __USE_EXTERN_INLINES
|
||||||
|
# define __USE_EXTERN_INLINES 1
|
||||||
|
#endif
|
||||||
|
#define ARGP_EI
|
||||||
|
#undef __OPTIMIZE__
|
||||||
|
#define __OPTIMIZE__ 1
|
||||||
|
#include "argp.h"
|
||||||
|
|
||||||
|
/* Add weak aliases. */
|
||||||
|
#if _LIBC - 0 && defined (weak_alias)
|
||||||
|
|
||||||
|
weak_alias (__argp_usage, argp_usage)
|
||||||
|
weak_alias (__option_is_short, _option_is_short)
|
||||||
|
weak_alias (__option_is_end, _option_is_end)
|
||||||
|
|
||||||
|
#endif
|
||||||
645
lib/argp.h
Normal file
645
lib/argp.h
Normal file
|
|
@ -0,0 +1,645 @@
|
||||||
|
/* Hierarchical argument parsing, layered over getopt.
|
||||||
|
Copyright (C) 1995-1999, 2003-2012 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _ARGP_H
|
||||||
|
#define _ARGP_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#define __need_error_t
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#ifndef __THROW
|
||||||
|
# define __THROW
|
||||||
|
#endif
|
||||||
|
#ifndef __NTH
|
||||||
|
# define __NTH(fct) fct __THROW
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||||
|
The __-protected variants of the attributes 'format' and 'printf' are
|
||||||
|
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
||||||
|
We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
|
||||||
|
gnulib and libintl do '#define printf __printf__' when they override
|
||||||
|
the 'printf' function. */
|
||||||
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* GCC 2.95 and later have "__restrict"; C99 compilers have
|
||||||
|
"restrict", and "configure" may have defined "restrict".
|
||||||
|
Other compilers use __restrict, __restrict__, and _Restrict, and
|
||||||
|
'configure' might #define 'restrict' to those words. */
|
||||||
|
#ifndef __restrict
|
||||||
|
# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__))
|
||||||
|
# if 199901L <= __STDC_VERSION__
|
||||||
|
# define __restrict restrict
|
||||||
|
# else
|
||||||
|
# define __restrict
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __error_t_defined
|
||||||
|
typedef int error_t;
|
||||||
|
# define __error_t_defined
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* A description of a particular option. A pointer to an array of
|
||||||
|
these is passed in the OPTIONS field of an argp structure. Each option
|
||||||
|
entry can correspond to one long option and/or one short option; more
|
||||||
|
names for the same option can be added by following an entry in an option
|
||||||
|
array with options having the OPTION_ALIAS flag set. */
|
||||||
|
struct argp_option
|
||||||
|
{
|
||||||
|
/* The long option name. For more than one name for the same option, you
|
||||||
|
can use following options with the OPTION_ALIAS flag set. */
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
/* What key is returned for this option. If > 0 and printable, then it's
|
||||||
|
also accepted as a short option. */
|
||||||
|
int key;
|
||||||
|
|
||||||
|
/* If non-NULL, this is the name of the argument associated with this
|
||||||
|
option, which is required unless the OPTION_ARG_OPTIONAL flag is set. */
|
||||||
|
const char *arg;
|
||||||
|
|
||||||
|
/* OPTION_ flags. */
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
/* The doc string for this option. If both NAME and KEY are 0, This string
|
||||||
|
will be printed outdented from the normal option column, making it
|
||||||
|
useful as a group header (it will be the first thing printed in its
|
||||||
|
group); in this usage, it's conventional to end the string with a ':'.
|
||||||
|
|
||||||
|
Write the initial value as N_("TEXT") if you want xgettext to collect
|
||||||
|
it into a POT file. */
|
||||||
|
const char *doc;
|
||||||
|
|
||||||
|
/* The group this option is in. In a long help message, options are sorted
|
||||||
|
alphabetically within each group, and the groups presented in the order
|
||||||
|
0, 1, 2, ..., n, -m, ..., -2, -1. Every entry in an options array with
|
||||||
|
if this field 0 will inherit the group number of the previous entry, or
|
||||||
|
zero if it's the first one, unless its a group header (NAME and KEY both
|
||||||
|
0), in which case, the previous entry + 1 is the default. Automagic
|
||||||
|
options such as --help are put into group -1. */
|
||||||
|
int group;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The argument associated with this option is optional. */
|
||||||
|
#define OPTION_ARG_OPTIONAL 0x1
|
||||||
|
|
||||||
|
/* This option isn't displayed in any help messages. */
|
||||||
|
#define OPTION_HIDDEN 0x2
|
||||||
|
|
||||||
|
/* This option is an alias for the closest previous non-alias option. This
|
||||||
|
means that it will be displayed in the same help entry, and will inherit
|
||||||
|
fields other than NAME and KEY from the aliased option. */
|
||||||
|
#define OPTION_ALIAS 0x4
|
||||||
|
|
||||||
|
/* This option isn't actually an option (and so should be ignored by the
|
||||||
|
actual option parser), but rather an arbitrary piece of documentation that
|
||||||
|
should be displayed in much the same manner as the options. If this flag
|
||||||
|
is set, then the option NAME field is displayed unmodified (e.g., no '--'
|
||||||
|
prefix is added) at the left-margin (where a *short* option would normally
|
||||||
|
be displayed), and the documentation string in the normal place. The NAME
|
||||||
|
field will be translated using gettext, unless OPTION_NO_TRANS is set (see
|
||||||
|
below). For purposes of sorting, any leading whitespace and punctuation is
|
||||||
|
ignored, except that if the first non-whitespace character is not '-', this
|
||||||
|
entry is displayed after all options (and OPTION_DOC entries with a leading
|
||||||
|
'-') in the same group. */
|
||||||
|
#define OPTION_DOC 0x8
|
||||||
|
|
||||||
|
/* This option shouldn't be included in "long" usage messages (but is still
|
||||||
|
included in help messages). This is mainly intended for options that are
|
||||||
|
completely documented in an argp's ARGS_DOC field, in which case including
|
||||||
|
the option in the generic usage list would be redundant. For instance,
|
||||||
|
if ARGS_DOC is "FOO BAR\n-x BLAH", and the '-x' option's purpose is to
|
||||||
|
distinguish these two cases, -x should probably be marked
|
||||||
|
OPTION_NO_USAGE. */
|
||||||
|
#define OPTION_NO_USAGE 0x10
|
||||||
|
|
||||||
|
/* Valid only in conjunction with OPTION_DOC. This option disables translation
|
||||||
|
of option name. */
|
||||||
|
#define OPTION_NO_TRANS 0x20
|
||||||
|
|
||||||
|
|
||||||
|
struct argp; /* fwd declare this type */
|
||||||
|
struct argp_state; /* " */
|
||||||
|
struct argp_child; /* " */
|
||||||
|
|
||||||
|
/* The type of a pointer to an argp parsing function. */
|
||||||
|
typedef error_t (*argp_parser_t) (int key, char *arg,
|
||||||
|
struct argp_state *state);
|
||||||
|
|
||||||
|
/* What to return for unrecognized keys. For special ARGP_KEY_ keys, such
|
||||||
|
returns will simply be ignored. For user keys, this error will be turned
|
||||||
|
into EINVAL (if the call to argp_parse is such that errors are propagated
|
||||||
|
back to the user instead of exiting); returning EINVAL itself would result
|
||||||
|
in an immediate stop to parsing in *all* cases. */
|
||||||
|
#define ARGP_ERR_UNKNOWN E2BIG /* Hurd should never need E2BIG. XXX */
|
||||||
|
|
||||||
|
/* Special values for the KEY argument to an argument parsing function.
|
||||||
|
ARGP_ERR_UNKNOWN should be returned if they aren't understood.
|
||||||
|
|
||||||
|
The sequence of keys to a parsing function is either (where each
|
||||||
|
uppercased word should be prefixed by 'ARGP_KEY_' and opt is a user key):
|
||||||
|
|
||||||
|
INIT opt... NO_ARGS END SUCCESS -- No non-option arguments at all
|
||||||
|
or INIT (opt | ARG)... END SUCCESS -- All non-option args parsed
|
||||||
|
or INIT (opt | ARG)... SUCCESS -- Some non-option arg unrecognized
|
||||||
|
|
||||||
|
The third case is where every parser returned ARGP_KEY_UNKNOWN for an
|
||||||
|
argument, in which case parsing stops at that argument (returning the
|
||||||
|
unparsed arguments to the caller of argp_parse if requested, or stopping
|
||||||
|
with an error message if not).
|
||||||
|
|
||||||
|
If an error occurs (either detected by argp, or because the parsing
|
||||||
|
function returned an error value), then the parser is called with
|
||||||
|
ARGP_KEY_ERROR, and no further calls are made. */
|
||||||
|
|
||||||
|
/* This is not an option at all, but rather a command line argument. If a
|
||||||
|
parser receiving this key returns success, the fact is recorded, and the
|
||||||
|
ARGP_KEY_NO_ARGS case won't be used. HOWEVER, if while processing the
|
||||||
|
argument, a parser function decrements the NEXT field of the state it's
|
||||||
|
passed, the option won't be considered processed; this is to allow you to
|
||||||
|
actually modify the argument (perhaps into an option), and have it
|
||||||
|
processed again. */
|
||||||
|
#define ARGP_KEY_ARG 0
|
||||||
|
/* There are remaining arguments not parsed by any parser, which may be found
|
||||||
|
starting at (STATE->argv + STATE->next). If success is returned, but
|
||||||
|
STATE->next left untouched, it's assumed that all arguments were consume,
|
||||||
|
otherwise, the parser should adjust STATE->next to reflect any arguments
|
||||||
|
consumed. */
|
||||||
|
#define ARGP_KEY_ARGS 0x1000006
|
||||||
|
/* There are no more command line arguments at all. */
|
||||||
|
#define ARGP_KEY_END 0x1000001
|
||||||
|
/* Because it's common to want to do some special processing if there aren't
|
||||||
|
any non-option args, user parsers are called with this key if they didn't
|
||||||
|
successfully process any non-option arguments. Called just before
|
||||||
|
ARGP_KEY_END (where more general validity checks on previously parsed
|
||||||
|
arguments can take place). */
|
||||||
|
#define ARGP_KEY_NO_ARGS 0x1000002
|
||||||
|
/* Passed in before any parsing is done. Afterwards, the values of each
|
||||||
|
element of the CHILD_INPUT field, if any, in the state structure is
|
||||||
|
copied to each child's state to be the initial value of the INPUT field. */
|
||||||
|
#define ARGP_KEY_INIT 0x1000003
|
||||||
|
/* Use after all other keys, including SUCCESS & END. */
|
||||||
|
#define ARGP_KEY_FINI 0x1000007
|
||||||
|
/* Passed in when parsing has successfully been completed (even if there are
|
||||||
|
still arguments remaining). */
|
||||||
|
#define ARGP_KEY_SUCCESS 0x1000004
|
||||||
|
/* Passed in if an error occurs. */
|
||||||
|
#define ARGP_KEY_ERROR 0x1000005
|
||||||
|
|
||||||
|
/* An argp structure contains a set of options declarations, a function to
|
||||||
|
deal with parsing one, documentation string, a possible vector of child
|
||||||
|
argp's, and perhaps a function to filter help output. When actually
|
||||||
|
parsing options, getopt is called with the union of all the argp
|
||||||
|
structures chained together through their CHILD pointers, with conflicts
|
||||||
|
being resolved in favor of the first occurrence in the chain. */
|
||||||
|
struct argp
|
||||||
|
{
|
||||||
|
/* An array of argp_option structures, terminated by an entry with both
|
||||||
|
NAME and KEY having a value of 0. */
|
||||||
|
const struct argp_option *options;
|
||||||
|
|
||||||
|
/* What to do with an option from this structure. KEY is the key
|
||||||
|
associated with the option, and ARG is any associated argument (NULL if
|
||||||
|
none was supplied). If KEY isn't understood, ARGP_ERR_UNKNOWN should be
|
||||||
|
returned. If a non-zero, non-ARGP_ERR_UNKNOWN value is returned, then
|
||||||
|
parsing is stopped immediately, and that value is returned from
|
||||||
|
argp_parse(). For special (non-user-supplied) values of KEY, see the
|
||||||
|
ARGP_KEY_ definitions below. */
|
||||||
|
argp_parser_t parser;
|
||||||
|
|
||||||
|
/* A string describing what other arguments are wanted by this program. It
|
||||||
|
is only used by argp_usage to print the "Usage:" message. If it
|
||||||
|
contains newlines, the strings separated by them are considered
|
||||||
|
alternative usage patterns, and printed on separate lines (lines after
|
||||||
|
the first are prefix by " or: " instead of "Usage:"). */
|
||||||
|
const char *args_doc;
|
||||||
|
|
||||||
|
/* If non-NULL, a string containing extra text to be printed before and
|
||||||
|
after the options in a long help message (separated by a vertical tab
|
||||||
|
'\v' character).
|
||||||
|
Write the initial value as N_("BEFORE-TEXT") "\v" N_("AFTER-TEXT") if
|
||||||
|
you want xgettext to collect the two pieces of text into a POT file. */
|
||||||
|
const char *doc;
|
||||||
|
|
||||||
|
/* A vector of argp_children structures, terminated by a member with a 0
|
||||||
|
argp field, pointing to child argps should be parsed with this one. Any
|
||||||
|
conflicts are resolved in favor of this argp, or early argps in the
|
||||||
|
CHILDREN list. This field is useful if you use libraries that supply
|
||||||
|
their own argp structure, which you want to use in conjunction with your
|
||||||
|
own. */
|
||||||
|
const struct argp_child *children;
|
||||||
|
|
||||||
|
/* If non-zero, this should be a function to filter the output of help
|
||||||
|
messages. KEY is either a key from an option, in which case TEXT is
|
||||||
|
that option's help text, or a special key from the ARGP_KEY_HELP_
|
||||||
|
defines, below, describing which other help text TEXT is. The function
|
||||||
|
should return either TEXT, if it should be used as-is, a replacement
|
||||||
|
string, which should be malloced, and will be freed by argp, or NULL,
|
||||||
|
meaning "print nothing". The value for TEXT is *after* any translation
|
||||||
|
has been done, so if any of the replacement text also needs translation,
|
||||||
|
that should be done by the filter function. INPUT is either the input
|
||||||
|
supplied to argp_parse, or NULL, if argp_help was called directly. */
|
||||||
|
char *(*help_filter) (int __key, const char *__text, void *__input);
|
||||||
|
|
||||||
|
/* If non-zero the strings used in the argp library are translated using
|
||||||
|
the domain described by this string. Otherwise the currently installed
|
||||||
|
default domain is used. */
|
||||||
|
const char *argp_domain;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Possible KEY arguments to a help filter function. */
|
||||||
|
#define ARGP_KEY_HELP_PRE_DOC 0x2000001 /* Help text preceding options. */
|
||||||
|
#define ARGP_KEY_HELP_POST_DOC 0x2000002 /* Help text following options. */
|
||||||
|
#define ARGP_KEY_HELP_HEADER 0x2000003 /* Option header string. */
|
||||||
|
#define ARGP_KEY_HELP_EXTRA 0x2000004 /* After all other documentation;
|
||||||
|
TEXT is NULL for this key. */
|
||||||
|
/* Explanatory note emitted when duplicate option arguments have been
|
||||||
|
suppressed. */
|
||||||
|
#define ARGP_KEY_HELP_DUP_ARGS_NOTE 0x2000005
|
||||||
|
#define ARGP_KEY_HELP_ARGS_DOC 0x2000006 /* Argument doc string. */
|
||||||
|
|
||||||
|
/* When an argp has a non-zero CHILDREN field, it should point to a vector of
|
||||||
|
argp_child structures, each of which describes a subsidiary argp. */
|
||||||
|
struct argp_child
|
||||||
|
{
|
||||||
|
/* The child parser. */
|
||||||
|
const struct argp *argp;
|
||||||
|
|
||||||
|
/* Flags for this child. */
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
/* If non-zero, an optional header to be printed in help output before the
|
||||||
|
child options. As a side-effect, a non-zero value forces the child
|
||||||
|
options to be grouped together; to achieve this effect without actually
|
||||||
|
printing a header string, use a value of "". */
|
||||||
|
const char *header;
|
||||||
|
|
||||||
|
/* Where to group the child options relative to the other ("consolidated")
|
||||||
|
options in the parent argp; the values are the same as the GROUP field
|
||||||
|
in argp_option structs, but all child-groupings follow parent options at
|
||||||
|
a particular group level. If both this field and HEADER are zero, then
|
||||||
|
they aren't grouped at all, but rather merged with the parent options
|
||||||
|
(merging the child's grouping levels with the parents). */
|
||||||
|
int group;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Parsing state. This is provided to parsing functions called by argp,
|
||||||
|
which may examine and, as noted, modify fields. */
|
||||||
|
struct argp_state
|
||||||
|
{
|
||||||
|
/* The top level ARGP being parsed. */
|
||||||
|
const struct argp *root_argp;
|
||||||
|
|
||||||
|
/* The argument vector being parsed. May be modified. */
|
||||||
|
int argc;
|
||||||
|
char **argv;
|
||||||
|
|
||||||
|
/* The index in ARGV of the next arg that to be parsed. May be modified. */
|
||||||
|
int next;
|
||||||
|
|
||||||
|
/* The flags supplied to argp_parse. May be modified. */
|
||||||
|
unsigned flags;
|
||||||
|
|
||||||
|
/* While calling a parsing function with a key of ARGP_KEY_ARG, this is the
|
||||||
|
number of the current arg, starting at zero, and incremented after each
|
||||||
|
such call returns. At all other times, this is the number of such
|
||||||
|
arguments that have been processed. */
|
||||||
|
unsigned arg_num;
|
||||||
|
|
||||||
|
/* If non-zero, the index in ARGV of the first argument following a special
|
||||||
|
'--' argument (which prevents anything following being interpreted as an
|
||||||
|
option). Only set once argument parsing has proceeded past this point. */
|
||||||
|
int quoted;
|
||||||
|
|
||||||
|
/* An arbitrary pointer passed in from the user. */
|
||||||
|
void *input;
|
||||||
|
/* Values to pass to child parsers. This vector will be the same length as
|
||||||
|
the number of children for the current parser. */
|
||||||
|
void **child_inputs;
|
||||||
|
|
||||||
|
/* For the parser's use. Initialized to 0. */
|
||||||
|
void *hook;
|
||||||
|
|
||||||
|
/* The name used when printing messages. This is initialized to ARGV[0],
|
||||||
|
or PROGRAM_INVOCATION_NAME if that is unavailable. */
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
/* Streams used when argp prints something. */
|
||||||
|
FILE *err_stream; /* For errors; initialized to stderr. */
|
||||||
|
FILE *out_stream; /* For information; initialized to stdout. */
|
||||||
|
|
||||||
|
void *pstate; /* Private, for use by argp. */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Flags for argp_parse (note that the defaults are those that are
|
||||||
|
convenient for program command line parsing): */
|
||||||
|
|
||||||
|
/* Don't ignore the first element of ARGV. Normally (and always unless
|
||||||
|
ARGP_NO_ERRS is set) the first element of the argument vector is
|
||||||
|
skipped for option parsing purposes, as it corresponds to the program name
|
||||||
|
in a command line. */
|
||||||
|
#define ARGP_PARSE_ARGV0 0x01
|
||||||
|
|
||||||
|
/* Don't print error messages for unknown options to stderr; unless this flag
|
||||||
|
is set, ARGP_PARSE_ARGV0 is ignored, as ARGV[0] is used as the program
|
||||||
|
name in the error messages. This flag implies ARGP_NO_EXIT (on the
|
||||||
|
assumption that silent exiting upon errors is bad behaviour). */
|
||||||
|
#define ARGP_NO_ERRS 0x02
|
||||||
|
|
||||||
|
/* Don't parse any non-option args. Normally non-option args are parsed by
|
||||||
|
calling the parse functions with a key of ARGP_KEY_ARG, and the actual arg
|
||||||
|
as the value. Since it's impossible to know which parse function wants to
|
||||||
|
handle it, each one is called in turn, until one returns 0 or an error
|
||||||
|
other than ARGP_ERR_UNKNOWN; if an argument is handled by no one, the
|
||||||
|
argp_parse returns prematurely (but with a return value of 0). If all
|
||||||
|
args have been parsed without error, all parsing functions are called one
|
||||||
|
last time with a key of ARGP_KEY_END. This flag needn't normally be set,
|
||||||
|
as the normal behavior is to stop parsing as soon as some argument can't
|
||||||
|
be handled. */
|
||||||
|
#define ARGP_NO_ARGS 0x04
|
||||||
|
|
||||||
|
/* Parse options and arguments in the same order they occur on the command
|
||||||
|
line -- normally they're rearranged so that all options come first. */
|
||||||
|
#define ARGP_IN_ORDER 0x08
|
||||||
|
|
||||||
|
/* Don't provide the standard long option --help, which causes usage and
|
||||||
|
option help information to be output to stdout, and exit (0) called. */
|
||||||
|
#define ARGP_NO_HELP 0x10
|
||||||
|
|
||||||
|
/* Don't exit on errors (they may still result in error messages). */
|
||||||
|
#define ARGP_NO_EXIT 0x20
|
||||||
|
|
||||||
|
/* Use the gnu getopt "long-only" rules for parsing arguments. */
|
||||||
|
#define ARGP_LONG_ONLY 0x40
|
||||||
|
|
||||||
|
/* Turns off any message-printing/exiting options. */
|
||||||
|
#define ARGP_SILENT (ARGP_NO_EXIT | ARGP_NO_ERRS | ARGP_NO_HELP)
|
||||||
|
|
||||||
|
/* Parse the options strings in ARGC & ARGV according to the options in ARGP.
|
||||||
|
FLAGS is one of the ARGP_ flags above. If ARG_INDEX is non-NULL, the
|
||||||
|
index in ARGV of the first unparsed option is returned in it. If an
|
||||||
|
unknown option is present, ARGP_ERR_UNKNOWN is returned; if some parser
|
||||||
|
routine returned a non-zero value, it is returned; otherwise 0 is
|
||||||
|
returned. This function may also call exit unless the ARGP_NO_HELP flag
|
||||||
|
is set. INPUT is a pointer to a value to be passed in to the parser. */
|
||||||
|
extern error_t argp_parse (const struct argp *__restrict __argp,
|
||||||
|
int /*argc*/, char **__restrict /*argv*/,
|
||||||
|
unsigned __flags, int *__restrict __arg_index,
|
||||||
|
void *__restrict __input);
|
||||||
|
extern error_t __argp_parse (const struct argp *__restrict __argp,
|
||||||
|
int /*argc*/, char **__restrict /*argv*/,
|
||||||
|
unsigned __flags, int *__restrict __arg_index,
|
||||||
|
void *__restrict __input);
|
||||||
|
|
||||||
|
/* Global variables. */
|
||||||
|
|
||||||
|
/* GNULIB makes sure both program_invocation_name and
|
||||||
|
program_invocation_short_name are available */
|
||||||
|
#ifdef GNULIB_PROGRAM_INVOCATION_NAME
|
||||||
|
extern char *program_invocation_name;
|
||||||
|
# undef HAVE_DECL_PROGRAM_INVOCATION_NAME
|
||||||
|
# define HAVE_DECL_PROGRAM_INVOCATION_NAME 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GNULIB_PROGRAM_INVOCATION_SHORT_NAME
|
||||||
|
extern char *program_invocation_short_name;
|
||||||
|
# undef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
|
||||||
|
# define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If defined or set by the user program to a non-zero value, then a default
|
||||||
|
option --version is added (unless the ARGP_NO_HELP flag is used), which
|
||||||
|
will print this string followed by a newline and exit (unless the
|
||||||
|
ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */
|
||||||
|
extern const char *argp_program_version;
|
||||||
|
|
||||||
|
/* If defined or set by the user program to a non-zero value, then a default
|
||||||
|
option --version is added (unless the ARGP_NO_HELP flag is used), which
|
||||||
|
calls this function with a stream to print the version to and a pointer to
|
||||||
|
the current parsing state, and then exits (unless the ARGP_NO_EXIT flag is
|
||||||
|
used). This variable takes precedent over ARGP_PROGRAM_VERSION. */
|
||||||
|
extern void (*argp_program_version_hook) (FILE *__restrict __stream,
|
||||||
|
struct argp_state *__restrict
|
||||||
|
__state);
|
||||||
|
|
||||||
|
/* If defined or set by the user program, it should point to string that is
|
||||||
|
the bug-reporting address for the program. It will be printed by
|
||||||
|
argp_help if the ARGP_HELP_BUG_ADDR flag is set (as it is by various
|
||||||
|
standard help messages), embedded in a sentence that says something like
|
||||||
|
"Report bugs to ADDR." */
|
||||||
|
extern const char *argp_program_bug_address;
|
||||||
|
|
||||||
|
/* The exit status that argp will use when exiting due to a parsing error.
|
||||||
|
If not defined or set by the user program, this defaults to EX_USAGE from
|
||||||
|
<sysexits.h>. */
|
||||||
|
extern error_t argp_err_exit_status;
|
||||||
|
|
||||||
|
/* Flags for argp_help. */
|
||||||
|
#define ARGP_HELP_USAGE 0x01 /* a Usage: message. */
|
||||||
|
#define ARGP_HELP_SHORT_USAGE 0x02 /* " but don't actually print options. */
|
||||||
|
#define ARGP_HELP_SEE 0x04 /* a "Try ... for more help" message. */
|
||||||
|
#define ARGP_HELP_LONG 0x08 /* a long help message. */
|
||||||
|
#define ARGP_HELP_PRE_DOC 0x10 /* doc string preceding long help. */
|
||||||
|
#define ARGP_HELP_POST_DOC 0x20 /* doc string following long help. */
|
||||||
|
#define ARGP_HELP_DOC (ARGP_HELP_PRE_DOC | ARGP_HELP_POST_DOC)
|
||||||
|
#define ARGP_HELP_BUG_ADDR 0x40 /* bug report address */
|
||||||
|
#define ARGP_HELP_LONG_ONLY 0x80 /* modify output appropriately to
|
||||||
|
reflect ARGP_LONG_ONLY mode. */
|
||||||
|
|
||||||
|
/* These ARGP_HELP flags are only understood by argp_state_help. */
|
||||||
|
#define ARGP_HELP_EXIT_ERR 0x100 /* Call exit(1) instead of returning. */
|
||||||
|
#define ARGP_HELP_EXIT_OK 0x200 /* Call exit(0) instead of returning. */
|
||||||
|
|
||||||
|
/* The standard thing to do after a program command line parsing error, if an
|
||||||
|
error message has already been printed. */
|
||||||
|
#define ARGP_HELP_STD_ERR \
|
||||||
|
(ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR)
|
||||||
|
/* The standard thing to do after a program command line parsing error, if no
|
||||||
|
more specific error message has been printed. */
|
||||||
|
#define ARGP_HELP_STD_USAGE \
|
||||||
|
(ARGP_HELP_SHORT_USAGE | ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR)
|
||||||
|
/* The standard thing to do in response to a --help option. */
|
||||||
|
#define ARGP_HELP_STD_HELP \
|
||||||
|
(ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_EXIT_OK \
|
||||||
|
| ARGP_HELP_DOC | ARGP_HELP_BUG_ADDR)
|
||||||
|
|
||||||
|
/* Output a usage message for ARGP to STREAM. FLAGS are from the set
|
||||||
|
ARGP_HELP_*. */
|
||||||
|
extern void argp_help (const struct argp *__restrict __argp,
|
||||||
|
FILE *__restrict __stream,
|
||||||
|
unsigned __flags, char *__restrict __name);
|
||||||
|
extern void __argp_help (const struct argp *__restrict __argp,
|
||||||
|
FILE *__restrict __stream, unsigned __flags,
|
||||||
|
char *__name);
|
||||||
|
|
||||||
|
/* The following routines are intended to be called from within an argp
|
||||||
|
parsing routine (thus taking an argp_state structure as the first
|
||||||
|
argument). They may or may not print an error message and exit, depending
|
||||||
|
on the flags in STATE -- in any case, the caller should be prepared for
|
||||||
|
them *not* to exit, and should return an appropriate error after calling
|
||||||
|
them. [argp_usage & argp_error should probably be called argp_state_...,
|
||||||
|
but they're used often enough that they should be short] */
|
||||||
|
|
||||||
|
/* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are
|
||||||
|
from the set ARGP_HELP_*. */
|
||||||
|
extern void argp_state_help (const struct argp_state *__restrict __state,
|
||||||
|
FILE *__restrict __stream,
|
||||||
|
unsigned int __flags);
|
||||||
|
extern void __argp_state_help (const struct argp_state *__restrict __state,
|
||||||
|
FILE *__restrict __stream,
|
||||||
|
unsigned int __flags);
|
||||||
|
|
||||||
|
#if _LIBC || !defined __USE_EXTERN_INLINES
|
||||||
|
/* Possibly output the standard usage message for ARGP to stderr and exit. */
|
||||||
|
extern void argp_usage (const struct argp_state *__state);
|
||||||
|
extern void __argp_usage (const struct argp_state *__state);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If appropriate, print the printf string FMT and following args, preceded
|
||||||
|
by the program name and ':', to stderr, and followed by a "Try ... --help"
|
||||||
|
message, then exit (1). */
|
||||||
|
extern void argp_error (const struct argp_state *__restrict __state,
|
||||||
|
const char *__restrict __fmt, ...)
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 2, 3));
|
||||||
|
extern void __argp_error (const struct argp_state *__restrict __state,
|
||||||
|
const char *__restrict __fmt, ...)
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 2, 3));
|
||||||
|
|
||||||
|
/* Similar to the standard gnu error-reporting function error(), but will
|
||||||
|
respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print
|
||||||
|
to STATE->err_stream. This is useful for argument parsing code that is
|
||||||
|
shared between program startup (when exiting is desired) and runtime
|
||||||
|
option parsing (when typically an error code is returned instead). The
|
||||||
|
difference between this function and argp_error is that the latter is for
|
||||||
|
*parsing errors*, and the former is for other problems that occur during
|
||||||
|
parsing but don't reflect a (syntactic) problem with the input. */
|
||||||
|
extern void argp_failure (const struct argp_state *__restrict __state,
|
||||||
|
int __status, int __errnum,
|
||||||
|
const char *__restrict __fmt, ...)
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 4, 5));
|
||||||
|
extern void __argp_failure (const struct argp_state *__restrict __state,
|
||||||
|
int __status, int __errnum,
|
||||||
|
const char *__restrict __fmt, ...)
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 4, 5));
|
||||||
|
|
||||||
|
#if _LIBC || !defined __USE_EXTERN_INLINES
|
||||||
|
/* Returns true if the option OPT is a valid short option. */
|
||||||
|
extern int _option_is_short (const struct argp_option *__opt) __THROW;
|
||||||
|
extern int __option_is_short (const struct argp_option *__opt) __THROW;
|
||||||
|
|
||||||
|
/* Returns true if the option OPT is in fact the last (unused) entry in an
|
||||||
|
options array. */
|
||||||
|
extern int _option_is_end (const struct argp_option *__opt) __THROW;
|
||||||
|
extern int __option_is_end (const struct argp_option *__opt) __THROW;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Return the input field for ARGP in the parser corresponding to STATE; used
|
||||||
|
by the help routines. */
|
||||||
|
extern void *_argp_input (const struct argp *__restrict __argp,
|
||||||
|
const struct argp_state *__restrict __state)
|
||||||
|
__THROW;
|
||||||
|
extern void *__argp_input (const struct argp *__restrict __argp,
|
||||||
|
const struct argp_state *__restrict __state)
|
||||||
|
__THROW;
|
||||||
|
|
||||||
|
#ifdef __USE_EXTERN_INLINES
|
||||||
|
|
||||||
|
# if !_LIBC
|
||||||
|
# define __argp_usage argp_usage
|
||||||
|
# define __argp_state_help argp_state_help
|
||||||
|
# define __option_is_short _option_is_short
|
||||||
|
# define __option_is_end _option_is_end
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ARGP_EI
|
||||||
|
# ifdef __GNUC__
|
||||||
|
/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
|
||||||
|
inline semantics, unless -fgnu89-inline is used. It defines a macro
|
||||||
|
__GNUC_STDC_INLINE__ to indicate this situation or a macro
|
||||||
|
__GNUC_GNU_INLINE__ to indicate the opposite situation.
|
||||||
|
GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline
|
||||||
|
semantics but warns, unless -fgnu89-inline is used:
|
||||||
|
warning: C99 inline functions are not supported; using GNU89
|
||||||
|
warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute
|
||||||
|
It defines a macro __GNUC_GNU_INLINE__ to indicate this situation. */
|
||||||
|
# if defined __GNUC_STDC_INLINE__
|
||||||
|
# define ARGP_EI __inline__
|
||||||
|
# elif defined __GNUC_GNU_INLINE__
|
||||||
|
# define ARGP_EI extern __inline__ __attribute__ ((__gnu_inline__))
|
||||||
|
# else
|
||||||
|
# define ARGP_EI extern __inline__
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
/* With other compilers, assume the ISO C99 meaning of 'inline', if
|
||||||
|
the compiler supports 'inline' at all. */
|
||||||
|
# define ARGP_EI inline
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
ARGP_EI void
|
||||||
|
__argp_usage (const struct argp_state *__state)
|
||||||
|
{
|
||||||
|
__argp_state_help (__state, stderr, ARGP_HELP_STD_USAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
ARGP_EI int
|
||||||
|
__NTH (__option_is_short (const struct argp_option *__opt))
|
||||||
|
{
|
||||||
|
if (__opt->flags & OPTION_DOC)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int __key = __opt->key;
|
||||||
|
return __key > 0 && __key <= UCHAR_MAX && isprint (__key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ARGP_EI int
|
||||||
|
__NTH (__option_is_end (const struct argp_option *__opt))
|
||||||
|
{
|
||||||
|
return !__opt->key && !__opt->name && !__opt->doc && !__opt->group;
|
||||||
|
}
|
||||||
|
|
||||||
|
# if !_LIBC
|
||||||
|
# undef __argp_usage
|
||||||
|
# undef __argp_state_help
|
||||||
|
# undef __option_is_short
|
||||||
|
# undef __option_is_end
|
||||||
|
# endif
|
||||||
|
#endif /* Use extern inlines. */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* argp.h */
|
||||||
34
lib/asnprintf.c
Normal file
34
lib/asnprintf.c
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
/* Formatted output to strings.
|
||||||
|
Copyright (C) 1999, 2002, 2006, 2009-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "vasnprintf.h"
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
char *
|
||||||
|
asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
char *result;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
result = vasnprintf (resultbuf, lengthp, format, args);
|
||||||
|
va_end (args);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
75
lib/basename-lgpl.c
Normal file
75
lib/basename-lgpl.c
Normal file
|
|
@ -0,0 +1,75 @@
|
||||||
|
/* basename.c -- return the last element in a file name
|
||||||
|
|
||||||
|
Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "dirname.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* Return the address of the last file name component of NAME. If
|
||||||
|
NAME has no relative file name components because it is a file
|
||||||
|
system root, return the empty string. */
|
||||||
|
|
||||||
|
char *
|
||||||
|
last_component (char const *name)
|
||||||
|
{
|
||||||
|
char const *base = name + FILE_SYSTEM_PREFIX_LEN (name);
|
||||||
|
char const *p;
|
||||||
|
bool saw_slash = false;
|
||||||
|
|
||||||
|
while (ISSLASH (*base))
|
||||||
|
base++;
|
||||||
|
|
||||||
|
for (p = base; *p; p++)
|
||||||
|
{
|
||||||
|
if (ISSLASH (*p))
|
||||||
|
saw_slash = true;
|
||||||
|
else if (saw_slash)
|
||||||
|
{
|
||||||
|
base = p;
|
||||||
|
saw_slash = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (char *) base;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the length of the basename NAME. Typically NAME is the
|
||||||
|
value returned by base_name or last_component. Act like strlen
|
||||||
|
(NAME), except omit all trailing slashes. */
|
||||||
|
|
||||||
|
size_t
|
||||||
|
base_len (char const *name)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
|
||||||
|
|
||||||
|
for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (DOUBLE_SLASH_IS_DISTINCT_ROOT && len == 1
|
||||||
|
&& ISSLASH (name[0]) && ISSLASH (name[1]) && ! name[2])
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
if (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && prefix_len
|
||||||
|
&& len == prefix_len && ISSLASH (name[prefix_len]))
|
||||||
|
return prefix_len + 1;
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
86
lib/dirname-lgpl.c
Normal file
86
lib/dirname-lgpl.c
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
/* dirname.c -- return all but the last element in a file name
|
||||||
|
|
||||||
|
Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "dirname.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* Return the length of the prefix of FILE that will be used by
|
||||||
|
dir_name. If FILE is in the working directory, this returns zero
|
||||||
|
even though 'dir_name (FILE)' will return ".". Works properly even
|
||||||
|
if there are trailing slashes (by effectively ignoring them). */
|
||||||
|
|
||||||
|
size_t
|
||||||
|
dir_len (char const *file)
|
||||||
|
{
|
||||||
|
size_t prefix_length = FILE_SYSTEM_PREFIX_LEN (file);
|
||||||
|
size_t length;
|
||||||
|
|
||||||
|
/* Advance prefix_length beyond important leading slashes. */
|
||||||
|
prefix_length += (prefix_length != 0
|
||||||
|
? (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
|
||||||
|
&& ISSLASH (file[prefix_length]))
|
||||||
|
: (ISSLASH (file[0])
|
||||||
|
? ((DOUBLE_SLASH_IS_DISTINCT_ROOT
|
||||||
|
&& ISSLASH (file[1]) && ! ISSLASH (file[2])
|
||||||
|
? 2 : 1))
|
||||||
|
: 0));
|
||||||
|
|
||||||
|
/* Strip the basename and any redundant slashes before it. */
|
||||||
|
for (length = last_component (file) - file;
|
||||||
|
prefix_length < length; length--)
|
||||||
|
if (! ISSLASH (file[length - 1]))
|
||||||
|
break;
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* In general, we can't use the builtin 'dirname' function if available,
|
||||||
|
since it has different meanings in different environments.
|
||||||
|
In some environments the builtin 'dirname' modifies its argument.
|
||||||
|
|
||||||
|
Return the leading directories part of FILE, allocated with malloc.
|
||||||
|
Works properly even if there are trailing slashes (by effectively
|
||||||
|
ignoring them). Return NULL on failure.
|
||||||
|
|
||||||
|
If lstat (FILE) would succeed, then { chdir (dir_name (FILE));
|
||||||
|
lstat (base_name (FILE)); } will access the same file. Likewise,
|
||||||
|
if the sequence { chdir (dir_name (FILE));
|
||||||
|
rename (base_name (FILE), "foo"); } succeeds, you have renamed FILE
|
||||||
|
to "foo" in the same directory FILE was in. */
|
||||||
|
|
||||||
|
char *
|
||||||
|
mdir_name (char const *file)
|
||||||
|
{
|
||||||
|
size_t length = dir_len (file);
|
||||||
|
bool append_dot = (length == 0
|
||||||
|
|| (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
|
||||||
|
&& length == FILE_SYSTEM_PREFIX_LEN (file)
|
||||||
|
&& file[2] != '\0' && ! ISSLASH (file[2])));
|
||||||
|
char *dir = malloc (length + append_dot + 1);
|
||||||
|
if (!dir)
|
||||||
|
return NULL;
|
||||||
|
memcpy (dir, file, length);
|
||||||
|
if (append_dot)
|
||||||
|
dir[length++] = '.';
|
||||||
|
dir[length] = '\0';
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
46
lib/dirname.h
Normal file
46
lib/dirname.h
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
/* Take file names apart into directory and base names.
|
||||||
|
|
||||||
|
Copyright (C) 1998, 2001, 2003-2006, 2009-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef DIRNAME_H_
|
||||||
|
# define DIRNAME_H_ 1
|
||||||
|
|
||||||
|
# include <stdbool.h>
|
||||||
|
# include <stddef.h>
|
||||||
|
# include "dosname.h"
|
||||||
|
|
||||||
|
# ifndef DIRECTORY_SEPARATOR
|
||||||
|
# define DIRECTORY_SEPARATOR '/'
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
|
||||||
|
# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if GNULIB_DIRNAME
|
||||||
|
char *base_name (char const *file);
|
||||||
|
char *dir_name (char const *file);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
char *mdir_name (char const *file);
|
||||||
|
size_t base_len (char const *file) _GL_ATTRIBUTE_PURE;
|
||||||
|
size_t dir_len (char const *file) _GL_ATTRIBUTE_PURE;
|
||||||
|
char *last_component (char const *file) _GL_ATTRIBUTE_PURE;
|
||||||
|
|
||||||
|
bool strip_trailing_slashes (char *file);
|
||||||
|
|
||||||
|
#endif /* not DIRNAME_H_ */
|
||||||
53
lib/dosname.h
Normal file
53
lib/dosname.h
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
/* File names on MS-DOS/Windows systems.
|
||||||
|
|
||||||
|
Copyright (C) 2000-2001, 2004-2006, 2009-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
From Paul Eggert and Jim Meyering. */
|
||||||
|
|
||||||
|
#ifndef _DOSNAME_H
|
||||||
|
#define _DOSNAME_H
|
||||||
|
|
||||||
|
#if (defined _WIN32 || defined __WIN32__ || \
|
||||||
|
defined __MSDOS__ || defined __CYGWIN__ || \
|
||||||
|
defined __EMX__ || defined __DJGPP__)
|
||||||
|
/* This internal macro assumes ASCII, but all hosts that support drive
|
||||||
|
letters use ASCII. */
|
||||||
|
# define _IS_DRIVE_LETTER(C) (((unsigned int) (C) | ('a' - 'A')) - 'a' \
|
||||||
|
<= 'z' - 'a')
|
||||||
|
# define FILE_SYSTEM_PREFIX_LEN(Filename) \
|
||||||
|
(_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0)
|
||||||
|
# ifndef __CYGWIN__
|
||||||
|
# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1
|
||||||
|
# endif
|
||||||
|
# define ISSLASH(C) ((C) == '/' || (C) == '\\')
|
||||||
|
#else
|
||||||
|
# define FILE_SYSTEM_PREFIX_LEN(Filename) 0
|
||||||
|
# define ISSLASH(C) ((C) == '/')
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
|
||||||
|
# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
|
||||||
|
# define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)])
|
||||||
|
# else
|
||||||
|
# define IS_ABSOLUTE_FILE_NAME(F) \
|
||||||
|
(ISSLASH ((F)[0]) || FILE_SYSTEM_PREFIX_LEN (F) != 0)
|
||||||
|
#endif
|
||||||
|
#define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F))
|
||||||
|
|
||||||
|
#endif /* DOSNAME_H_ */
|
||||||
274
lib/errno.in.h
Normal file
274
lib/errno.in.h
Normal file
|
|
@ -0,0 +1,274 @@
|
||||||
|
/* A POSIX-like <errno.h>.
|
||||||
|
|
||||||
|
Copyright (C) 2008-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_ERRNO_H
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
#@INCLUDE_NEXT@ @NEXT_ERRNO_H@
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_ERRNO_H
|
||||||
|
#define _@GUARD_PREFIX@_ERRNO_H
|
||||||
|
|
||||||
|
|
||||||
|
/* On native Windows platforms, many macros are not defined. */
|
||||||
|
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||||
|
|
||||||
|
/* These are the same values as defined by MSVC 10, for interoperability. */
|
||||||
|
|
||||||
|
# ifndef ENOMSG
|
||||||
|
# define ENOMSG 122
|
||||||
|
# define GNULIB_defined_ENOMSG 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EIDRM
|
||||||
|
# define EIDRM 111
|
||||||
|
# define GNULIB_defined_EIDRM 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ENOLINK
|
||||||
|
# define ENOLINK 121
|
||||||
|
# define GNULIB_defined_ENOLINK 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EPROTO
|
||||||
|
# define EPROTO 134
|
||||||
|
# define GNULIB_defined_EPROTO 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EBADMSG
|
||||||
|
# define EBADMSG 104
|
||||||
|
# define GNULIB_defined_EBADMSG 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EOVERFLOW
|
||||||
|
# define EOVERFLOW 132
|
||||||
|
# define GNULIB_defined_EOVERFLOW 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ENOTSUP
|
||||||
|
# define ENOTSUP 129
|
||||||
|
# define GNULIB_defined_ENOTSUP 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ENETRESET
|
||||||
|
# define ENETRESET 117
|
||||||
|
# define GNULIB_defined_ENETRESET 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ECONNABORTED
|
||||||
|
# define ECONNABORTED 106
|
||||||
|
# define GNULIB_defined_ECONNABORTED 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ECANCELED
|
||||||
|
# define ECANCELED 105
|
||||||
|
# define GNULIB_defined_ECANCELED 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EOWNERDEAD
|
||||||
|
# define EOWNERDEAD 133
|
||||||
|
# define GNULIB_defined_EOWNERDEAD 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ENOTRECOVERABLE
|
||||||
|
# define ENOTRECOVERABLE 127
|
||||||
|
# define GNULIB_defined_ENOTRECOVERABLE 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EINPROGRESS
|
||||||
|
# define EINPROGRESS 112
|
||||||
|
# define EALREADY 103
|
||||||
|
# define ENOTSOCK 128
|
||||||
|
# define EDESTADDRREQ 109
|
||||||
|
# define EMSGSIZE 115
|
||||||
|
# define EPROTOTYPE 136
|
||||||
|
# define ENOPROTOOPT 123
|
||||||
|
# define EPROTONOSUPPORT 135
|
||||||
|
# define EOPNOTSUPP 130
|
||||||
|
# define EAFNOSUPPORT 102
|
||||||
|
# define EADDRINUSE 100
|
||||||
|
# define EADDRNOTAVAIL 101
|
||||||
|
# define ENETDOWN 116
|
||||||
|
# define ENETUNREACH 118
|
||||||
|
# define ECONNRESET 108
|
||||||
|
# define ENOBUFS 119
|
||||||
|
# define EISCONN 113
|
||||||
|
# define ENOTCONN 126
|
||||||
|
# define ETIMEDOUT 138
|
||||||
|
# define ECONNREFUSED 107
|
||||||
|
# define ELOOP 114
|
||||||
|
# define EHOSTUNREACH 110
|
||||||
|
# define EWOULDBLOCK 140
|
||||||
|
# define GNULIB_defined_ESOCK 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ETXTBSY
|
||||||
|
# define ETXTBSY 139
|
||||||
|
# define ENODATA 120 /* not required by POSIX */
|
||||||
|
# define ENOSR 124 /* not required by POSIX */
|
||||||
|
# define ENOSTR 125 /* not required by POSIX */
|
||||||
|
# define ETIME 137 /* not required by POSIX */
|
||||||
|
# define EOTHER 131 /* not required by POSIX */
|
||||||
|
# define GNULIB_defined_ESTREAMS 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* These are intentionally the same values as the WSA* error numbers, defined
|
||||||
|
in <winsock2.h>. */
|
||||||
|
# define ESOCKTNOSUPPORT 10044 /* not required by POSIX */
|
||||||
|
# define EPFNOSUPPORT 10046 /* not required by POSIX */
|
||||||
|
# define ESHUTDOWN 10058 /* not required by POSIX */
|
||||||
|
# define ETOOMANYREFS 10059 /* not required by POSIX */
|
||||||
|
# define EHOSTDOWN 10064 /* not required by POSIX */
|
||||||
|
# define EPROCLIM 10067 /* not required by POSIX */
|
||||||
|
# define EUSERS 10068 /* not required by POSIX */
|
||||||
|
# define EDQUOT 10069
|
||||||
|
# define ESTALE 10070
|
||||||
|
# define EREMOTE 10071 /* not required by POSIX */
|
||||||
|
# define GNULIB_defined_EWINSOCK 1
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
/* On OSF/1 5.1, when _XOPEN_SOURCE_EXTENDED is not defined, the macros
|
||||||
|
EMULTIHOP, ENOLINK, EOVERFLOW are not defined. */
|
||||||
|
# if @EMULTIHOP_HIDDEN@
|
||||||
|
# define EMULTIHOP @EMULTIHOP_VALUE@
|
||||||
|
# define GNULIB_defined_EMULTIHOP 1
|
||||||
|
# endif
|
||||||
|
# if @ENOLINK_HIDDEN@
|
||||||
|
# define ENOLINK @ENOLINK_VALUE@
|
||||||
|
# define GNULIB_defined_ENOLINK 1
|
||||||
|
# endif
|
||||||
|
# if @EOVERFLOW_HIDDEN@
|
||||||
|
# define EOVERFLOW @EOVERFLOW_VALUE@
|
||||||
|
# define GNULIB_defined_EOVERFLOW 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
/* On OpenBSD 4.0 and on native Windows, the macros ENOMSG, EIDRM, ENOLINK,
|
||||||
|
EPROTO, EMULTIHOP, EBADMSG, EOVERFLOW, ENOTSUP, ECANCELED are not defined.
|
||||||
|
Likewise, on NonStop Kernel, EDQUOT is not defined.
|
||||||
|
Define them here. Values >= 2000 seem safe to use: Solaris ESTALE = 151,
|
||||||
|
HP-UX EWOULDBLOCK = 246, IRIX EDQUOT = 1133.
|
||||||
|
|
||||||
|
Note: When one of these systems defines some of these macros some day,
|
||||||
|
binaries will have to be recompiled so that they recognizes the new
|
||||||
|
errno values from the system. */
|
||||||
|
|
||||||
|
# ifndef ENOMSG
|
||||||
|
# define ENOMSG 2000
|
||||||
|
# define GNULIB_defined_ENOMSG 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EIDRM
|
||||||
|
# define EIDRM 2001
|
||||||
|
# define GNULIB_defined_EIDRM 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ENOLINK
|
||||||
|
# define ENOLINK 2002
|
||||||
|
# define GNULIB_defined_ENOLINK 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EPROTO
|
||||||
|
# define EPROTO 2003
|
||||||
|
# define GNULIB_defined_EPROTO 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EMULTIHOP
|
||||||
|
# define EMULTIHOP 2004
|
||||||
|
# define GNULIB_defined_EMULTIHOP 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EBADMSG
|
||||||
|
# define EBADMSG 2005
|
||||||
|
# define GNULIB_defined_EBADMSG 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EOVERFLOW
|
||||||
|
# define EOVERFLOW 2006
|
||||||
|
# define GNULIB_defined_EOVERFLOW 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ENOTSUP
|
||||||
|
# define ENOTSUP 2007
|
||||||
|
# define GNULIB_defined_ENOTSUP 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ENETRESET
|
||||||
|
# define ENETRESET 2011
|
||||||
|
# define GNULIB_defined_ENETRESET 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ECONNABORTED
|
||||||
|
# define ECONNABORTED 2012
|
||||||
|
# define GNULIB_defined_ECONNABORTED 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ESTALE
|
||||||
|
# define ESTALE 2009
|
||||||
|
# define GNULIB_defined_ESTALE 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EDQUOT
|
||||||
|
# define EDQUOT 2010
|
||||||
|
# define GNULIB_defined_EDQUOT 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ECANCELED
|
||||||
|
# define ECANCELED 2008
|
||||||
|
# define GNULIB_defined_ECANCELED 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* On many platforms, the macros EOWNERDEAD and ENOTRECOVERABLE are not
|
||||||
|
defined. */
|
||||||
|
|
||||||
|
# ifndef EOWNERDEAD
|
||||||
|
# if defined __sun
|
||||||
|
/* Use the same values as defined for Solaris >= 8, for
|
||||||
|
interoperability. */
|
||||||
|
# define EOWNERDEAD 58
|
||||||
|
# define ENOTRECOVERABLE 59
|
||||||
|
# elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||||
|
/* We have a conflict here: pthreads-win32 defines these values
|
||||||
|
differently than MSVC 10. It's hairy to decide which one to use. */
|
||||||
|
# if defined __MINGW32__ && !defined USE_WINDOWS_THREADS
|
||||||
|
/* Use the same values as defined by pthreads-win32, for
|
||||||
|
interoperability. */
|
||||||
|
# define EOWNERDEAD 43
|
||||||
|
# define ENOTRECOVERABLE 44
|
||||||
|
# else
|
||||||
|
/* Use the same values as defined by MSVC 10, for
|
||||||
|
interoperability. */
|
||||||
|
# define EOWNERDEAD 133
|
||||||
|
# define ENOTRECOVERABLE 127
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# define EOWNERDEAD 2013
|
||||||
|
# define ENOTRECOVERABLE 2014
|
||||||
|
# endif
|
||||||
|
# define GNULIB_defined_EOWNERDEAD 1
|
||||||
|
# define GNULIB_defined_ENOTRECOVERABLE 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_ERRNO_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_ERRNO_H */
|
||||||
147
lib/float+.h
Normal file
147
lib/float+.h
Normal file
|
|
@ -0,0 +1,147 @@
|
||||||
|
/* Supplemental information about the floating-point formats.
|
||||||
|
Copyright (C) 2007, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 2007.
|
||||||
|
|
||||||
|
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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _FLOATPLUS_H
|
||||||
|
#define _FLOATPLUS_H
|
||||||
|
|
||||||
|
#include <float.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
/* Number of bits in the mantissa of a floating-point number, including the
|
||||||
|
"hidden bit". */
|
||||||
|
#if FLT_RADIX == 2
|
||||||
|
# define FLT_MANT_BIT FLT_MANT_DIG
|
||||||
|
# define DBL_MANT_BIT DBL_MANT_DIG
|
||||||
|
# define LDBL_MANT_BIT LDBL_MANT_DIG
|
||||||
|
#elif FLT_RADIX == 4
|
||||||
|
# define FLT_MANT_BIT (FLT_MANT_DIG * 2)
|
||||||
|
# define DBL_MANT_BIT (DBL_MANT_DIG * 2)
|
||||||
|
# define LDBL_MANT_BIT (LDBL_MANT_DIG * 2)
|
||||||
|
#elif FLT_RADIX == 16
|
||||||
|
# define FLT_MANT_BIT (FLT_MANT_DIG * 4)
|
||||||
|
# define DBL_MANT_BIT (DBL_MANT_DIG * 4)
|
||||||
|
# define LDBL_MANT_BIT (LDBL_MANT_DIG * 4)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Bit mask that can be used to mask the exponent, as an unsigned number. */
|
||||||
|
#define FLT_EXP_MASK ((FLT_MAX_EXP - FLT_MIN_EXP) | 7)
|
||||||
|
#define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7)
|
||||||
|
#define LDBL_EXP_MASK ((LDBL_MAX_EXP - LDBL_MIN_EXP) | 7)
|
||||||
|
|
||||||
|
/* Number of bits used for the exponent of a floating-point number, including
|
||||||
|
the exponent's sign. */
|
||||||
|
#define FLT_EXP_BIT \
|
||||||
|
(FLT_EXP_MASK < 0x100 ? 8 : \
|
||||||
|
FLT_EXP_MASK < 0x200 ? 9 : \
|
||||||
|
FLT_EXP_MASK < 0x400 ? 10 : \
|
||||||
|
FLT_EXP_MASK < 0x800 ? 11 : \
|
||||||
|
FLT_EXP_MASK < 0x1000 ? 12 : \
|
||||||
|
FLT_EXP_MASK < 0x2000 ? 13 : \
|
||||||
|
FLT_EXP_MASK < 0x4000 ? 14 : \
|
||||||
|
FLT_EXP_MASK < 0x8000 ? 15 : \
|
||||||
|
FLT_EXP_MASK < 0x10000 ? 16 : \
|
||||||
|
FLT_EXP_MASK < 0x20000 ? 17 : \
|
||||||
|
FLT_EXP_MASK < 0x40000 ? 18 : \
|
||||||
|
FLT_EXP_MASK < 0x80000 ? 19 : \
|
||||||
|
FLT_EXP_MASK < 0x100000 ? 20 : \
|
||||||
|
FLT_EXP_MASK < 0x200000 ? 21 : \
|
||||||
|
FLT_EXP_MASK < 0x400000 ? 22 : \
|
||||||
|
FLT_EXP_MASK < 0x800000 ? 23 : \
|
||||||
|
FLT_EXP_MASK < 0x1000000 ? 24 : \
|
||||||
|
FLT_EXP_MASK < 0x2000000 ? 25 : \
|
||||||
|
FLT_EXP_MASK < 0x4000000 ? 26 : \
|
||||||
|
FLT_EXP_MASK < 0x8000000 ? 27 : \
|
||||||
|
FLT_EXP_MASK < 0x10000000 ? 28 : \
|
||||||
|
FLT_EXP_MASK < 0x20000000 ? 29 : \
|
||||||
|
FLT_EXP_MASK < 0x40000000 ? 30 : \
|
||||||
|
FLT_EXP_MASK <= 0x7fffffff ? 31 : \
|
||||||
|
32)
|
||||||
|
#define DBL_EXP_BIT \
|
||||||
|
(DBL_EXP_MASK < 0x100 ? 8 : \
|
||||||
|
DBL_EXP_MASK < 0x200 ? 9 : \
|
||||||
|
DBL_EXP_MASK < 0x400 ? 10 : \
|
||||||
|
DBL_EXP_MASK < 0x800 ? 11 : \
|
||||||
|
DBL_EXP_MASK < 0x1000 ? 12 : \
|
||||||
|
DBL_EXP_MASK < 0x2000 ? 13 : \
|
||||||
|
DBL_EXP_MASK < 0x4000 ? 14 : \
|
||||||
|
DBL_EXP_MASK < 0x8000 ? 15 : \
|
||||||
|
DBL_EXP_MASK < 0x10000 ? 16 : \
|
||||||
|
DBL_EXP_MASK < 0x20000 ? 17 : \
|
||||||
|
DBL_EXP_MASK < 0x40000 ? 18 : \
|
||||||
|
DBL_EXP_MASK < 0x80000 ? 19 : \
|
||||||
|
DBL_EXP_MASK < 0x100000 ? 20 : \
|
||||||
|
DBL_EXP_MASK < 0x200000 ? 21 : \
|
||||||
|
DBL_EXP_MASK < 0x400000 ? 22 : \
|
||||||
|
DBL_EXP_MASK < 0x800000 ? 23 : \
|
||||||
|
DBL_EXP_MASK < 0x1000000 ? 24 : \
|
||||||
|
DBL_EXP_MASK < 0x2000000 ? 25 : \
|
||||||
|
DBL_EXP_MASK < 0x4000000 ? 26 : \
|
||||||
|
DBL_EXP_MASK < 0x8000000 ? 27 : \
|
||||||
|
DBL_EXP_MASK < 0x10000000 ? 28 : \
|
||||||
|
DBL_EXP_MASK < 0x20000000 ? 29 : \
|
||||||
|
DBL_EXP_MASK < 0x40000000 ? 30 : \
|
||||||
|
DBL_EXP_MASK <= 0x7fffffff ? 31 : \
|
||||||
|
32)
|
||||||
|
#define LDBL_EXP_BIT \
|
||||||
|
(LDBL_EXP_MASK < 0x100 ? 8 : \
|
||||||
|
LDBL_EXP_MASK < 0x200 ? 9 : \
|
||||||
|
LDBL_EXP_MASK < 0x400 ? 10 : \
|
||||||
|
LDBL_EXP_MASK < 0x800 ? 11 : \
|
||||||
|
LDBL_EXP_MASK < 0x1000 ? 12 : \
|
||||||
|
LDBL_EXP_MASK < 0x2000 ? 13 : \
|
||||||
|
LDBL_EXP_MASK < 0x4000 ? 14 : \
|
||||||
|
LDBL_EXP_MASK < 0x8000 ? 15 : \
|
||||||
|
LDBL_EXP_MASK < 0x10000 ? 16 : \
|
||||||
|
LDBL_EXP_MASK < 0x20000 ? 17 : \
|
||||||
|
LDBL_EXP_MASK < 0x40000 ? 18 : \
|
||||||
|
LDBL_EXP_MASK < 0x80000 ? 19 : \
|
||||||
|
LDBL_EXP_MASK < 0x100000 ? 20 : \
|
||||||
|
LDBL_EXP_MASK < 0x200000 ? 21 : \
|
||||||
|
LDBL_EXP_MASK < 0x400000 ? 22 : \
|
||||||
|
LDBL_EXP_MASK < 0x800000 ? 23 : \
|
||||||
|
LDBL_EXP_MASK < 0x1000000 ? 24 : \
|
||||||
|
LDBL_EXP_MASK < 0x2000000 ? 25 : \
|
||||||
|
LDBL_EXP_MASK < 0x4000000 ? 26 : \
|
||||||
|
LDBL_EXP_MASK < 0x8000000 ? 27 : \
|
||||||
|
LDBL_EXP_MASK < 0x10000000 ? 28 : \
|
||||||
|
LDBL_EXP_MASK < 0x20000000 ? 29 : \
|
||||||
|
LDBL_EXP_MASK < 0x40000000 ? 30 : \
|
||||||
|
LDBL_EXP_MASK <= 0x7fffffff ? 31 : \
|
||||||
|
32)
|
||||||
|
|
||||||
|
/* Number of bits used for a floating-point number: the mantissa (not
|
||||||
|
counting the "hidden bit", since it may or may not be explicit), the
|
||||||
|
exponent, and the sign. */
|
||||||
|
#define FLT_TOTAL_BIT ((FLT_MANT_BIT - 1) + FLT_EXP_BIT + 1)
|
||||||
|
#define DBL_TOTAL_BIT ((DBL_MANT_BIT - 1) + DBL_EXP_BIT + 1)
|
||||||
|
#define LDBL_TOTAL_BIT ((LDBL_MANT_BIT - 1) + LDBL_EXP_BIT + 1)
|
||||||
|
|
||||||
|
/* Number of bytes used for a floating-point number.
|
||||||
|
This can be smaller than the 'sizeof'. For example, on i386 systems,
|
||||||
|
'long double' most often have LDBL_MANT_BIT = 64, LDBL_EXP_BIT = 16, hence
|
||||||
|
LDBL_TOTAL_BIT = 80 bits, i.e. 10 bytes of consecutive memory, but
|
||||||
|
sizeof (long double) = 12 or = 16. */
|
||||||
|
#define SIZEOF_FLT ((FLT_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
|
||||||
|
#define SIZEOF_DBL ((DBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
|
||||||
|
#define SIZEOF_LDBL ((LDBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
|
||||||
|
|
||||||
|
/* Verify that SIZEOF_FLT <= sizeof (float) etc. */
|
||||||
|
typedef int verify_sizeof_flt[SIZEOF_FLT <= sizeof (float) ? 1 : -1];
|
||||||
|
typedef int verify_sizeof_dbl[SIZEOF_DBL <= sizeof (double) ? 1 : - 1];
|
||||||
|
typedef int verify_sizeof_ldbl[SIZEOF_LDBL <= sizeof (long double) ? 1 : - 1];
|
||||||
|
|
||||||
|
#endif /* _FLOATPLUS_H */
|
||||||
33
lib/float.c
Normal file
33
lib/float.c
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
/* Auxiliary definitions for <float.h>.
|
||||||
|
Copyright (C) 2011-2012 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 2011.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
|
#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
|
||||||
|
const union gl_long_double_union gl_LDBL_MAX =
|
||||||
|
{ { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL } };
|
||||||
|
#elif defined __i386__
|
||||||
|
const union gl_long_double_union gl_LDBL_MAX =
|
||||||
|
{ { 0xFFFFFFFF, 0xFFFFFFFF, 32766 } };
|
||||||
|
#else
|
||||||
|
/* This declaration is solely to ensure that after preprocessing
|
||||||
|
this file is never empty. */
|
||||||
|
typedef int dummy;
|
||||||
|
#endif
|
||||||
188
lib/float.in.h
Normal file
188
lib/float.in.h
Normal file
|
|
@ -0,0 +1,188 @@
|
||||||
|
/* A correct <float.h>.
|
||||||
|
|
||||||
|
Copyright (C) 2007-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_FLOAT_H
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
#@INCLUDE_NEXT@ @NEXT_FLOAT_H@
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_FLOAT_H
|
||||||
|
#define _@GUARD_PREFIX@_FLOAT_H
|
||||||
|
|
||||||
|
/* 'long double' properties. */
|
||||||
|
|
||||||
|
#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
|
||||||
|
/* Number of mantissa units, in base FLT_RADIX. */
|
||||||
|
# undef LDBL_MANT_DIG
|
||||||
|
# define LDBL_MANT_DIG 64
|
||||||
|
/* Number of decimal digits that is sufficient for representing a number. */
|
||||||
|
# undef LDBL_DIG
|
||||||
|
# define LDBL_DIG 18
|
||||||
|
/* x-1 where x is the smallest representable number > 1. */
|
||||||
|
# undef LDBL_EPSILON
|
||||||
|
# define LDBL_EPSILON 1.0842021724855044340E-19L
|
||||||
|
/* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */
|
||||||
|
# undef LDBL_MIN_EXP
|
||||||
|
# define LDBL_MIN_EXP (-16381)
|
||||||
|
/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */
|
||||||
|
# undef LDBL_MAX_EXP
|
||||||
|
# define LDBL_MAX_EXP 16384
|
||||||
|
/* Minimum positive normalized number. */
|
||||||
|
# undef LDBL_MIN
|
||||||
|
# define LDBL_MIN 3.3621031431120935063E-4932L
|
||||||
|
/* Maximum representable finite number. */
|
||||||
|
# undef LDBL_MAX
|
||||||
|
# define LDBL_MAX 1.1897314953572317650E+4932L
|
||||||
|
/* Minimum e such that 10^e is in the range of normalized numbers. */
|
||||||
|
# undef LDBL_MIN_10_EXP
|
||||||
|
# define LDBL_MIN_10_EXP (-4931)
|
||||||
|
/* Maximum e such that 10^e is in the range of representable finite numbers. */
|
||||||
|
# undef LDBL_MAX_10_EXP
|
||||||
|
# define LDBL_MAX_10_EXP 4932
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* On FreeBSD/x86 6.4, the 'long double' type really has only 53 bits of
|
||||||
|
precision in the compiler but 64 bits of precision at runtime. See
|
||||||
|
<http://lists.gnu.org/archive/html/bug-gnulib/2008-07/msg00063.html>. */
|
||||||
|
#if defined __i386__ && defined __FreeBSD__
|
||||||
|
/* Number of mantissa units, in base FLT_RADIX. */
|
||||||
|
# undef LDBL_MANT_DIG
|
||||||
|
# define LDBL_MANT_DIG 64
|
||||||
|
/* Number of decimal digits that is sufficient for representing a number. */
|
||||||
|
# undef LDBL_DIG
|
||||||
|
# define LDBL_DIG 18
|
||||||
|
/* x-1 where x is the smallest representable number > 1. */
|
||||||
|
# undef LDBL_EPSILON
|
||||||
|
# define LDBL_EPSILON 1.084202172485504434007452800869941711426e-19L /* 2^-63 */
|
||||||
|
/* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */
|
||||||
|
# undef LDBL_MIN_EXP
|
||||||
|
# define LDBL_MIN_EXP (-16381)
|
||||||
|
/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */
|
||||||
|
# undef LDBL_MAX_EXP
|
||||||
|
# define LDBL_MAX_EXP 16384
|
||||||
|
/* Minimum positive normalized number. */
|
||||||
|
# undef LDBL_MIN
|
||||||
|
# define LDBL_MIN 3.3621031431120935E-4932L /* = 0x1p-16382L */
|
||||||
|
/* Maximum representable finite number. */
|
||||||
|
# undef LDBL_MAX
|
||||||
|
/* LDBL_MAX is represented as { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }.
|
||||||
|
But the largest literal that GCC allows us to write is
|
||||||
|
0x0.fffffffffffff8p16384L = { 0xFFFFF800, 0xFFFFFFFF, 32766 }.
|
||||||
|
So, define it like this through a reference to an external variable
|
||||||
|
|
||||||
|
const unsigned int LDBL_MAX[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 32766 };
|
||||||
|
extern const long double LDBL_MAX;
|
||||||
|
|
||||||
|
Unfortunately, this is not a constant expression. */
|
||||||
|
union gl_long_double_union
|
||||||
|
{
|
||||||
|
struct { unsigned int lo; unsigned int hi; unsigned int exponent; } xd;
|
||||||
|
long double ld;
|
||||||
|
};
|
||||||
|
extern const union gl_long_double_union gl_LDBL_MAX;
|
||||||
|
# define LDBL_MAX (gl_LDBL_MAX.ld)
|
||||||
|
/* Minimum e such that 10^e is in the range of normalized numbers. */
|
||||||
|
# undef LDBL_MIN_10_EXP
|
||||||
|
# define LDBL_MIN_10_EXP (-4931)
|
||||||
|
/* Maximum e such that 10^e is in the range of representable finite numbers. */
|
||||||
|
# undef LDBL_MAX_10_EXP
|
||||||
|
# define LDBL_MAX_10_EXP 4932
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* On AIX 7.1 with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_MAX are
|
||||||
|
wrong.
|
||||||
|
On Linux/PowerPC with gcc 4.4, the value of LDBL_MAX is wrong. */
|
||||||
|
#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
|
||||||
|
# undef LDBL_MIN_EXP
|
||||||
|
# define LDBL_MIN_EXP DBL_MIN_EXP
|
||||||
|
# undef LDBL_MIN_10_EXP
|
||||||
|
# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
|
||||||
|
# undef LDBL_MIN
|
||||||
|
# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
|
||||||
|
#endif
|
||||||
|
#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
|
||||||
|
# undef LDBL_MAX
|
||||||
|
/* LDBL_MAX is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xFFFFFFFF }.
|
||||||
|
It is not easy to define:
|
||||||
|
#define LDBL_MAX 1.79769313486231580793728971405302307166e308L
|
||||||
|
is too small, whereas
|
||||||
|
#define LDBL_MAX 1.79769313486231580793728971405302307167e308L
|
||||||
|
is too large. Apparently a bug in GCC decimal-to-binary conversion.
|
||||||
|
Also, I can't get values larger than
|
||||||
|
#define LDBL63 ((long double) (1ULL << 63))
|
||||||
|
#define LDBL882 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
|
||||||
|
#define LDBL945 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
|
||||||
|
#define LDBL1008 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
|
||||||
|
#define LDBL_MAX (LDBL1008 * 65535.0L + LDBL945 * (long double) 9223372036821221375ULL + LDBL882 * (long double) 4611686018427387904ULL)
|
||||||
|
which is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xF8000000 }.
|
||||||
|
So, define it like this through a reference to an external variable
|
||||||
|
|
||||||
|
const double LDBL_MAX[2] = { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL };
|
||||||
|
extern const long double LDBL_MAX;
|
||||||
|
|
||||||
|
or through a pointer cast
|
||||||
|
|
||||||
|
#define LDBL_MAX \
|
||||||
|
(*(const long double *) (double[]) { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL })
|
||||||
|
|
||||||
|
Unfortunately, this is not a constant expression, and the latter expression
|
||||||
|
does not work well when GCC is optimizing.. */
|
||||||
|
union gl_long_double_union
|
||||||
|
{
|
||||||
|
struct { double hi; double lo; } dd;
|
||||||
|
long double ld;
|
||||||
|
};
|
||||||
|
extern const union gl_long_double_union gl_LDBL_MAX;
|
||||||
|
# define LDBL_MAX (gl_LDBL_MAX.ld)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* On IRIX 6.5, with cc, the value of LDBL_MANT_DIG is wrong.
|
||||||
|
On IRIX 6.5, with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_EPSILON
|
||||||
|
are wrong. */
|
||||||
|
#if defined __sgi && (LDBL_MANT_DIG >= 106)
|
||||||
|
# undef LDBL_MANT_DIG
|
||||||
|
# define LDBL_MANT_DIG 106
|
||||||
|
# if defined __GNUC__
|
||||||
|
# undef LDBL_MIN_EXP
|
||||||
|
# define LDBL_MIN_EXP DBL_MIN_EXP
|
||||||
|
# undef LDBL_MIN_10_EXP
|
||||||
|
# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
|
||||||
|
# undef LDBL_MIN
|
||||||
|
# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
|
||||||
|
# undef LDBL_EPSILON
|
||||||
|
# define LDBL_EPSILON 2.46519032881566189191165176650870696773e-32L /* 2^-105 */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @REPLACE_ITOLD@
|
||||||
|
/* Pull in a function that fixes the 'int' to 'long double' conversion
|
||||||
|
of glibc 2.7. */
|
||||||
|
extern
|
||||||
|
# ifdef __cplusplus
|
||||||
|
"C"
|
||||||
|
# endif
|
||||||
|
void _Qp_itoq (long double *, int);
|
||||||
|
static void (*_gl_float_fix_itold) (long double *, int) = _Qp_itoq;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_FLOAT_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_FLOAT_H */
|
||||||
1245
lib/getopt.c
Normal file
1245
lib/getopt.c
Normal file
File diff suppressed because it is too large
Load diff
253
lib/getopt.in.h
Normal file
253
lib/getopt.in.h
Normal file
|
|
@ -0,0 +1,253 @@
|
||||||
|
/* Declarations for getopt.
|
||||||
|
Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2007, 2009-2012 Free Software
|
||||||
|
Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_GETOPT_H
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. We must
|
||||||
|
also inform the replacement unistd.h to not recursively use
|
||||||
|
<getopt.h>; our definitions will be present soon enough. */
|
||||||
|
#if @HAVE_GETOPT_H@
|
||||||
|
# define _GL_SYSTEM_GETOPT
|
||||||
|
# @INCLUDE_NEXT@ @NEXT_GETOPT_H@
|
||||||
|
# undef _GL_SYSTEM_GETOPT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_GETOPT_H
|
||||||
|
|
||||||
|
#ifndef __need_getopt
|
||||||
|
# define _@GUARD_PREFIX@_GETOPT_H 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Standalone applications should #define __GETOPT_PREFIX to an
|
||||||
|
identifier that prefixes the external functions and variables
|
||||||
|
defined in this header. When this happens, include the
|
||||||
|
headers that might declare getopt so that they will not cause
|
||||||
|
confusion if included after this file (if the system had <getopt.h>,
|
||||||
|
we have already included it). Then systematically rename
|
||||||
|
identifiers so that they do not collide with the system functions
|
||||||
|
and variables. Renaming avoids problems with some compilers and
|
||||||
|
linkers. */
|
||||||
|
#if defined __GETOPT_PREFIX && !defined __need_getopt
|
||||||
|
# if !@HAVE_GETOPT_H@
|
||||||
|
# include <stdlib.h>
|
||||||
|
# include <stdio.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
# endif
|
||||||
|
# undef __need_getopt
|
||||||
|
# undef getopt
|
||||||
|
# undef getopt_long
|
||||||
|
# undef getopt_long_only
|
||||||
|
# undef optarg
|
||||||
|
# undef opterr
|
||||||
|
# undef optind
|
||||||
|
# undef optopt
|
||||||
|
# undef option
|
||||||
|
# define __GETOPT_CONCAT(x, y) x ## y
|
||||||
|
# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y)
|
||||||
|
# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y)
|
||||||
|
# define getopt __GETOPT_ID (getopt)
|
||||||
|
# define getopt_long __GETOPT_ID (getopt_long)
|
||||||
|
# define getopt_long_only __GETOPT_ID (getopt_long_only)
|
||||||
|
# define optarg __GETOPT_ID (optarg)
|
||||||
|
# define opterr __GETOPT_ID (opterr)
|
||||||
|
# define optind __GETOPT_ID (optind)
|
||||||
|
# define optopt __GETOPT_ID (optopt)
|
||||||
|
# define option __GETOPT_ID (option)
|
||||||
|
# define _getopt_internal __GETOPT_ID (getopt_internal)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Standalone applications get correct prototypes for getopt_long and
|
||||||
|
getopt_long_only; they declare "char **argv". libc uses prototypes
|
||||||
|
with "char *const *argv" that are incorrect because getopt_long and
|
||||||
|
getopt_long_only can permute argv; this is required for backward
|
||||||
|
compatibility (e.g., for LSB 2.0.1).
|
||||||
|
|
||||||
|
This used to be '#if defined __GETOPT_PREFIX && !defined __need_getopt',
|
||||||
|
but it caused redefinition warnings if both unistd.h and getopt.h were
|
||||||
|
included, since unistd.h includes getopt.h having previously defined
|
||||||
|
__need_getopt.
|
||||||
|
|
||||||
|
The only place where __getopt_argv_const is used is in definitions
|
||||||
|
of getopt_long and getopt_long_only below, but these are visible
|
||||||
|
only if __need_getopt is not defined, so it is quite safe to rewrite
|
||||||
|
the conditional as follows:
|
||||||
|
*/
|
||||||
|
#if !defined __need_getopt
|
||||||
|
# if defined __GETOPT_PREFIX
|
||||||
|
# define __getopt_argv_const /* empty */
|
||||||
|
# else
|
||||||
|
# define __getopt_argv_const const
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If __GNU_LIBRARY__ is not already defined, either we are being used
|
||||||
|
standalone, or this is the first header included in the source file.
|
||||||
|
If we are being used with glibc, we need to include <features.h>, but
|
||||||
|
that does not exist if we are standalone. So: if __GNU_LIBRARY__ is
|
||||||
|
not defined, include <ctype.h>, which will pull in <features.h> for us
|
||||||
|
if it's from glibc. (Why ctype.h? It's guaranteed to exist and it
|
||||||
|
doesn't flood the namespace with stuff the way some other headers do.) */
|
||||||
|
#if !defined __GNU_LIBRARY__
|
||||||
|
# include <ctype.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __THROW
|
||||||
|
# ifndef __GNUC_PREREQ
|
||||||
|
# define __GNUC_PREREQ(maj, min) (0)
|
||||||
|
# endif
|
||||||
|
# if defined __cplusplus && __GNUC_PREREQ (2,8)
|
||||||
|
# define __THROW throw ()
|
||||||
|
# else
|
||||||
|
# define __THROW
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The definition of _GL_ARG_NONNULL is copied here. */
|
||||||
|
|
||||||
|
#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;
|
||||||
|
|
||||||
|
#ifndef __need_getopt
|
||||||
|
/* 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. */
|
||||||
|
|
||||||
|
# if !GNULIB_defined_struct_option
|
||||||
|
struct option
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
/* 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;
|
||||||
|
};
|
||||||
|
# define GNULIB_defined_struct_option 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Names for the values of the 'has_arg' field of 'struct option'. */
|
||||||
|
|
||||||
|
# define no_argument 0
|
||||||
|
# define required_argument 1
|
||||||
|
# define optional_argument 2
|
||||||
|
#endif /* need getopt */
|
||||||
|
|
||||||
|
|
||||||
|
/* Get definitions and prototypes for functions to process the
|
||||||
|
arguments in ARGV (ARGC of them, minus the program name) for
|
||||||
|
options given in OPTS.
|
||||||
|
|
||||||
|
Return the option character from OPTS just read. Return -1 when
|
||||||
|
there are no more options. For unrecognized options, or options
|
||||||
|
missing arguments, 'optopt' is set to the option letter, and '?' is
|
||||||
|
returned.
|
||||||
|
|
||||||
|
The OPTS string is a list of characters which are recognized option
|
||||||
|
letters, optionally followed by colons, specifying that that letter
|
||||||
|
takes an argument, to be placed in 'optarg'.
|
||||||
|
|
||||||
|
If a letter in OPTS is followed by two colons, its argument is
|
||||||
|
optional. This behavior is specific to the GNU 'getopt'.
|
||||||
|
|
||||||
|
The argument '--' causes premature termination of argument
|
||||||
|
scanning, explicitly telling 'getopt' that there are no more
|
||||||
|
options.
|
||||||
|
|
||||||
|
If OPTS begins with '-', then non-option arguments are treated as
|
||||||
|
arguments to the option '\1'. This behavior is specific to the GNU
|
||||||
|
'getopt'. If OPTS begins with '+', or POSIXLY_CORRECT is set in
|
||||||
|
the environment, then do not permute arguments. */
|
||||||
|
|
||||||
|
extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
|
||||||
|
__THROW _GL_ARG_NONNULL ((2, 3));
|
||||||
|
|
||||||
|
#ifndef __need_getopt
|
||||||
|
extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv,
|
||||||
|
const char *__shortopts,
|
||||||
|
const struct option *__longopts, int *__longind)
|
||||||
|
__THROW _GL_ARG_NONNULL ((2, 3));
|
||||||
|
extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
|
||||||
|
const char *__shortopts,
|
||||||
|
const struct option *__longopts, int *__longind)
|
||||||
|
__THROW _GL_ARG_NONNULL ((2, 3));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Make sure we later can get all the definitions and declarations. */
|
||||||
|
#undef __need_getopt
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_GETOPT_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_GETOPT_H */
|
||||||
170
lib/getopt1.c
Normal file
170
lib/getopt1.c
Normal file
|
|
@ -0,0 +1,170 @@
|
||||||
|
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
||||||
|
Copyright (C) 1987-1994, 1996-1998, 2004, 2006, 2009-2012 Free Software
|
||||||
|
Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <getopt.h>
|
||||||
|
#else
|
||||||
|
# include <config.h>
|
||||||
|
# include "getopt.h"
|
||||||
|
#endif
|
||||||
|
#include "getopt_int.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* 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 (int argc, char *__getopt_argv_const *argv, const char *options,
|
||||||
|
const struct option *long_options, int *opt_index)
|
||||||
|
{
|
||||||
|
return _getopt_internal (argc, (char **) argv, options, long_options,
|
||||||
|
opt_index, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
_getopt_long_r (int argc, char **argv, const char *options,
|
||||||
|
const struct option *long_options, int *opt_index,
|
||||||
|
struct _getopt_data *d)
|
||||||
|
{
|
||||||
|
return _getopt_internal_r (argc, argv, options, long_options, opt_index,
|
||||||
|
0, d, 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 (int argc, char *__getopt_argv_const *argv,
|
||||||
|
const char *options,
|
||||||
|
const struct option *long_options, int *opt_index)
|
||||||
|
{
|
||||||
|
return _getopt_internal (argc, (char **) argv, options, long_options,
|
||||||
|
opt_index, 1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
_getopt_long_only_r (int argc, char **argv, const char *options,
|
||||||
|
const struct option *long_options, int *opt_index,
|
||||||
|
struct _getopt_data *d)
|
||||||
|
{
|
||||||
|
return _getopt_internal_r (argc, argv, options, long_options, opt_index,
|
||||||
|
1, d, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef TEST
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
int digit_optind = 0;
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
int this_option_optind = optind ? optind : 1;
|
||||||
|
int option_index = 0;
|
||||||
|
static const 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 */
|
||||||
135
lib/getopt_int.h
Normal file
135
lib/getopt_int.h
Normal file
|
|
@ -0,0 +1,135 @@
|
||||||
|
/* Internal declarations for getopt.
|
||||||
|
Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2004, 2009-2012 Free Software
|
||||||
|
Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _GETOPT_INT_H
|
||||||
|
#define _GETOPT_INT_H 1
|
||||||
|
|
||||||
|
#include <getopt.h>
|
||||||
|
|
||||||
|
extern int _getopt_internal (int ___argc, char **___argv,
|
||||||
|
const char *__shortopts,
|
||||||
|
const struct option *__longopts, int *__longind,
|
||||||
|
int __long_only, int __posixly_correct);
|
||||||
|
|
||||||
|
|
||||||
|
/* Reentrant versions which can handle parsing multiple argument
|
||||||
|
vectors at the same time. */
|
||||||
|
|
||||||
|
/* 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, or by calling getopt.
|
||||||
|
|
||||||
|
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. */
|
||||||
|
|
||||||
|
enum __ord
|
||||||
|
{
|
||||||
|
REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Data type for reentrant functions. */
|
||||||
|
struct _getopt_data
|
||||||
|
{
|
||||||
|
/* These have exactly the same meaning as the corresponding global
|
||||||
|
variables, except that they are used for the reentrant
|
||||||
|
versions of getopt. */
|
||||||
|
int optind;
|
||||||
|
int opterr;
|
||||||
|
int optopt;
|
||||||
|
char *optarg;
|
||||||
|
|
||||||
|
/* Internal members. */
|
||||||
|
|
||||||
|
/* True if the internal members have been initialized. */
|
||||||
|
int __initialized;
|
||||||
|
|
||||||
|
/* 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. */
|
||||||
|
char *__nextchar;
|
||||||
|
|
||||||
|
/* See __ord above. */
|
||||||
|
enum __ord __ordering;
|
||||||
|
|
||||||
|
/* If the POSIXLY_CORRECT environment variable is set
|
||||||
|
or getopt was called. */
|
||||||
|
int __posixly_correct;
|
||||||
|
|
||||||
|
|
||||||
|
/* 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. */
|
||||||
|
|
||||||
|
int __first_nonopt;
|
||||||
|
int __last_nonopt;
|
||||||
|
|
||||||
|
#if defined _LIBC && defined USE_NONOPTION_FLAGS
|
||||||
|
int __nonoption_flags_max_len;
|
||||||
|
int __nonoption_flags_len;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The initializer is necessary to set OPTIND and OPTERR to their
|
||||||
|
default values and to clear the initialization flag. */
|
||||||
|
#define _GETOPT_DATA_INITIALIZER { 1, 1 }
|
||||||
|
|
||||||
|
extern int _getopt_internal_r (int ___argc, char **___argv,
|
||||||
|
const char *__shortopts,
|
||||||
|
const struct option *__longopts, int *__longind,
|
||||||
|
int __long_only, struct _getopt_data *__data,
|
||||||
|
int __posixly_correct);
|
||||||
|
|
||||||
|
extern int _getopt_long_r (int ___argc, char **___argv,
|
||||||
|
const char *__shortopts,
|
||||||
|
const struct option *__longopts, int *__longind,
|
||||||
|
struct _getopt_data *__data);
|
||||||
|
|
||||||
|
extern int _getopt_long_only_r (int ___argc, char **___argv,
|
||||||
|
const char *__shortopts,
|
||||||
|
const struct option *__longopts,
|
||||||
|
int *__longind,
|
||||||
|
struct _getopt_data *__data);
|
||||||
|
|
||||||
|
#endif /* getopt_int.h */
|
||||||
288
lib/gettext.h
Normal file
288
lib/gettext.h
Normal file
|
|
@ -0,0 +1,288 @@
|
||||||
|
/* Convenience header for conditional use of GNU <libintl.h>.
|
||||||
|
Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _LIBGETTEXT_H
|
||||||
|
#define _LIBGETTEXT_H 1
|
||||||
|
|
||||||
|
/* NLS can be disabled through the configure --disable-nls option. */
|
||||||
|
#if ENABLE_NLS
|
||||||
|
|
||||||
|
/* Get declarations of GNU message catalog functions. */
|
||||||
|
# include <libintl.h>
|
||||||
|
|
||||||
|
/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
|
||||||
|
the gettext() and ngettext() macros. This is an alternative to calling
|
||||||
|
textdomain(), and is useful for libraries. */
|
||||||
|
# ifdef DEFAULT_TEXT_DOMAIN
|
||||||
|
# undef gettext
|
||||||
|
# define gettext(Msgid) \
|
||||||
|
dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
|
||||||
|
# undef ngettext
|
||||||
|
# define ngettext(Msgid1, Msgid2, N) \
|
||||||
|
dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
|
||||||
|
chokes if dcgettext is defined as a macro. So include it now, to make
|
||||||
|
later inclusions of <locale.h> a NOP. We don't include <libintl.h>
|
||||||
|
as well because people using "gettext.h" will not include <libintl.h>,
|
||||||
|
and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
|
||||||
|
is OK. */
|
||||||
|
#if defined(__sun)
|
||||||
|
# include <locale.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
|
||||||
|
<libintl.h>, which chokes if dcgettext is defined as a macro. So include
|
||||||
|
it now, to make later inclusions of <libintl.h> a NOP. */
|
||||||
|
#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
|
||||||
|
# include <cstdlib>
|
||||||
|
# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H
|
||||||
|
# include <libintl.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Disabled NLS.
|
||||||
|
The casts to 'const char *' serve the purpose of producing warnings
|
||||||
|
for invalid uses of the value returned from these functions.
|
||||||
|
On pre-ANSI systems without 'const', the config.h file is supposed to
|
||||||
|
contain "#define const". */
|
||||||
|
# undef gettext
|
||||||
|
# define gettext(Msgid) ((const char *) (Msgid))
|
||||||
|
# undef dgettext
|
||||||
|
# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
|
||||||
|
# undef dcgettext
|
||||||
|
# define dcgettext(Domainname, Msgid, Category) \
|
||||||
|
((void) (Category), dgettext (Domainname, Msgid))
|
||||||
|
# undef ngettext
|
||||||
|
# define ngettext(Msgid1, Msgid2, N) \
|
||||||
|
((N) == 1 \
|
||||||
|
? ((void) (Msgid2), (const char *) (Msgid1)) \
|
||||||
|
: ((void) (Msgid1), (const char *) (Msgid2)))
|
||||||
|
# undef dngettext
|
||||||
|
# define dngettext(Domainname, Msgid1, Msgid2, N) \
|
||||||
|
((void) (Domainname), ngettext (Msgid1, Msgid2, N))
|
||||||
|
# undef dcngettext
|
||||||
|
# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
|
||||||
|
((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N))
|
||||||
|
# undef textdomain
|
||||||
|
# define textdomain(Domainname) ((const char *) (Domainname))
|
||||||
|
# undef bindtextdomain
|
||||||
|
# define bindtextdomain(Domainname, Dirname) \
|
||||||
|
((void) (Domainname), (const char *) (Dirname))
|
||||||
|
# undef bind_textdomain_codeset
|
||||||
|
# define bind_textdomain_codeset(Domainname, Codeset) \
|
||||||
|
((void) (Domainname), (const char *) (Codeset))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Prefer gnulib's setlocale override over libintl's setlocale override. */
|
||||||
|
#ifdef GNULIB_defined_setlocale
|
||||||
|
# undef setlocale
|
||||||
|
# define setlocale rpl_setlocale
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* A pseudo function call that serves as a marker for the automated
|
||||||
|
extraction of messages, but does not call gettext(). The run-time
|
||||||
|
translation is done at a different place in the code.
|
||||||
|
The argument, String, should be a literal string. Concatenated strings
|
||||||
|
and other string expressions won't work.
|
||||||
|
The macro's expansion is not parenthesized, so that it is suitable as
|
||||||
|
initializer for static 'char[]' or 'const char[]' variables. */
|
||||||
|
#define gettext_noop(String) String
|
||||||
|
|
||||||
|
/* The separator between msgctxt and msgid in a .mo file. */
|
||||||
|
#define GETTEXT_CONTEXT_GLUE "\004"
|
||||||
|
|
||||||
|
/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
|
||||||
|
MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be
|
||||||
|
short and rarely need to change.
|
||||||
|
The letter 'p' stands for 'particular' or 'special'. */
|
||||||
|
#ifdef DEFAULT_TEXT_DOMAIN
|
||||||
|
# define pgettext(Msgctxt, Msgid) \
|
||||||
|
pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
|
||||||
|
#else
|
||||||
|
# define pgettext(Msgctxt, Msgid) \
|
||||||
|
pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
|
||||||
|
#endif
|
||||||
|
#define dpgettext(Domainname, Msgctxt, Msgid) \
|
||||||
|
pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
|
||||||
|
#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
|
||||||
|
pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
|
||||||
|
#ifdef DEFAULT_TEXT_DOMAIN
|
||||||
|
# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
|
||||||
|
npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||||
|
#else
|
||||||
|
# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
|
||||||
|
npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||||
|
#endif
|
||||||
|
#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
|
||||||
|
npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||||
|
#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
|
||||||
|
npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__inline
|
||||||
|
#else
|
||||||
|
#ifdef __cplusplus
|
||||||
|
inline
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
static const char *
|
||||||
|
pgettext_aux (const char *domain,
|
||||||
|
const char *msg_ctxt_id, const char *msgid,
|
||||||
|
int category)
|
||||||
|
{
|
||||||
|
const char *translation = dcgettext (domain, msg_ctxt_id, category);
|
||||||
|
if (translation == msg_ctxt_id)
|
||||||
|
return msgid;
|
||||||
|
else
|
||||||
|
return translation;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__inline
|
||||||
|
#else
|
||||||
|
#ifdef __cplusplus
|
||||||
|
inline
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
static const char *
|
||||||
|
npgettext_aux (const char *domain,
|
||||||
|
const char *msg_ctxt_id, const char *msgid,
|
||||||
|
const char *msgid_plural, unsigned long int n,
|
||||||
|
int category)
|
||||||
|
{
|
||||||
|
const char *translation =
|
||||||
|
dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
|
||||||
|
if (translation == msg_ctxt_id || translation == msgid_plural)
|
||||||
|
return (n == 1 ? msgid : msgid_plural);
|
||||||
|
else
|
||||||
|
return translation;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID
|
||||||
|
can be arbitrary expressions. But for string literals these macros are
|
||||||
|
less efficient than those above. */
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \
|
||||||
|
/* || __STDC_VERSION__ >= 199901L */ )
|
||||||
|
# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
|
||||||
|
#else
|
||||||
|
# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define pgettext_expr(Msgctxt, Msgid) \
|
||||||
|
dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
|
||||||
|
#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
|
||||||
|
dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__inline
|
||||||
|
#else
|
||||||
|
#ifdef __cplusplus
|
||||||
|
inline
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
static const char *
|
||||||
|
dcpgettext_expr (const char *domain,
|
||||||
|
const char *msgctxt, const char *msgid,
|
||||||
|
int category)
|
||||||
|
{
|
||||||
|
size_t msgctxt_len = strlen (msgctxt) + 1;
|
||||||
|
size_t msgid_len = strlen (msgid) + 1;
|
||||||
|
const char *translation;
|
||||||
|
#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||||
|
char msg_ctxt_id[msgctxt_len + msgid_len];
|
||||||
|
#else
|
||||||
|
char buf[1024];
|
||||||
|
char *msg_ctxt_id =
|
||||||
|
(msgctxt_len + msgid_len <= sizeof (buf)
|
||||||
|
? buf
|
||||||
|
: (char *) malloc (msgctxt_len + msgid_len));
|
||||||
|
if (msg_ctxt_id != NULL)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
|
||||||
|
msg_ctxt_id[msgctxt_len - 1] = '\004';
|
||||||
|
memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
|
||||||
|
translation = dcgettext (domain, msg_ctxt_id, category);
|
||||||
|
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||||
|
if (msg_ctxt_id != buf)
|
||||||
|
free (msg_ctxt_id);
|
||||||
|
#endif
|
||||||
|
if (translation != msg_ctxt_id)
|
||||||
|
return translation;
|
||||||
|
}
|
||||||
|
return msgid;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
|
||||||
|
dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||||
|
#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
|
||||||
|
dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__inline
|
||||||
|
#else
|
||||||
|
#ifdef __cplusplus
|
||||||
|
inline
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
static const char *
|
||||||
|
dcnpgettext_expr (const char *domain,
|
||||||
|
const char *msgctxt, const char *msgid,
|
||||||
|
const char *msgid_plural, unsigned long int n,
|
||||||
|
int category)
|
||||||
|
{
|
||||||
|
size_t msgctxt_len = strlen (msgctxt) + 1;
|
||||||
|
size_t msgid_len = strlen (msgid) + 1;
|
||||||
|
const char *translation;
|
||||||
|
#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||||
|
char msg_ctxt_id[msgctxt_len + msgid_len];
|
||||||
|
#else
|
||||||
|
char buf[1024];
|
||||||
|
char *msg_ctxt_id =
|
||||||
|
(msgctxt_len + msgid_len <= sizeof (buf)
|
||||||
|
? buf
|
||||||
|
: (char *) malloc (msgctxt_len + msgid_len));
|
||||||
|
if (msg_ctxt_id != NULL)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
|
||||||
|
msg_ctxt_id[msgctxt_len - 1] = '\004';
|
||||||
|
memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
|
||||||
|
translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
|
||||||
|
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||||
|
if (msg_ctxt_id != buf)
|
||||||
|
free (msg_ctxt_id);
|
||||||
|
#endif
|
||||||
|
if (!(translation == msg_ctxt_id || translation == msgid_plural))
|
||||||
|
return translation;
|
||||||
|
}
|
||||||
|
return (n == 1 ? msgid : msgid_plural);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _LIBGETTEXT_H */
|
||||||
319
lib/intprops.h
Normal file
319
lib/intprops.h
Normal file
|
|
@ -0,0 +1,319 @@
|
||||||
|
/* intprops.h -- properties of integer types
|
||||||
|
|
||||||
|
Copyright (C) 2001-2005, 2009-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Paul Eggert. */
|
||||||
|
|
||||||
|
#ifndef _GL_INTPROPS_H
|
||||||
|
#define _GL_INTPROPS_H
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
/* Return an integer value, converted to the same type as the integer
|
||||||
|
expression E after integer type promotion. V is the unconverted value. */
|
||||||
|
#define _GL_INT_CONVERT(e, v) (0 * (e) + (v))
|
||||||
|
|
||||||
|
/* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see
|
||||||
|
<http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00406.html>. */
|
||||||
|
#define _GL_INT_NEGATE_CONVERT(e, v) (0 * (e) - (v))
|
||||||
|
|
||||||
|
/* The extra casts in the following macros work around compiler bugs,
|
||||||
|
e.g., in Cray C 5.0.3.0. */
|
||||||
|
|
||||||
|
/* True if the arithmetic type T is an integer type. bool counts as
|
||||||
|
an integer. */
|
||||||
|
#define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
|
||||||
|
|
||||||
|
/* True if negative values of the signed integer type T use two's
|
||||||
|
complement, ones' complement, or signed magnitude representation,
|
||||||
|
respectively. Much GNU code assumes two's complement, but some
|
||||||
|
people like to be portable to all possible C hosts. */
|
||||||
|
#define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
|
||||||
|
#define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
|
||||||
|
#define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
|
||||||
|
|
||||||
|
/* True if the signed integer expression E uses two's complement. */
|
||||||
|
#define _GL_INT_TWOS_COMPLEMENT(e) (~ _GL_INT_CONVERT (e, 0) == -1)
|
||||||
|
|
||||||
|
/* True if the arithmetic type T is signed. */
|
||||||
|
#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
|
||||||
|
|
||||||
|
/* Return 1 if the integer expression E, after integer promotion, has
|
||||||
|
a signed type. */
|
||||||
|
#define _GL_INT_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0)
|
||||||
|
|
||||||
|
|
||||||
|
/* Minimum and maximum values for integer types and expressions. These
|
||||||
|
macros have undefined behavior if T is signed and has padding bits.
|
||||||
|
If this is a problem for you, please let us know how to fix it for
|
||||||
|
your host. */
|
||||||
|
|
||||||
|
/* The maximum and minimum values for the integer type T. */
|
||||||
|
#define TYPE_MINIMUM(t) \
|
||||||
|
((t) (! TYPE_SIGNED (t) \
|
||||||
|
? (t) 0 \
|
||||||
|
: TYPE_SIGNED_MAGNITUDE (t) \
|
||||||
|
? ~ (t) 0 \
|
||||||
|
: ~ TYPE_MAXIMUM (t)))
|
||||||
|
#define TYPE_MAXIMUM(t) \
|
||||||
|
((t) (! TYPE_SIGNED (t) \
|
||||||
|
? (t) -1 \
|
||||||
|
: ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
|
||||||
|
|
||||||
|
/* The maximum and minimum values for the type of the expression E,
|
||||||
|
after integer promotion. E should not have side effects. */
|
||||||
|
#define _GL_INT_MINIMUM(e) \
|
||||||
|
(_GL_INT_SIGNED (e) \
|
||||||
|
? - _GL_INT_TWOS_COMPLEMENT (e) - _GL_SIGNED_INT_MAXIMUM (e) \
|
||||||
|
: _GL_INT_CONVERT (e, 0))
|
||||||
|
#define _GL_INT_MAXIMUM(e) \
|
||||||
|
(_GL_INT_SIGNED (e) \
|
||||||
|
? _GL_SIGNED_INT_MAXIMUM (e) \
|
||||||
|
: _GL_INT_NEGATE_CONVERT (e, 1))
|
||||||
|
#define _GL_SIGNED_INT_MAXIMUM(e) \
|
||||||
|
(((_GL_INT_CONVERT (e, 1) << (sizeof ((e) + 0) * CHAR_BIT - 2)) - 1) * 2 + 1)
|
||||||
|
|
||||||
|
|
||||||
|
/* Return 1 if the __typeof__ keyword works. This could be done by
|
||||||
|
'configure', but for now it's easier to do it by hand. */
|
||||||
|
#if 2 <= __GNUC__ || 0x5110 <= __SUNPRO_C
|
||||||
|
# define _GL_HAVE___TYPEOF__ 1
|
||||||
|
#else
|
||||||
|
# define _GL_HAVE___TYPEOF__ 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Return 1 if the integer type or expression T might be signed. Return 0
|
||||||
|
if it is definitely unsigned. This macro does not evaluate its argument,
|
||||||
|
and expands to an integer constant expression. */
|
||||||
|
#if _GL_HAVE___TYPEOF__
|
||||||
|
# define _GL_SIGNED_TYPE_OR_EXPR(t) TYPE_SIGNED (__typeof__ (t))
|
||||||
|
#else
|
||||||
|
# define _GL_SIGNED_TYPE_OR_EXPR(t) 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Bound on length of the string representing an unsigned integer
|
||||||
|
value representable in B bits. log10 (2.0) < 146/485. The
|
||||||
|
smallest value of B where this bound is not tight is 2621. */
|
||||||
|
#define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485)
|
||||||
|
|
||||||
|
/* Bound on length of the string representing an integer type or expression T.
|
||||||
|
Subtract 1 for the sign bit if T is signed, and then add 1 more for
|
||||||
|
a minus sign if needed.
|
||||||
|
|
||||||
|
Because _GL_SIGNED_TYPE_OR_EXPR sometimes returns 0 when its argument is
|
||||||
|
signed, this macro may overestimate the true bound by one byte when
|
||||||
|
applied to unsigned types of size 2, 4, 16, ... bytes. */
|
||||||
|
#define INT_STRLEN_BOUND(t) \
|
||||||
|
(INT_BITS_STRLEN_BOUND (sizeof (t) * CHAR_BIT \
|
||||||
|
- _GL_SIGNED_TYPE_OR_EXPR (t)) \
|
||||||
|
+ _GL_SIGNED_TYPE_OR_EXPR (t))
|
||||||
|
|
||||||
|
/* Bound on buffer size needed to represent an integer type or expression T,
|
||||||
|
including the terminating null. */
|
||||||
|
#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
|
||||||
|
|
||||||
|
|
||||||
|
/* Range overflow checks.
|
||||||
|
|
||||||
|
The INT_<op>_RANGE_OVERFLOW macros return 1 if the corresponding C
|
||||||
|
operators might not yield numerically correct answers due to
|
||||||
|
arithmetic overflow. They do not rely on undefined or
|
||||||
|
implementation-defined behavior. Their implementations are simple
|
||||||
|
and straightforward, but they are a bit harder to use than the
|
||||||
|
INT_<op>_OVERFLOW macros described below.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
|
||||||
|
long int i = ...;
|
||||||
|
long int j = ...;
|
||||||
|
if (INT_MULTIPLY_RANGE_OVERFLOW (i, j, LONG_MIN, LONG_MAX))
|
||||||
|
printf ("multiply would overflow");
|
||||||
|
else
|
||||||
|
printf ("product is %ld", i * j);
|
||||||
|
|
||||||
|
Restrictions on *_RANGE_OVERFLOW macros:
|
||||||
|
|
||||||
|
These macros do not check for all possible numerical problems or
|
||||||
|
undefined or unspecified behavior: they do not check for division
|
||||||
|
by zero, for bad shift counts, or for shifting negative numbers.
|
||||||
|
|
||||||
|
These macros may evaluate their arguments zero or multiple times,
|
||||||
|
so the arguments should not have side effects. The arithmetic
|
||||||
|
arguments (including the MIN and MAX arguments) must be of the same
|
||||||
|
integer type after the usual arithmetic conversions, and the type
|
||||||
|
must have minimum value MIN and maximum MAX. Unsigned types should
|
||||||
|
use a zero MIN of the proper type.
|
||||||
|
|
||||||
|
These macros are tuned for constant MIN and MAX. For commutative
|
||||||
|
operations such as A + B, they are also tuned for constant B. */
|
||||||
|
|
||||||
|
/* Return 1 if A + B would overflow in [MIN,MAX] arithmetic.
|
||||||
|
See above for restrictions. */
|
||||||
|
#define INT_ADD_RANGE_OVERFLOW(a, b, min, max) \
|
||||||
|
((b) < 0 \
|
||||||
|
? (a) < (min) - (b) \
|
||||||
|
: (max) - (b) < (a))
|
||||||
|
|
||||||
|
/* Return 1 if A - B would overflow in [MIN,MAX] arithmetic.
|
||||||
|
See above for restrictions. */
|
||||||
|
#define INT_SUBTRACT_RANGE_OVERFLOW(a, b, min, max) \
|
||||||
|
((b) < 0 \
|
||||||
|
? (max) + (b) < (a) \
|
||||||
|
: (a) < (min) + (b))
|
||||||
|
|
||||||
|
/* Return 1 if - A would overflow in [MIN,MAX] arithmetic.
|
||||||
|
See above for restrictions. */
|
||||||
|
#define INT_NEGATE_RANGE_OVERFLOW(a, min, max) \
|
||||||
|
((min) < 0 \
|
||||||
|
? (a) < - (max) \
|
||||||
|
: 0 < (a))
|
||||||
|
|
||||||
|
/* Return 1 if A * B would overflow in [MIN,MAX] arithmetic.
|
||||||
|
See above for restrictions. Avoid && and || as they tickle
|
||||||
|
bugs in Sun C 5.11 2010/08/13 and other compilers; see
|
||||||
|
<http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00401.html>. */
|
||||||
|
#define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max) \
|
||||||
|
((b) < 0 \
|
||||||
|
? ((a) < 0 \
|
||||||
|
? (a) < (max) / (b) \
|
||||||
|
: (b) == -1 \
|
||||||
|
? 0 \
|
||||||
|
: (min) / (b) < (a)) \
|
||||||
|
: (b) == 0 \
|
||||||
|
? 0 \
|
||||||
|
: ((a) < 0 \
|
||||||
|
? (a) < (min) / (b) \
|
||||||
|
: (max) / (b) < (a)))
|
||||||
|
|
||||||
|
/* Return 1 if A / B would overflow in [MIN,MAX] arithmetic.
|
||||||
|
See above for restrictions. Do not check for division by zero. */
|
||||||
|
#define INT_DIVIDE_RANGE_OVERFLOW(a, b, min, max) \
|
||||||
|
((min) < 0 && (b) == -1 && (a) < - (max))
|
||||||
|
|
||||||
|
/* Return 1 if A % B would overflow in [MIN,MAX] arithmetic.
|
||||||
|
See above for restrictions. Do not check for division by zero.
|
||||||
|
Mathematically, % should never overflow, but on x86-like hosts
|
||||||
|
INT_MIN % -1 traps, and the C standard permits this, so treat this
|
||||||
|
as an overflow too. */
|
||||||
|
#define INT_REMAINDER_RANGE_OVERFLOW(a, b, min, max) \
|
||||||
|
INT_DIVIDE_RANGE_OVERFLOW (a, b, min, max)
|
||||||
|
|
||||||
|
/* Return 1 if A << B would overflow in [MIN,MAX] arithmetic.
|
||||||
|
See above for restrictions. Here, MIN and MAX are for A only, and B need
|
||||||
|
not be of the same type as the other arguments. The C standard says that
|
||||||
|
behavior is undefined for shifts unless 0 <= B < wordwidth, and that when
|
||||||
|
A is negative then A << B has undefined behavior and A >> B has
|
||||||
|
implementation-defined behavior, but do not check these other
|
||||||
|
restrictions. */
|
||||||
|
#define INT_LEFT_SHIFT_RANGE_OVERFLOW(a, b, min, max) \
|
||||||
|
((a) < 0 \
|
||||||
|
? (a) < (min) >> (b) \
|
||||||
|
: (max) >> (b) < (a))
|
||||||
|
|
||||||
|
|
||||||
|
/* The _GL*_OVERFLOW macros have the same restrictions as the
|
||||||
|
*_RANGE_OVERFLOW macros, except that they do not assume that operands
|
||||||
|
(e.g., A and B) have the same type as MIN and MAX. Instead, they assume
|
||||||
|
that the result (e.g., A + B) has that type. */
|
||||||
|
#define _GL_ADD_OVERFLOW(a, b, min, max) \
|
||||||
|
((min) < 0 ? INT_ADD_RANGE_OVERFLOW (a, b, min, max) \
|
||||||
|
: (a) < 0 ? (b) <= (a) + (b) \
|
||||||
|
: (b) < 0 ? (a) <= (a) + (b) \
|
||||||
|
: (a) + (b) < (b))
|
||||||
|
#define _GL_SUBTRACT_OVERFLOW(a, b, min, max) \
|
||||||
|
((min) < 0 ? INT_SUBTRACT_RANGE_OVERFLOW (a, b, min, max) \
|
||||||
|
: (a) < 0 ? 1 \
|
||||||
|
: (b) < 0 ? (a) - (b) <= (a) \
|
||||||
|
: (a) < (b))
|
||||||
|
#define _GL_MULTIPLY_OVERFLOW(a, b, min, max) \
|
||||||
|
(((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a)))) \
|
||||||
|
|| INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max))
|
||||||
|
#define _GL_DIVIDE_OVERFLOW(a, b, min, max) \
|
||||||
|
((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \
|
||||||
|
: (a) < 0 ? (b) <= (a) + (b) - 1 \
|
||||||
|
: (b) < 0 && (a) + (b) <= (a))
|
||||||
|
#define _GL_REMAINDER_OVERFLOW(a, b, min, max) \
|
||||||
|
((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \
|
||||||
|
: (a) < 0 ? (a) % (b) != ((max) - (b) + 1) % (b) \
|
||||||
|
: (b) < 0 && ! _GL_UNSIGNED_NEG_MULTIPLE (a, b, max))
|
||||||
|
|
||||||
|
/* Return a nonzero value if A is a mathematical multiple of B, where
|
||||||
|
A is unsigned, B is negative, and MAX is the maximum value of A's
|
||||||
|
type. A's type must be the same as (A % B)'s type. Normally (A %
|
||||||
|
-B == 0) suffices, but things get tricky if -B would overflow. */
|
||||||
|
#define _GL_UNSIGNED_NEG_MULTIPLE(a, b, max) \
|
||||||
|
(((b) < -_GL_SIGNED_INT_MAXIMUM (b) \
|
||||||
|
? (_GL_SIGNED_INT_MAXIMUM (b) == (max) \
|
||||||
|
? (a) \
|
||||||
|
: (a) % (_GL_INT_CONVERT (a, _GL_SIGNED_INT_MAXIMUM (b)) + 1)) \
|
||||||
|
: (a) % - (b)) \
|
||||||
|
== 0)
|
||||||
|
|
||||||
|
|
||||||
|
/* Integer overflow checks.
|
||||||
|
|
||||||
|
The INT_<op>_OVERFLOW macros return 1 if the corresponding C operators
|
||||||
|
might not yield numerically correct answers due to arithmetic overflow.
|
||||||
|
They work correctly on all known practical hosts, and do not rely
|
||||||
|
on undefined behavior due to signed arithmetic overflow.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
|
||||||
|
long int i = ...;
|
||||||
|
long int j = ...;
|
||||||
|
if (INT_MULTIPLY_OVERFLOW (i, j))
|
||||||
|
printf ("multiply would overflow");
|
||||||
|
else
|
||||||
|
printf ("product is %ld", i * j);
|
||||||
|
|
||||||
|
These macros do not check for all possible numerical problems or
|
||||||
|
undefined or unspecified behavior: they do not check for division
|
||||||
|
by zero, for bad shift counts, or for shifting negative numbers.
|
||||||
|
|
||||||
|
These macros may evaluate their arguments zero or multiple times, so the
|
||||||
|
arguments should not have side effects.
|
||||||
|
|
||||||
|
These macros are tuned for their last argument being a constant.
|
||||||
|
|
||||||
|
Return 1 if the integer expressions A * B, A - B, -A, A * B, A / B,
|
||||||
|
A % B, and A << B would overflow, respectively. */
|
||||||
|
|
||||||
|
#define INT_ADD_OVERFLOW(a, b) \
|
||||||
|
_GL_BINARY_OP_OVERFLOW (a, b, _GL_ADD_OVERFLOW)
|
||||||
|
#define INT_SUBTRACT_OVERFLOW(a, b) \
|
||||||
|
_GL_BINARY_OP_OVERFLOW (a, b, _GL_SUBTRACT_OVERFLOW)
|
||||||
|
#define INT_NEGATE_OVERFLOW(a) \
|
||||||
|
INT_NEGATE_RANGE_OVERFLOW (a, _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
|
||||||
|
#define INT_MULTIPLY_OVERFLOW(a, b) \
|
||||||
|
_GL_BINARY_OP_OVERFLOW (a, b, _GL_MULTIPLY_OVERFLOW)
|
||||||
|
#define INT_DIVIDE_OVERFLOW(a, b) \
|
||||||
|
_GL_BINARY_OP_OVERFLOW (a, b, _GL_DIVIDE_OVERFLOW)
|
||||||
|
#define INT_REMAINDER_OVERFLOW(a, b) \
|
||||||
|
_GL_BINARY_OP_OVERFLOW (a, b, _GL_REMAINDER_OVERFLOW)
|
||||||
|
#define INT_LEFT_SHIFT_OVERFLOW(a, b) \
|
||||||
|
INT_LEFT_SHIFT_RANGE_OVERFLOW (a, b, \
|
||||||
|
_GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
|
||||||
|
|
||||||
|
/* Return 1 if the expression A <op> B would overflow,
|
||||||
|
where OP_RESULT_OVERFLOW (A, B, MIN, MAX) does the actual test,
|
||||||
|
assuming MIN and MAX are the minimum and maximum for the result type.
|
||||||
|
Arguments should be free of side effects. */
|
||||||
|
#define _GL_BINARY_OP_OVERFLOW(a, b, op_result_overflow) \
|
||||||
|
op_result_overflow (a, b, \
|
||||||
|
_GL_INT_MINIMUM (0 * (b) + (a)), \
|
||||||
|
_GL_INT_MAXIMUM (0 * (b) + (a)))
|
||||||
|
|
||||||
|
#endif /* _GL_INTPROPS_H */
|
||||||
28
lib/itold.c
Normal file
28
lib/itold.c
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
/* Replacement for 'int' to 'long double' conversion routine.
|
||||||
|
Copyright (C) 2011-2012 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 2011.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
_Qp_itoq (long double *result, int a)
|
||||||
|
{
|
||||||
|
/* Convert from 'int' to 'double', then from 'double' to 'long double'. */
|
||||||
|
*result = (double) a;
|
||||||
|
}
|
||||||
56
lib/malloc.c
Normal file
56
lib/malloc.c
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
/* malloc() function that is glibc compatible.
|
||||||
|
|
||||||
|
Copyright (C) 1997-1998, 2006-2007, 2009-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* written by Jim Meyering and Bruno Haible */
|
||||||
|
|
||||||
|
#define _GL_USE_STDLIB_ALLOC 1
|
||||||
|
#include <config.h>
|
||||||
|
/* Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h. */
|
||||||
|
#ifdef malloc
|
||||||
|
# define NEED_MALLOC_GNU 1
|
||||||
|
# undef malloc
|
||||||
|
/* Whereas the gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU. */
|
||||||
|
#elif GNULIB_MALLOC_GNU && !HAVE_MALLOC_GNU
|
||||||
|
# define NEED_MALLOC_GNU 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
/* Allocate an N-byte block of memory from the heap.
|
||||||
|
If N is zero, allocate a 1-byte block. */
|
||||||
|
|
||||||
|
void *
|
||||||
|
rpl_malloc (size_t n)
|
||||||
|
{
|
||||||
|
void *result;
|
||||||
|
|
||||||
|
#if NEED_MALLOC_GNU
|
||||||
|
if (n == 0)
|
||||||
|
n = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
result = malloc (n);
|
||||||
|
|
||||||
|
#if !HAVE_MALLOC_POSIX
|
||||||
|
if (result == NULL)
|
||||||
|
errno = ENOMEM;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
172
lib/memchr.c
Normal file
172
lib/memchr.c
Normal file
|
|
@ -0,0 +1,172 @@
|
||||||
|
/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2012
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
|
||||||
|
with help from Dan Sahlin (dan@sics.se) and
|
||||||
|
commentary by Jim Blandy (jimb@ai.mit.edu);
|
||||||
|
adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
|
||||||
|
and implemented by Roland McGrath (roland@ai.mit.edu).
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||||
|
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||||
|
|
||||||
|
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 3 of the License, or 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _LIBC
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#if defined _LIBC
|
||||||
|
# include <memcopy.h>
|
||||||
|
#else
|
||||||
|
# define reg_char char
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#if HAVE_BP_SYM_H || defined _LIBC
|
||||||
|
# include <bp-sym.h>
|
||||||
|
#else
|
||||||
|
# define BP_SYM(sym) sym
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef __memchr
|
||||||
|
#ifdef _LIBC
|
||||||
|
# undef memchr
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef weak_alias
|
||||||
|
# define __memchr memchr
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Search no more than N bytes of S for C. */
|
||||||
|
void *
|
||||||
|
__memchr (void const *s, int c_in, size_t n)
|
||||||
|
{
|
||||||
|
/* On 32-bit hardware, choosing longword to be a 32-bit unsigned
|
||||||
|
long instead of a 64-bit uintmax_t tends to give better
|
||||||
|
performance. On 64-bit hardware, unsigned long is generally 64
|
||||||
|
bits already. Change this typedef to experiment with
|
||||||
|
performance. */
|
||||||
|
typedef unsigned long int longword;
|
||||||
|
|
||||||
|
const unsigned char *char_ptr;
|
||||||
|
const longword *longword_ptr;
|
||||||
|
longword repeated_one;
|
||||||
|
longword repeated_c;
|
||||||
|
unsigned reg_char c;
|
||||||
|
|
||||||
|
c = (unsigned char) c_in;
|
||||||
|
|
||||||
|
/* Handle the first few bytes by reading one byte at a time.
|
||||||
|
Do this until CHAR_PTR is aligned on a longword boundary. */
|
||||||
|
for (char_ptr = (const unsigned char *) s;
|
||||||
|
n > 0 && (size_t) char_ptr % sizeof (longword) != 0;
|
||||||
|
--n, ++char_ptr)
|
||||||
|
if (*char_ptr == c)
|
||||||
|
return (void *) char_ptr;
|
||||||
|
|
||||||
|
longword_ptr = (const longword *) char_ptr;
|
||||||
|
|
||||||
|
/* All these elucidatory comments refer to 4-byte longwords,
|
||||||
|
but the theory applies equally well to any size longwords. */
|
||||||
|
|
||||||
|
/* Compute auxiliary longword values:
|
||||||
|
repeated_one is a value which has a 1 in every byte.
|
||||||
|
repeated_c has c in every byte. */
|
||||||
|
repeated_one = 0x01010101;
|
||||||
|
repeated_c = c | (c << 8);
|
||||||
|
repeated_c |= repeated_c << 16;
|
||||||
|
if (0xffffffffU < (longword) -1)
|
||||||
|
{
|
||||||
|
repeated_one |= repeated_one << 31 << 1;
|
||||||
|
repeated_c |= repeated_c << 31 << 1;
|
||||||
|
if (8 < sizeof (longword))
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 64; i < sizeof (longword) * 8; i *= 2)
|
||||||
|
{
|
||||||
|
repeated_one |= repeated_one << i;
|
||||||
|
repeated_c |= repeated_c << i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Instead of the traditional loop which tests each byte, we will test a
|
||||||
|
longword at a time. The tricky part is testing if *any of the four*
|
||||||
|
bytes in the longword in question are equal to c. We first use an xor
|
||||||
|
with repeated_c. This reduces the task to testing whether *any of the
|
||||||
|
four* bytes in longword1 is zero.
|
||||||
|
|
||||||
|
We compute tmp =
|
||||||
|
((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
|
||||||
|
That is, we perform the following operations:
|
||||||
|
1. Subtract repeated_one.
|
||||||
|
2. & ~longword1.
|
||||||
|
3. & a mask consisting of 0x80 in every byte.
|
||||||
|
Consider what happens in each byte:
|
||||||
|
- If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
|
||||||
|
and step 3 transforms it into 0x80. A carry can also be propagated
|
||||||
|
to more significant bytes.
|
||||||
|
- If a byte of longword1 is nonzero, let its lowest 1 bit be at
|
||||||
|
position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
|
||||||
|
the byte ends in a single bit of value 0 and k bits of value 1.
|
||||||
|
After step 2, the result is just k bits of value 1: 2^k - 1. After
|
||||||
|
step 3, the result is 0. And no carry is produced.
|
||||||
|
So, if longword1 has only non-zero bytes, tmp is zero.
|
||||||
|
Whereas if longword1 has a zero byte, call j the position of the least
|
||||||
|
significant zero byte. Then the result has a zero at positions 0, ...,
|
||||||
|
j-1 and a 0x80 at position j. We cannot predict the result at the more
|
||||||
|
significant bytes (positions j+1..3), but it does not matter since we
|
||||||
|
already have a non-zero bit at position 8*j+7.
|
||||||
|
|
||||||
|
So, the test whether any byte in longword1 is zero is equivalent to
|
||||||
|
testing whether tmp is nonzero. */
|
||||||
|
|
||||||
|
while (n >= sizeof (longword))
|
||||||
|
{
|
||||||
|
longword longword1 = *longword_ptr ^ repeated_c;
|
||||||
|
|
||||||
|
if ((((longword1 - repeated_one) & ~longword1)
|
||||||
|
& (repeated_one << 7)) != 0)
|
||||||
|
break;
|
||||||
|
longword_ptr++;
|
||||||
|
n -= sizeof (longword);
|
||||||
|
}
|
||||||
|
|
||||||
|
char_ptr = (const unsigned char *) longword_ptr;
|
||||||
|
|
||||||
|
/* At this point, we know that either n < sizeof (longword), or one of the
|
||||||
|
sizeof (longword) bytes starting at char_ptr is == c. On little-endian
|
||||||
|
machines, we could determine the first such byte without any further
|
||||||
|
memory accesses, just by looking at the tmp result from the last loop
|
||||||
|
iteration. But this does not work on big-endian machines. Choose code
|
||||||
|
that works in both cases. */
|
||||||
|
|
||||||
|
for (; n > 0; --n, ++char_ptr)
|
||||||
|
{
|
||||||
|
if (*char_ptr == c)
|
||||||
|
return (void *) char_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#ifdef weak_alias
|
||||||
|
weak_alias (__memchr, BP_SYM (memchr))
|
||||||
|
#endif
|
||||||
14
lib/memchr.valgrind
Normal file
14
lib/memchr.valgrind
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
# Suppress a valgrind message about use of uninitialized memory in memchr().
|
||||||
|
# POSIX states that when the character is found, memchr must not read extra
|
||||||
|
# bytes in an overestimated length (for example, where memchr is used to
|
||||||
|
# implement strnlen). However, we use a safe word read to provide a speedup.
|
||||||
|
{
|
||||||
|
memchr-value4
|
||||||
|
Memcheck:Value4
|
||||||
|
fun:rpl_memchr
|
||||||
|
}
|
||||||
|
{
|
||||||
|
memchr-value8
|
||||||
|
Memcheck:Value8
|
||||||
|
fun:rpl_memchr
|
||||||
|
}
|
||||||
28
lib/mempcpy.c
Normal file
28
lib/mempcpy.c
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
/* Copy memory area and return pointer after last written byte.
|
||||||
|
Copyright (C) 2003, 2007, 2009-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* Copy N bytes of SRC to DEST, return pointer to bytes after the
|
||||||
|
last written byte. */
|
||||||
|
void *
|
||||||
|
mempcpy (void *dest, const void *src, size_t n)
|
||||||
|
{
|
||||||
|
return (char *) memcpy (dest, src, n) + n;
|
||||||
|
}
|
||||||
187
lib/printf-args.c
Normal file
187
lib/printf-args.c
Normal file
|
|
@ -0,0 +1,187 @@
|
||||||
|
/* Decomposed printf argument list.
|
||||||
|
Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* This file can be parametrized with the following macros:
|
||||||
|
ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
|
||||||
|
PRINTF_FETCHARGS Name of the function to be defined.
|
||||||
|
STATIC Set to 'static' to declare the function static. */
|
||||||
|
|
||||||
|
#ifndef PRINTF_FETCHARGS
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#ifndef PRINTF_FETCHARGS
|
||||||
|
# include "printf-args.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef STATIC
|
||||||
|
STATIC
|
||||||
|
#endif
|
||||||
|
int
|
||||||
|
PRINTF_FETCHARGS (va_list args, arguments *a)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
argument *ap;
|
||||||
|
|
||||||
|
for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
|
||||||
|
switch (ap->type)
|
||||||
|
{
|
||||||
|
case TYPE_SCHAR:
|
||||||
|
ap->a.a_schar = va_arg (args, /*signed char*/ int);
|
||||||
|
break;
|
||||||
|
case TYPE_UCHAR:
|
||||||
|
ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
|
||||||
|
break;
|
||||||
|
case TYPE_SHORT:
|
||||||
|
ap->a.a_short = va_arg (args, /*short*/ int);
|
||||||
|
break;
|
||||||
|
case TYPE_USHORT:
|
||||||
|
ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
|
||||||
|
break;
|
||||||
|
case TYPE_INT:
|
||||||
|
ap->a.a_int = va_arg (args, int);
|
||||||
|
break;
|
||||||
|
case TYPE_UINT:
|
||||||
|
ap->a.a_uint = va_arg (args, unsigned int);
|
||||||
|
break;
|
||||||
|
case TYPE_LONGINT:
|
||||||
|
ap->a.a_longint = va_arg (args, long int);
|
||||||
|
break;
|
||||||
|
case TYPE_ULONGINT:
|
||||||
|
ap->a.a_ulongint = va_arg (args, unsigned long int);
|
||||||
|
break;
|
||||||
|
#if HAVE_LONG_LONG_INT
|
||||||
|
case TYPE_LONGLONGINT:
|
||||||
|
ap->a.a_longlongint = va_arg (args, long long int);
|
||||||
|
break;
|
||||||
|
case TYPE_ULONGLONGINT:
|
||||||
|
ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case TYPE_DOUBLE:
|
||||||
|
ap->a.a_double = va_arg (args, double);
|
||||||
|
break;
|
||||||
|
case TYPE_LONGDOUBLE:
|
||||||
|
ap->a.a_longdouble = va_arg (args, long double);
|
||||||
|
break;
|
||||||
|
case TYPE_CHAR:
|
||||||
|
ap->a.a_char = va_arg (args, int);
|
||||||
|
break;
|
||||||
|
#if HAVE_WINT_T
|
||||||
|
case TYPE_WIDE_CHAR:
|
||||||
|
/* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by
|
||||||
|
default argument promotions", this is not the case in mingw32,
|
||||||
|
where wint_t is 'unsigned short'. */
|
||||||
|
ap->a.a_wide_char =
|
||||||
|
(sizeof (wint_t) < sizeof (int)
|
||||||
|
? (wint_t) va_arg (args, int)
|
||||||
|
: va_arg (args, wint_t));
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case TYPE_STRING:
|
||||||
|
ap->a.a_string = va_arg (args, const char *);
|
||||||
|
/* A null pointer is an invalid argument for "%s", but in practice
|
||||||
|
it occurs quite frequently in printf statements that produce
|
||||||
|
debug output. Use a fallback in this case. */
|
||||||
|
if (ap->a.a_string == NULL)
|
||||||
|
ap->a.a_string = "(NULL)";
|
||||||
|
break;
|
||||||
|
#if HAVE_WCHAR_T
|
||||||
|
case TYPE_WIDE_STRING:
|
||||||
|
ap->a.a_wide_string = va_arg (args, const wchar_t *);
|
||||||
|
/* A null pointer is an invalid argument for "%ls", but in practice
|
||||||
|
it occurs quite frequently in printf statements that produce
|
||||||
|
debug output. Use a fallback in this case. */
|
||||||
|
if (ap->a.a_wide_string == NULL)
|
||||||
|
{
|
||||||
|
static const wchar_t wide_null_string[] =
|
||||||
|
{
|
||||||
|
(wchar_t)'(',
|
||||||
|
(wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L',
|
||||||
|
(wchar_t)')',
|
||||||
|
(wchar_t)0
|
||||||
|
};
|
||||||
|
ap->a.a_wide_string = wide_null_string;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case TYPE_POINTER:
|
||||||
|
ap->a.a_pointer = va_arg (args, void *);
|
||||||
|
break;
|
||||||
|
case TYPE_COUNT_SCHAR_POINTER:
|
||||||
|
ap->a.a_count_schar_pointer = va_arg (args, signed char *);
|
||||||
|
break;
|
||||||
|
case TYPE_COUNT_SHORT_POINTER:
|
||||||
|
ap->a.a_count_short_pointer = va_arg (args, short *);
|
||||||
|
break;
|
||||||
|
case TYPE_COUNT_INT_POINTER:
|
||||||
|
ap->a.a_count_int_pointer = va_arg (args, int *);
|
||||||
|
break;
|
||||||
|
case TYPE_COUNT_LONGINT_POINTER:
|
||||||
|
ap->a.a_count_longint_pointer = va_arg (args, long int *);
|
||||||
|
break;
|
||||||
|
#if HAVE_LONG_LONG_INT
|
||||||
|
case TYPE_COUNT_LONGLONGINT_POINTER:
|
||||||
|
ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if ENABLE_UNISTDIO
|
||||||
|
/* The unistdio extensions. */
|
||||||
|
case TYPE_U8_STRING:
|
||||||
|
ap->a.a_u8_string = va_arg (args, const uint8_t *);
|
||||||
|
/* A null pointer is an invalid argument for "%U", but in practice
|
||||||
|
it occurs quite frequently in printf statements that produce
|
||||||
|
debug output. Use a fallback in this case. */
|
||||||
|
if (ap->a.a_u8_string == NULL)
|
||||||
|
{
|
||||||
|
static const uint8_t u8_null_string[] =
|
||||||
|
{ '(', 'N', 'U', 'L', 'L', ')', 0 };
|
||||||
|
ap->a.a_u8_string = u8_null_string;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TYPE_U16_STRING:
|
||||||
|
ap->a.a_u16_string = va_arg (args, const uint16_t *);
|
||||||
|
/* A null pointer is an invalid argument for "%lU", but in practice
|
||||||
|
it occurs quite frequently in printf statements that produce
|
||||||
|
debug output. Use a fallback in this case. */
|
||||||
|
if (ap->a.a_u16_string == NULL)
|
||||||
|
{
|
||||||
|
static const uint16_t u16_null_string[] =
|
||||||
|
{ '(', 'N', 'U', 'L', 'L', ')', 0 };
|
||||||
|
ap->a.a_u16_string = u16_null_string;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TYPE_U32_STRING:
|
||||||
|
ap->a.a_u32_string = va_arg (args, const uint32_t *);
|
||||||
|
/* A null pointer is an invalid argument for "%llU", but in practice
|
||||||
|
it occurs quite frequently in printf statements that produce
|
||||||
|
debug output. Use a fallback in this case. */
|
||||||
|
if (ap->a.a_u32_string == NULL)
|
||||||
|
{
|
||||||
|
static const uint32_t u32_null_string[] =
|
||||||
|
{ '(', 'N', 'U', 'L', 'L', ')', 0 };
|
||||||
|
ap->a.a_u32_string = u32_null_string;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
/* Unknown type. */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
158
lib/printf-args.h
Normal file
158
lib/printf-args.h
Normal file
|
|
@ -0,0 +1,158 @@
|
||||||
|
/* Decomposed printf argument list.
|
||||||
|
Copyright (C) 1999, 2002-2003, 2006-2007, 2011-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _PRINTF_ARGS_H
|
||||||
|
#define _PRINTF_ARGS_H
|
||||||
|
|
||||||
|
/* This file can be parametrized with the following macros:
|
||||||
|
ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
|
||||||
|
PRINTF_FETCHARGS Name of the function to be declared.
|
||||||
|
STATIC Set to 'static' to declare the function static. */
|
||||||
|
|
||||||
|
/* Default parameters. */
|
||||||
|
#ifndef PRINTF_FETCHARGS
|
||||||
|
# define PRINTF_FETCHARGS printf_fetchargs
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get size_t. */
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* Get wchar_t. */
|
||||||
|
#if HAVE_WCHAR_T
|
||||||
|
# include <stddef.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get wint_t. */
|
||||||
|
#if HAVE_WINT_T
|
||||||
|
# include <wchar.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get va_list. */
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Argument types */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
TYPE_NONE,
|
||||||
|
TYPE_SCHAR,
|
||||||
|
TYPE_UCHAR,
|
||||||
|
TYPE_SHORT,
|
||||||
|
TYPE_USHORT,
|
||||||
|
TYPE_INT,
|
||||||
|
TYPE_UINT,
|
||||||
|
TYPE_LONGINT,
|
||||||
|
TYPE_ULONGINT,
|
||||||
|
#if HAVE_LONG_LONG_INT
|
||||||
|
TYPE_LONGLONGINT,
|
||||||
|
TYPE_ULONGLONGINT,
|
||||||
|
#endif
|
||||||
|
TYPE_DOUBLE,
|
||||||
|
TYPE_LONGDOUBLE,
|
||||||
|
TYPE_CHAR,
|
||||||
|
#if HAVE_WINT_T
|
||||||
|
TYPE_WIDE_CHAR,
|
||||||
|
#endif
|
||||||
|
TYPE_STRING,
|
||||||
|
#if HAVE_WCHAR_T
|
||||||
|
TYPE_WIDE_STRING,
|
||||||
|
#endif
|
||||||
|
TYPE_POINTER,
|
||||||
|
TYPE_COUNT_SCHAR_POINTER,
|
||||||
|
TYPE_COUNT_SHORT_POINTER,
|
||||||
|
TYPE_COUNT_INT_POINTER,
|
||||||
|
TYPE_COUNT_LONGINT_POINTER
|
||||||
|
#if HAVE_LONG_LONG_INT
|
||||||
|
, TYPE_COUNT_LONGLONGINT_POINTER
|
||||||
|
#endif
|
||||||
|
#if ENABLE_UNISTDIO
|
||||||
|
/* The unistdio extensions. */
|
||||||
|
, TYPE_U8_STRING
|
||||||
|
, TYPE_U16_STRING
|
||||||
|
, TYPE_U32_STRING
|
||||||
|
#endif
|
||||||
|
} arg_type;
|
||||||
|
|
||||||
|
/* Polymorphic argument */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
arg_type type;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
signed char a_schar;
|
||||||
|
unsigned char a_uchar;
|
||||||
|
short a_short;
|
||||||
|
unsigned short a_ushort;
|
||||||
|
int a_int;
|
||||||
|
unsigned int a_uint;
|
||||||
|
long int a_longint;
|
||||||
|
unsigned long int a_ulongint;
|
||||||
|
#if HAVE_LONG_LONG_INT
|
||||||
|
long long int a_longlongint;
|
||||||
|
unsigned long long int a_ulonglongint;
|
||||||
|
#endif
|
||||||
|
float a_float;
|
||||||
|
double a_double;
|
||||||
|
long double a_longdouble;
|
||||||
|
int a_char;
|
||||||
|
#if HAVE_WINT_T
|
||||||
|
wint_t a_wide_char;
|
||||||
|
#endif
|
||||||
|
const char* a_string;
|
||||||
|
#if HAVE_WCHAR_T
|
||||||
|
const wchar_t* a_wide_string;
|
||||||
|
#endif
|
||||||
|
void* a_pointer;
|
||||||
|
signed char * a_count_schar_pointer;
|
||||||
|
short * a_count_short_pointer;
|
||||||
|
int * a_count_int_pointer;
|
||||||
|
long int * a_count_longint_pointer;
|
||||||
|
#if HAVE_LONG_LONG_INT
|
||||||
|
long long int * a_count_longlongint_pointer;
|
||||||
|
#endif
|
||||||
|
#if ENABLE_UNISTDIO
|
||||||
|
/* The unistdio extensions. */
|
||||||
|
const uint8_t * a_u8_string;
|
||||||
|
const uint16_t * a_u16_string;
|
||||||
|
const uint32_t * a_u32_string;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
a;
|
||||||
|
}
|
||||||
|
argument;
|
||||||
|
|
||||||
|
/* Number of directly allocated arguments (no malloc() needed). */
|
||||||
|
#define N_DIRECT_ALLOC_ARGUMENTS 7
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
size_t count;
|
||||||
|
argument *arg;
|
||||||
|
argument direct_alloc_arg[N_DIRECT_ALLOC_ARGUMENTS];
|
||||||
|
}
|
||||||
|
arguments;
|
||||||
|
|
||||||
|
|
||||||
|
/* Fetch the arguments, putting them into a. */
|
||||||
|
#ifdef STATIC
|
||||||
|
STATIC
|
||||||
|
#else
|
||||||
|
extern
|
||||||
|
#endif
|
||||||
|
int PRINTF_FETCHARGS (va_list args, arguments *a);
|
||||||
|
|
||||||
|
#endif /* _PRINTF_ARGS_H */
|
||||||
638
lib/printf-parse.c
Normal file
638
lib/printf-parse.c
Normal file
|
|
@ -0,0 +1,638 @@
|
||||||
|
/* Formatted output to strings.
|
||||||
|
Copyright (C) 1999-2000, 2002-2003, 2006-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* This file can be parametrized with the following macros:
|
||||||
|
CHAR_T The element type of the format string.
|
||||||
|
CHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
|
||||||
|
in the format string are ASCII.
|
||||||
|
DIRECTIVE Structure denoting a format directive.
|
||||||
|
Depends on CHAR_T.
|
||||||
|
DIRECTIVES Structure denoting the set of format directives of a
|
||||||
|
format string. Depends on CHAR_T.
|
||||||
|
PRINTF_PARSE Function that parses a format string.
|
||||||
|
Depends on CHAR_T.
|
||||||
|
STATIC Set to 'static' to declare the function static.
|
||||||
|
ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. */
|
||||||
|
|
||||||
|
#ifndef PRINTF_PARSE
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#ifndef PRINTF_PARSE
|
||||||
|
# include "printf-parse.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Default parameters. */
|
||||||
|
#ifndef PRINTF_PARSE
|
||||||
|
# define PRINTF_PARSE printf_parse
|
||||||
|
# define CHAR_T char
|
||||||
|
# define DIRECTIVE char_directive
|
||||||
|
# define DIRECTIVES char_directives
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get size_t, NULL. */
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* Get intmax_t. */
|
||||||
|
#if defined IN_LIBINTL || defined IN_LIBASPRINTF
|
||||||
|
# if HAVE_STDINT_H_WITH_UINTMAX
|
||||||
|
# include <stdint.h>
|
||||||
|
# endif
|
||||||
|
# if HAVE_INTTYPES_H_WITH_UINTMAX
|
||||||
|
# include <inttypes.h>
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# include <stdint.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* malloc(), realloc(), free(). */
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* memcpy(). */
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* errno. */
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
/* Checked size_t computations. */
|
||||||
|
#include "xsize.h"
|
||||||
|
|
||||||
|
#if CHAR_T_ONLY_ASCII
|
||||||
|
/* c_isascii(). */
|
||||||
|
# include "c-ctype.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef STATIC
|
||||||
|
STATIC
|
||||||
|
#endif
|
||||||
|
int
|
||||||
|
PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
|
||||||
|
{
|
||||||
|
const CHAR_T *cp = format; /* pointer into format */
|
||||||
|
size_t arg_posn = 0; /* number of regular arguments consumed */
|
||||||
|
size_t d_allocated; /* allocated elements of d->dir */
|
||||||
|
size_t a_allocated; /* allocated elements of a->arg */
|
||||||
|
size_t max_width_length = 0;
|
||||||
|
size_t max_precision_length = 0;
|
||||||
|
|
||||||
|
d->count = 0;
|
||||||
|
d_allocated = N_DIRECT_ALLOC_DIRECTIVES;
|
||||||
|
d->dir = d->direct_alloc_dir;
|
||||||
|
|
||||||
|
a->count = 0;
|
||||||
|
a_allocated = N_DIRECT_ALLOC_ARGUMENTS;
|
||||||
|
a->arg = a->direct_alloc_arg;
|
||||||
|
|
||||||
|
#define REGISTER_ARG(_index_,_type_) \
|
||||||
|
{ \
|
||||||
|
size_t n = (_index_); \
|
||||||
|
if (n >= a_allocated) \
|
||||||
|
{ \
|
||||||
|
size_t memory_size; \
|
||||||
|
argument *memory; \
|
||||||
|
\
|
||||||
|
a_allocated = xtimes (a_allocated, 2); \
|
||||||
|
if (a_allocated <= n) \
|
||||||
|
a_allocated = xsum (n, 1); \
|
||||||
|
memory_size = xtimes (a_allocated, sizeof (argument)); \
|
||||||
|
if (size_overflow_p (memory_size)) \
|
||||||
|
/* Overflow, would lead to out of memory. */ \
|
||||||
|
goto out_of_memory; \
|
||||||
|
memory = (argument *) (a->arg != a->direct_alloc_arg \
|
||||||
|
? realloc (a->arg, memory_size) \
|
||||||
|
: malloc (memory_size)); \
|
||||||
|
if (memory == NULL) \
|
||||||
|
/* Out of memory. */ \
|
||||||
|
goto out_of_memory; \
|
||||||
|
if (a->arg == a->direct_alloc_arg) \
|
||||||
|
memcpy (memory, a->arg, a->count * sizeof (argument)); \
|
||||||
|
a->arg = memory; \
|
||||||
|
} \
|
||||||
|
while (a->count <= n) \
|
||||||
|
a->arg[a->count++].type = TYPE_NONE; \
|
||||||
|
if (a->arg[n].type == TYPE_NONE) \
|
||||||
|
a->arg[n].type = (_type_); \
|
||||||
|
else if (a->arg[n].type != (_type_)) \
|
||||||
|
/* Ambiguous type for positional argument. */ \
|
||||||
|
goto error; \
|
||||||
|
}
|
||||||
|
|
||||||
|
while (*cp != '\0')
|
||||||
|
{
|
||||||
|
CHAR_T c = *cp++;
|
||||||
|
if (c == '%')
|
||||||
|
{
|
||||||
|
size_t arg_index = ARG_NONE;
|
||||||
|
DIRECTIVE *dp = &d->dir[d->count]; /* pointer to next directive */
|
||||||
|
|
||||||
|
/* Initialize the next directive. */
|
||||||
|
dp->dir_start = cp - 1;
|
||||||
|
dp->flags = 0;
|
||||||
|
dp->width_start = NULL;
|
||||||
|
dp->width_end = NULL;
|
||||||
|
dp->width_arg_index = ARG_NONE;
|
||||||
|
dp->precision_start = NULL;
|
||||||
|
dp->precision_end = NULL;
|
||||||
|
dp->precision_arg_index = ARG_NONE;
|
||||||
|
dp->arg_index = ARG_NONE;
|
||||||
|
|
||||||
|
/* Test for positional argument. */
|
||||||
|
if (*cp >= '0' && *cp <= '9')
|
||||||
|
{
|
||||||
|
const CHAR_T *np;
|
||||||
|
|
||||||
|
for (np = cp; *np >= '0' && *np <= '9'; np++)
|
||||||
|
;
|
||||||
|
if (*np == '$')
|
||||||
|
{
|
||||||
|
size_t n = 0;
|
||||||
|
|
||||||
|
for (np = cp; *np >= '0' && *np <= '9'; np++)
|
||||||
|
n = xsum (xtimes (n, 10), *np - '0');
|
||||||
|
if (n == 0)
|
||||||
|
/* Positional argument 0. */
|
||||||
|
goto error;
|
||||||
|
if (size_overflow_p (n))
|
||||||
|
/* n too large, would lead to out of memory later. */
|
||||||
|
goto error;
|
||||||
|
arg_index = n - 1;
|
||||||
|
cp = np + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read the flags. */
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (*cp == '\'')
|
||||||
|
{
|
||||||
|
dp->flags |= FLAG_GROUP;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == '-')
|
||||||
|
{
|
||||||
|
dp->flags |= FLAG_LEFT;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == '+')
|
||||||
|
{
|
||||||
|
dp->flags |= FLAG_SHOWSIGN;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == ' ')
|
||||||
|
{
|
||||||
|
dp->flags |= FLAG_SPACE;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == '#')
|
||||||
|
{
|
||||||
|
dp->flags |= FLAG_ALT;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == '0')
|
||||||
|
{
|
||||||
|
dp->flags |= FLAG_ZERO;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
#if __GLIBC__ >= 2 && !defined __UCLIBC__
|
||||||
|
else if (*cp == 'I')
|
||||||
|
{
|
||||||
|
dp->flags |= FLAG_LOCALIZED;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the field width. */
|
||||||
|
if (*cp == '*')
|
||||||
|
{
|
||||||
|
dp->width_start = cp;
|
||||||
|
cp++;
|
||||||
|
dp->width_end = cp;
|
||||||
|
if (max_width_length < 1)
|
||||||
|
max_width_length = 1;
|
||||||
|
|
||||||
|
/* Test for positional argument. */
|
||||||
|
if (*cp >= '0' && *cp <= '9')
|
||||||
|
{
|
||||||
|
const CHAR_T *np;
|
||||||
|
|
||||||
|
for (np = cp; *np >= '0' && *np <= '9'; np++)
|
||||||
|
;
|
||||||
|
if (*np == '$')
|
||||||
|
{
|
||||||
|
size_t n = 0;
|
||||||
|
|
||||||
|
for (np = cp; *np >= '0' && *np <= '9'; np++)
|
||||||
|
n = xsum (xtimes (n, 10), *np - '0');
|
||||||
|
if (n == 0)
|
||||||
|
/* Positional argument 0. */
|
||||||
|
goto error;
|
||||||
|
if (size_overflow_p (n))
|
||||||
|
/* n too large, would lead to out of memory later. */
|
||||||
|
goto error;
|
||||||
|
dp->width_arg_index = n - 1;
|
||||||
|
cp = np + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dp->width_arg_index == ARG_NONE)
|
||||||
|
{
|
||||||
|
dp->width_arg_index = arg_posn++;
|
||||||
|
if (dp->width_arg_index == ARG_NONE)
|
||||||
|
/* arg_posn wrapped around. */
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
REGISTER_ARG (dp->width_arg_index, TYPE_INT);
|
||||||
|
}
|
||||||
|
else if (*cp >= '0' && *cp <= '9')
|
||||||
|
{
|
||||||
|
size_t width_length;
|
||||||
|
|
||||||
|
dp->width_start = cp;
|
||||||
|
for (; *cp >= '0' && *cp <= '9'; cp++)
|
||||||
|
;
|
||||||
|
dp->width_end = cp;
|
||||||
|
width_length = dp->width_end - dp->width_start;
|
||||||
|
if (max_width_length < width_length)
|
||||||
|
max_width_length = width_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the precision. */
|
||||||
|
if (*cp == '.')
|
||||||
|
{
|
||||||
|
cp++;
|
||||||
|
if (*cp == '*')
|
||||||
|
{
|
||||||
|
dp->precision_start = cp - 1;
|
||||||
|
cp++;
|
||||||
|
dp->precision_end = cp;
|
||||||
|
if (max_precision_length < 2)
|
||||||
|
max_precision_length = 2;
|
||||||
|
|
||||||
|
/* Test for positional argument. */
|
||||||
|
if (*cp >= '0' && *cp <= '9')
|
||||||
|
{
|
||||||
|
const CHAR_T *np;
|
||||||
|
|
||||||
|
for (np = cp; *np >= '0' && *np <= '9'; np++)
|
||||||
|
;
|
||||||
|
if (*np == '$')
|
||||||
|
{
|
||||||
|
size_t n = 0;
|
||||||
|
|
||||||
|
for (np = cp; *np >= '0' && *np <= '9'; np++)
|
||||||
|
n = xsum (xtimes (n, 10), *np - '0');
|
||||||
|
if (n == 0)
|
||||||
|
/* Positional argument 0. */
|
||||||
|
goto error;
|
||||||
|
if (size_overflow_p (n))
|
||||||
|
/* n too large, would lead to out of memory
|
||||||
|
later. */
|
||||||
|
goto error;
|
||||||
|
dp->precision_arg_index = n - 1;
|
||||||
|
cp = np + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dp->precision_arg_index == ARG_NONE)
|
||||||
|
{
|
||||||
|
dp->precision_arg_index = arg_posn++;
|
||||||
|
if (dp->precision_arg_index == ARG_NONE)
|
||||||
|
/* arg_posn wrapped around. */
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
REGISTER_ARG (dp->precision_arg_index, TYPE_INT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t precision_length;
|
||||||
|
|
||||||
|
dp->precision_start = cp - 1;
|
||||||
|
for (; *cp >= '0' && *cp <= '9'; cp++)
|
||||||
|
;
|
||||||
|
dp->precision_end = cp;
|
||||||
|
precision_length = dp->precision_end - dp->precision_start;
|
||||||
|
if (max_precision_length < precision_length)
|
||||||
|
max_precision_length = precision_length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
arg_type type;
|
||||||
|
|
||||||
|
/* Parse argument type/size specifiers. */
|
||||||
|
{
|
||||||
|
int flags = 0;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (*cp == 'h')
|
||||||
|
{
|
||||||
|
flags |= (1 << (flags & 1));
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == 'L')
|
||||||
|
{
|
||||||
|
flags |= 4;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == 'l')
|
||||||
|
{
|
||||||
|
flags += 8;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == 'j')
|
||||||
|
{
|
||||||
|
if (sizeof (intmax_t) > sizeof (long))
|
||||||
|
{
|
||||||
|
/* intmax_t = long long */
|
||||||
|
flags += 16;
|
||||||
|
}
|
||||||
|
else if (sizeof (intmax_t) > sizeof (int))
|
||||||
|
{
|
||||||
|
/* intmax_t = long */
|
||||||
|
flags += 8;
|
||||||
|
}
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == 'z' || *cp == 'Z')
|
||||||
|
{
|
||||||
|
/* 'z' is standardized in ISO C 99, but glibc uses 'Z'
|
||||||
|
because the warning facility in gcc-2.95.2 understands
|
||||||
|
only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */
|
||||||
|
if (sizeof (size_t) > sizeof (long))
|
||||||
|
{
|
||||||
|
/* size_t = long long */
|
||||||
|
flags += 16;
|
||||||
|
}
|
||||||
|
else if (sizeof (size_t) > sizeof (int))
|
||||||
|
{
|
||||||
|
/* size_t = long */
|
||||||
|
flags += 8;
|
||||||
|
}
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == 't')
|
||||||
|
{
|
||||||
|
if (sizeof (ptrdiff_t) > sizeof (long))
|
||||||
|
{
|
||||||
|
/* ptrdiff_t = long long */
|
||||||
|
flags += 16;
|
||||||
|
}
|
||||||
|
else if (sizeof (ptrdiff_t) > sizeof (int))
|
||||||
|
{
|
||||||
|
/* ptrdiff_t = long */
|
||||||
|
flags += 8;
|
||||||
|
}
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
#if defined __APPLE__ && defined __MACH__
|
||||||
|
/* On Mac OS X 10.3, PRIdMAX is defined as "qd".
|
||||||
|
We cannot change it to "lld" because PRIdMAX must also
|
||||||
|
be understood by the system's printf routines. */
|
||||||
|
else if (*cp == 'q')
|
||||||
|
{
|
||||||
|
if (64 / 8 > sizeof (long))
|
||||||
|
{
|
||||||
|
/* int64_t = long long */
|
||||||
|
flags += 16;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* int64_t = long */
|
||||||
|
flags += 8;
|
||||||
|
}
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||||
|
/* On native Windows, PRIdMAX is defined as "I64d".
|
||||||
|
We cannot change it to "lld" because PRIdMAX must also
|
||||||
|
be understood by the system's printf routines. */
|
||||||
|
else if (*cp == 'I' && cp[1] == '6' && cp[2] == '4')
|
||||||
|
{
|
||||||
|
if (64 / 8 > sizeof (long))
|
||||||
|
{
|
||||||
|
/* __int64 = long long */
|
||||||
|
flags += 16;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* __int64 = long */
|
||||||
|
flags += 8;
|
||||||
|
}
|
||||||
|
cp += 3;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read the conversion character. */
|
||||||
|
c = *cp++;
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case 'd': case 'i':
|
||||||
|
#if HAVE_LONG_LONG_INT
|
||||||
|
/* If 'long long' exists and is larger than 'long': */
|
||||||
|
if (flags >= 16 || (flags & 4))
|
||||||
|
type = TYPE_LONGLONGINT;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
/* If 'long long' exists and is the same as 'long', we parse
|
||||||
|
"lld" into TYPE_LONGINT. */
|
||||||
|
if (flags >= 8)
|
||||||
|
type = TYPE_LONGINT;
|
||||||
|
else if (flags & 2)
|
||||||
|
type = TYPE_SCHAR;
|
||||||
|
else if (flags & 1)
|
||||||
|
type = TYPE_SHORT;
|
||||||
|
else
|
||||||
|
type = TYPE_INT;
|
||||||
|
break;
|
||||||
|
case 'o': case 'u': case 'x': case 'X':
|
||||||
|
#if HAVE_LONG_LONG_INT
|
||||||
|
/* If 'long long' exists and is larger than 'long': */
|
||||||
|
if (flags >= 16 || (flags & 4))
|
||||||
|
type = TYPE_ULONGLONGINT;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
/* If 'unsigned long long' exists and is the same as
|
||||||
|
'unsigned long', we parse "llu" into TYPE_ULONGINT. */
|
||||||
|
if (flags >= 8)
|
||||||
|
type = TYPE_ULONGINT;
|
||||||
|
else if (flags & 2)
|
||||||
|
type = TYPE_UCHAR;
|
||||||
|
else if (flags & 1)
|
||||||
|
type = TYPE_USHORT;
|
||||||
|
else
|
||||||
|
type = TYPE_UINT;
|
||||||
|
break;
|
||||||
|
case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
|
||||||
|
case 'a': case 'A':
|
||||||
|
if (flags >= 16 || (flags & 4))
|
||||||
|
type = TYPE_LONGDOUBLE;
|
||||||
|
else
|
||||||
|
type = TYPE_DOUBLE;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
if (flags >= 8)
|
||||||
|
#if HAVE_WINT_T
|
||||||
|
type = TYPE_WIDE_CHAR;
|
||||||
|
#else
|
||||||
|
goto error;
|
||||||
|
#endif
|
||||||
|
else
|
||||||
|
type = TYPE_CHAR;
|
||||||
|
break;
|
||||||
|
#if HAVE_WINT_T
|
||||||
|
case 'C':
|
||||||
|
type = TYPE_WIDE_CHAR;
|
||||||
|
c = 'c';
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case 's':
|
||||||
|
if (flags >= 8)
|
||||||
|
#if HAVE_WCHAR_T
|
||||||
|
type = TYPE_WIDE_STRING;
|
||||||
|
#else
|
||||||
|
goto error;
|
||||||
|
#endif
|
||||||
|
else
|
||||||
|
type = TYPE_STRING;
|
||||||
|
break;
|
||||||
|
#if HAVE_WCHAR_T
|
||||||
|
case 'S':
|
||||||
|
type = TYPE_WIDE_STRING;
|
||||||
|
c = 's';
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case 'p':
|
||||||
|
type = TYPE_POINTER;
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
#if HAVE_LONG_LONG_INT
|
||||||
|
/* If 'long long' exists and is larger than 'long': */
|
||||||
|
if (flags >= 16 || (flags & 4))
|
||||||
|
type = TYPE_COUNT_LONGLONGINT_POINTER;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
/* If 'long long' exists and is the same as 'long', we parse
|
||||||
|
"lln" into TYPE_COUNT_LONGINT_POINTER. */
|
||||||
|
if (flags >= 8)
|
||||||
|
type = TYPE_COUNT_LONGINT_POINTER;
|
||||||
|
else if (flags & 2)
|
||||||
|
type = TYPE_COUNT_SCHAR_POINTER;
|
||||||
|
else if (flags & 1)
|
||||||
|
type = TYPE_COUNT_SHORT_POINTER;
|
||||||
|
else
|
||||||
|
type = TYPE_COUNT_INT_POINTER;
|
||||||
|
break;
|
||||||
|
#if ENABLE_UNISTDIO
|
||||||
|
/* The unistdio extensions. */
|
||||||
|
case 'U':
|
||||||
|
if (flags >= 16)
|
||||||
|
type = TYPE_U32_STRING;
|
||||||
|
else if (flags >= 8)
|
||||||
|
type = TYPE_U16_STRING;
|
||||||
|
else
|
||||||
|
type = TYPE_U8_STRING;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case '%':
|
||||||
|
type = TYPE_NONE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* Unknown conversion character. */
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type != TYPE_NONE)
|
||||||
|
{
|
||||||
|
dp->arg_index = arg_index;
|
||||||
|
if (dp->arg_index == ARG_NONE)
|
||||||
|
{
|
||||||
|
dp->arg_index = arg_posn++;
|
||||||
|
if (dp->arg_index == ARG_NONE)
|
||||||
|
/* arg_posn wrapped around. */
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
REGISTER_ARG (dp->arg_index, type);
|
||||||
|
}
|
||||||
|
dp->conversion = c;
|
||||||
|
dp->dir_end = cp;
|
||||||
|
}
|
||||||
|
|
||||||
|
d->count++;
|
||||||
|
if (d->count >= d_allocated)
|
||||||
|
{
|
||||||
|
size_t memory_size;
|
||||||
|
DIRECTIVE *memory;
|
||||||
|
|
||||||
|
d_allocated = xtimes (d_allocated, 2);
|
||||||
|
memory_size = xtimes (d_allocated, sizeof (DIRECTIVE));
|
||||||
|
if (size_overflow_p (memory_size))
|
||||||
|
/* Overflow, would lead to out of memory. */
|
||||||
|
goto out_of_memory;
|
||||||
|
memory = (DIRECTIVE *) (d->dir != d->direct_alloc_dir
|
||||||
|
? realloc (d->dir, memory_size)
|
||||||
|
: malloc (memory_size));
|
||||||
|
if (memory == NULL)
|
||||||
|
/* Out of memory. */
|
||||||
|
goto out_of_memory;
|
||||||
|
if (d->dir == d->direct_alloc_dir)
|
||||||
|
memcpy (memory, d->dir, d->count * sizeof (DIRECTIVE));
|
||||||
|
d->dir = memory;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if CHAR_T_ONLY_ASCII
|
||||||
|
else if (!c_isascii (c))
|
||||||
|
{
|
||||||
|
/* Non-ASCII character. Not supported. */
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
d->dir[d->count].dir_start = cp;
|
||||||
|
|
||||||
|
d->max_width_length = max_width_length;
|
||||||
|
d->max_precision_length = max_precision_length;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (a->arg != a->direct_alloc_arg)
|
||||||
|
free (a->arg);
|
||||||
|
if (d->dir != d->direct_alloc_dir)
|
||||||
|
free (d->dir);
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
out_of_memory:
|
||||||
|
if (a->arg != a->direct_alloc_arg)
|
||||||
|
free (a->arg);
|
||||||
|
if (d->dir != d->direct_alloc_dir)
|
||||||
|
free (d->dir);
|
||||||
|
errno = ENOMEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef PRINTF_PARSE
|
||||||
|
#undef DIRECTIVES
|
||||||
|
#undef DIRECTIVE
|
||||||
|
#undef CHAR_T_ONLY_ASCII
|
||||||
|
#undef CHAR_T
|
||||||
193
lib/printf-parse.h
Normal file
193
lib/printf-parse.h
Normal file
|
|
@ -0,0 +1,193 @@
|
||||||
|
/* Parse printf format string.
|
||||||
|
Copyright (C) 1999, 2002-2003, 2005, 2007, 2010-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _PRINTF_PARSE_H
|
||||||
|
#define _PRINTF_PARSE_H
|
||||||
|
|
||||||
|
/* This file can be parametrized with the following macros:
|
||||||
|
ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
|
||||||
|
STATIC Set to 'static' to declare the function static. */
|
||||||
|
|
||||||
|
#if HAVE_FEATURES_H
|
||||||
|
# include <features.h> /* for __GLIBC__, __UCLIBC__ */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "printf-args.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Flags */
|
||||||
|
#define FLAG_GROUP 1 /* ' flag */
|
||||||
|
#define FLAG_LEFT 2 /* - flag */
|
||||||
|
#define FLAG_SHOWSIGN 4 /* + flag */
|
||||||
|
#define FLAG_SPACE 8 /* space flag */
|
||||||
|
#define FLAG_ALT 16 /* # flag */
|
||||||
|
#define FLAG_ZERO 32
|
||||||
|
#if __GLIBC__ >= 2 && !defined __UCLIBC__
|
||||||
|
# define FLAG_LOCALIZED 64 /* I flag, uses localized digits */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* arg_index value indicating that no argument is consumed. */
|
||||||
|
#define ARG_NONE (~(size_t)0)
|
||||||
|
|
||||||
|
/* xxx_directive: A parsed directive.
|
||||||
|
xxx_directives: A parsed format string. */
|
||||||
|
|
||||||
|
/* Number of directly allocated directives (no malloc() needed). */
|
||||||
|
#define N_DIRECT_ALLOC_DIRECTIVES 7
|
||||||
|
|
||||||
|
/* A parsed directive. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const char* dir_start;
|
||||||
|
const char* dir_end;
|
||||||
|
int flags;
|
||||||
|
const char* width_start;
|
||||||
|
const char* width_end;
|
||||||
|
size_t width_arg_index;
|
||||||
|
const char* precision_start;
|
||||||
|
const char* precision_end;
|
||||||
|
size_t precision_arg_index;
|
||||||
|
char conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
|
||||||
|
size_t arg_index;
|
||||||
|
}
|
||||||
|
char_directive;
|
||||||
|
|
||||||
|
/* A parsed format string. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
size_t count;
|
||||||
|
char_directive *dir;
|
||||||
|
size_t max_width_length;
|
||||||
|
size_t max_precision_length;
|
||||||
|
char_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
|
||||||
|
}
|
||||||
|
char_directives;
|
||||||
|
|
||||||
|
#if ENABLE_UNISTDIO
|
||||||
|
|
||||||
|
/* A parsed directive. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const uint8_t* dir_start;
|
||||||
|
const uint8_t* dir_end;
|
||||||
|
int flags;
|
||||||
|
const uint8_t* width_start;
|
||||||
|
const uint8_t* width_end;
|
||||||
|
size_t width_arg_index;
|
||||||
|
const uint8_t* precision_start;
|
||||||
|
const uint8_t* precision_end;
|
||||||
|
size_t precision_arg_index;
|
||||||
|
uint8_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
|
||||||
|
size_t arg_index;
|
||||||
|
}
|
||||||
|
u8_directive;
|
||||||
|
|
||||||
|
/* A parsed format string. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
size_t count;
|
||||||
|
u8_directive *dir;
|
||||||
|
size_t max_width_length;
|
||||||
|
size_t max_precision_length;
|
||||||
|
u8_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
|
||||||
|
}
|
||||||
|
u8_directives;
|
||||||
|
|
||||||
|
/* A parsed directive. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const uint16_t* dir_start;
|
||||||
|
const uint16_t* dir_end;
|
||||||
|
int flags;
|
||||||
|
const uint16_t* width_start;
|
||||||
|
const uint16_t* width_end;
|
||||||
|
size_t width_arg_index;
|
||||||
|
const uint16_t* precision_start;
|
||||||
|
const uint16_t* precision_end;
|
||||||
|
size_t precision_arg_index;
|
||||||
|
uint16_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
|
||||||
|
size_t arg_index;
|
||||||
|
}
|
||||||
|
u16_directive;
|
||||||
|
|
||||||
|
/* A parsed format string. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
size_t count;
|
||||||
|
u16_directive *dir;
|
||||||
|
size_t max_width_length;
|
||||||
|
size_t max_precision_length;
|
||||||
|
u16_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
|
||||||
|
}
|
||||||
|
u16_directives;
|
||||||
|
|
||||||
|
/* A parsed directive. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const uint32_t* dir_start;
|
||||||
|
const uint32_t* dir_end;
|
||||||
|
int flags;
|
||||||
|
const uint32_t* width_start;
|
||||||
|
const uint32_t* width_end;
|
||||||
|
size_t width_arg_index;
|
||||||
|
const uint32_t* precision_start;
|
||||||
|
const uint32_t* precision_end;
|
||||||
|
size_t precision_arg_index;
|
||||||
|
uint32_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
|
||||||
|
size_t arg_index;
|
||||||
|
}
|
||||||
|
u32_directive;
|
||||||
|
|
||||||
|
/* A parsed format string. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
size_t count;
|
||||||
|
u32_directive *dir;
|
||||||
|
size_t max_width_length;
|
||||||
|
size_t max_precision_length;
|
||||||
|
u32_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
|
||||||
|
}
|
||||||
|
u32_directives;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Parses the format string. Fills in the number N of directives, and fills
|
||||||
|
in directives[0], ..., directives[N-1], and sets directives[N].dir_start
|
||||||
|
to the end of the format string. Also fills in the arg_type fields of the
|
||||||
|
arguments and the needed count of arguments. */
|
||||||
|
#if ENABLE_UNISTDIO
|
||||||
|
extern int
|
||||||
|
ulc_printf_parse (const char *format, char_directives *d, arguments *a);
|
||||||
|
extern int
|
||||||
|
u8_printf_parse (const uint8_t *format, u8_directives *d, arguments *a);
|
||||||
|
extern int
|
||||||
|
u16_printf_parse (const uint16_t *format, u16_directives *d,
|
||||||
|
arguments *a);
|
||||||
|
extern int
|
||||||
|
u32_printf_parse (const uint32_t *format, u32_directives *d,
|
||||||
|
arguments *a);
|
||||||
|
#else
|
||||||
|
# ifdef STATIC
|
||||||
|
STATIC
|
||||||
|
# else
|
||||||
|
extern
|
||||||
|
# endif
|
||||||
|
int printf_parse (const char *format, char_directives *d, arguments *a);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _PRINTF_PARSE_H */
|
||||||
136
lib/rawmemchr.c
Normal file
136
lib/rawmemchr.c
Normal file
|
|
@ -0,0 +1,136 @@
|
||||||
|
/* Searching in a string.
|
||||||
|
Copyright (C) 2008-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* Find the first occurrence of C in S. */
|
||||||
|
void *
|
||||||
|
rawmemchr (const void *s, int c_in)
|
||||||
|
{
|
||||||
|
/* On 32-bit hardware, choosing longword to be a 32-bit unsigned
|
||||||
|
long instead of a 64-bit uintmax_t tends to give better
|
||||||
|
performance. On 64-bit hardware, unsigned long is generally 64
|
||||||
|
bits already. Change this typedef to experiment with
|
||||||
|
performance. */
|
||||||
|
typedef unsigned long int longword;
|
||||||
|
|
||||||
|
const unsigned char *char_ptr;
|
||||||
|
const longword *longword_ptr;
|
||||||
|
longword repeated_one;
|
||||||
|
longword repeated_c;
|
||||||
|
unsigned char c;
|
||||||
|
|
||||||
|
c = (unsigned char) c_in;
|
||||||
|
|
||||||
|
/* Handle the first few bytes by reading one byte at a time.
|
||||||
|
Do this until CHAR_PTR is aligned on a longword boundary. */
|
||||||
|
for (char_ptr = (const unsigned char *) s;
|
||||||
|
(size_t) char_ptr % sizeof (longword) != 0;
|
||||||
|
++char_ptr)
|
||||||
|
if (*char_ptr == c)
|
||||||
|
return (void *) char_ptr;
|
||||||
|
|
||||||
|
longword_ptr = (const longword *) char_ptr;
|
||||||
|
|
||||||
|
/* All these elucidatory comments refer to 4-byte longwords,
|
||||||
|
but the theory applies equally well to any size longwords. */
|
||||||
|
|
||||||
|
/* Compute auxiliary longword values:
|
||||||
|
repeated_one is a value which has a 1 in every byte.
|
||||||
|
repeated_c has c in every byte. */
|
||||||
|
repeated_one = 0x01010101;
|
||||||
|
repeated_c = c | (c << 8);
|
||||||
|
repeated_c |= repeated_c << 16;
|
||||||
|
if (0xffffffffU < (longword) -1)
|
||||||
|
{
|
||||||
|
repeated_one |= repeated_one << 31 << 1;
|
||||||
|
repeated_c |= repeated_c << 31 << 1;
|
||||||
|
if (8 < sizeof (longword))
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 64; i < sizeof (longword) * 8; i *= 2)
|
||||||
|
{
|
||||||
|
repeated_one |= repeated_one << i;
|
||||||
|
repeated_c |= repeated_c << i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Instead of the traditional loop which tests each byte, we will
|
||||||
|
test a longword at a time. The tricky part is testing if *any of
|
||||||
|
the four* bytes in the longword in question are equal to NUL or
|
||||||
|
c. We first use an xor with repeated_c. This reduces the task
|
||||||
|
to testing whether *any of the four* bytes in longword1 is zero.
|
||||||
|
|
||||||
|
We compute tmp =
|
||||||
|
((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
|
||||||
|
That is, we perform the following operations:
|
||||||
|
1. Subtract repeated_one.
|
||||||
|
2. & ~longword1.
|
||||||
|
3. & a mask consisting of 0x80 in every byte.
|
||||||
|
Consider what happens in each byte:
|
||||||
|
- If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
|
||||||
|
and step 3 transforms it into 0x80. A carry can also be propagated
|
||||||
|
to more significant bytes.
|
||||||
|
- If a byte of longword1 is nonzero, let its lowest 1 bit be at
|
||||||
|
position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
|
||||||
|
the byte ends in a single bit of value 0 and k bits of value 1.
|
||||||
|
After step 2, the result is just k bits of value 1: 2^k - 1. After
|
||||||
|
step 3, the result is 0. And no carry is produced.
|
||||||
|
So, if longword1 has only non-zero bytes, tmp is zero.
|
||||||
|
Whereas if longword1 has a zero byte, call j the position of the least
|
||||||
|
significant zero byte. Then the result has a zero at positions 0, ...,
|
||||||
|
j-1 and a 0x80 at position j. We cannot predict the result at the more
|
||||||
|
significant bytes (positions j+1..3), but it does not matter since we
|
||||||
|
already have a non-zero bit at position 8*j+7.
|
||||||
|
|
||||||
|
The test whether any byte in longword1 is zero is equivalent
|
||||||
|
to testing whether tmp is nonzero.
|
||||||
|
|
||||||
|
This test can read beyond the end of a string, depending on where
|
||||||
|
C_IN is encountered. However, this is considered safe since the
|
||||||
|
initialization phase ensured that the read will be aligned,
|
||||||
|
therefore, the read will not cross page boundaries and will not
|
||||||
|
cause a fault. */
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
longword longword1 = *longword_ptr ^ repeated_c;
|
||||||
|
|
||||||
|
if ((((longword1 - repeated_one) & ~longword1)
|
||||||
|
& (repeated_one << 7)) != 0)
|
||||||
|
break;
|
||||||
|
longword_ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
char_ptr = (const unsigned char *) longword_ptr;
|
||||||
|
|
||||||
|
/* At this point, we know that one of the sizeof (longword) bytes
|
||||||
|
starting at char_ptr is == c. On little-endian machines, we
|
||||||
|
could determine the first such byte without any further memory
|
||||||
|
accesses, just by looking at the tmp result from the last loop
|
||||||
|
iteration. But this does not work on big-endian machines.
|
||||||
|
Choose code that works in both cases. */
|
||||||
|
|
||||||
|
char_ptr = (unsigned char *) longword_ptr;
|
||||||
|
while (*char_ptr != c)
|
||||||
|
char_ptr++;
|
||||||
|
return (void *) char_ptr;
|
||||||
|
}
|
||||||
12
lib/rawmemchr.valgrind
Normal file
12
lib/rawmemchr.valgrind
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
# Suppress a valgrind message about use of uninitialized memory in rawmemchr().
|
||||||
|
# This use is OK because it provides only a speedup.
|
||||||
|
{
|
||||||
|
rawmemchr-value4
|
||||||
|
Memcheck:Value4
|
||||||
|
fun:rawmemchr
|
||||||
|
}
|
||||||
|
{
|
||||||
|
rawmemchr-value8
|
||||||
|
Memcheck:Value8
|
||||||
|
fun:rawmemchr
|
||||||
|
}
|
||||||
30
lib/size_max.h
Normal file
30
lib/size_max.h
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
/* size_max.h -- declare SIZE_MAX through system headers
|
||||||
|
Copyright (C) 2005-2006, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
Written by Simon Josefsson.
|
||||||
|
|
||||||
|
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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef GNULIB_SIZE_MAX_H
|
||||||
|
#define GNULIB_SIZE_MAX_H
|
||||||
|
|
||||||
|
/* Get SIZE_MAX declaration on systems like Solaris 7/8/9. */
|
||||||
|
# include <limits.h>
|
||||||
|
/* Get SIZE_MAX declaration on systems like glibc 2. */
|
||||||
|
# if HAVE_STDINT_H
|
||||||
|
# include <stdint.h>
|
||||||
|
# endif
|
||||||
|
/* On systems where these include files don't define it, SIZE_MAX is defined
|
||||||
|
in config.h. */
|
||||||
|
|
||||||
|
#endif /* GNULIB_SIZE_MAX_H */
|
||||||
76
lib/sleep.c
Normal file
76
lib/sleep.c
Normal file
|
|
@ -0,0 +1,76 @@
|
||||||
|
/* Pausing execution of the current thread.
|
||||||
|
Copyright (C) 2007, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 2007.
|
||||||
|
|
||||||
|
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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#include "verify.h"
|
||||||
|
|
||||||
|
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||||
|
|
||||||
|
# define WIN32_LEAN_AND_MEAN /* avoid including junk */
|
||||||
|
# include <windows.h>
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
sleep (unsigned int seconds)
|
||||||
|
{
|
||||||
|
unsigned int remaining;
|
||||||
|
|
||||||
|
/* Sleep for 1 second many times, because
|
||||||
|
1. Sleep is not interruptible by Ctrl-C,
|
||||||
|
2. we want to avoid arithmetic overflow while multiplying with 1000. */
|
||||||
|
for (remaining = seconds; remaining > 0; remaining--)
|
||||||
|
Sleep (1000);
|
||||||
|
|
||||||
|
return remaining;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif HAVE_SLEEP
|
||||||
|
|
||||||
|
# undef sleep
|
||||||
|
|
||||||
|
/* Guarantee unlimited sleep and a reasonable return value. Cygwin
|
||||||
|
1.5.x rejects attempts to sleep more than 49.7 days (2**32
|
||||||
|
milliseconds), but uses uninitialized memory which results in a
|
||||||
|
garbage answer. Similarly, Linux 2.6.9 with glibc 2.3.4 has a too
|
||||||
|
small return value when asked to sleep more than 24.85 days. */
|
||||||
|
unsigned int
|
||||||
|
rpl_sleep (unsigned int seconds)
|
||||||
|
{
|
||||||
|
/* This requires int larger than 16 bits. */
|
||||||
|
verify (UINT_MAX / 24 / 24 / 60 / 60);
|
||||||
|
const unsigned int limit = 24 * 24 * 60 * 60;
|
||||||
|
while (limit < seconds)
|
||||||
|
{
|
||||||
|
unsigned int result;
|
||||||
|
seconds -= limit;
|
||||||
|
result = sleep (limit);
|
||||||
|
if (result)
|
||||||
|
return seconds + result;
|
||||||
|
}
|
||||||
|
return sleep (seconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* !HAVE_SLEEP */
|
||||||
|
|
||||||
|
#error "Please port gnulib sleep.c to your platform, possibly using usleep() or select(), then report this to bug-gnulib."
|
||||||
|
|
||||||
|
#endif
|
||||||
90
lib/stdalign.in.h
Normal file
90
lib/stdalign.in.h
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
/* A substitute for ISO C11 <stdalign.h>.
|
||||||
|
|
||||||
|
Copyright 2011-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Paul Eggert and Bruno Haible. */
|
||||||
|
|
||||||
|
#ifndef _GL_STDALIGN_H
|
||||||
|
#define _GL_STDALIGN_H
|
||||||
|
|
||||||
|
/* ISO C11 <stdalign.h> for platforms that lack it.
|
||||||
|
|
||||||
|
References:
|
||||||
|
ISO C11 (latest free draft
|
||||||
|
<http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf>)
|
||||||
|
sections 6.5.3.4, 6.7.5, 7.15.
|
||||||
|
C++11 (latest free draft
|
||||||
|
<http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf>)
|
||||||
|
section 18.10. */
|
||||||
|
|
||||||
|
/* alignof (TYPE), also known as _Alignof (TYPE), yields the alignment
|
||||||
|
requirement of a structure member (i.e., slot or field) that is of
|
||||||
|
type TYPE, as an integer constant expression.
|
||||||
|
|
||||||
|
This differs from GCC's __alignof__ operator, which can yield a
|
||||||
|
better-performing alignment for an object of that type. For
|
||||||
|
example, on x86 with GCC, __alignof__ (double) and __alignof__
|
||||||
|
(long long) are 8, whereas alignof (double) and alignof (long long)
|
||||||
|
are 4 unless the option '-malign-double' is used.
|
||||||
|
|
||||||
|
The result cannot be used as a value for an 'enum' constant, if you
|
||||||
|
want to be portable to HP-UX 10.20 cc and AIX 3.2.5 xlc. */
|
||||||
|
#include <stddef.h>
|
||||||
|
#if defined __cplusplus
|
||||||
|
template <class __t> struct __alignof_helper { char __a; __t __b; };
|
||||||
|
# define _Alignof(type) offsetof (__alignof_helper<type>, __b)
|
||||||
|
#else
|
||||||
|
# define _Alignof(type) offsetof (struct { char __a; type __b; }, __b)
|
||||||
|
#endif
|
||||||
|
#define alignof _Alignof
|
||||||
|
#define __alignof_is_defined 1
|
||||||
|
|
||||||
|
/* alignas (A), also known as _Alignas (A), aligns a variable or type
|
||||||
|
to the alignment A, where A is an integer constant expression. For
|
||||||
|
example:
|
||||||
|
|
||||||
|
int alignas (8) foo;
|
||||||
|
struct s { int a; int alignas (8) bar; };
|
||||||
|
|
||||||
|
aligns the address of FOO and the offset of BAR to be multiples of 8.
|
||||||
|
|
||||||
|
A should be a power of two that is at least the type's alignment
|
||||||
|
and at most the implementation's alignment limit. This limit is
|
||||||
|
2**28 on typical GNUish hosts, and 2**13 on MSVC. To be portable
|
||||||
|
to MSVC through at least version 10.0, A should be an integer
|
||||||
|
constant, as MSVC does not support expressions such as 1 << 3.
|
||||||
|
To be portable to Sun C 5.11, do not align auto variables to
|
||||||
|
anything stricter than their default alignment.
|
||||||
|
|
||||||
|
The following C11 requirements are not supported here:
|
||||||
|
|
||||||
|
- If A is zero, alignas has no effect.
|
||||||
|
- alignas can be used multiple times; the strictest one wins.
|
||||||
|
- alignas (TYPE) is equivalent to alignas (alignof (TYPE)).
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if __GNUC__ || __IBMC__ || __IBMCPP__ || 0x5110 <= __SUNPRO_C
|
||||||
|
# define _Alignas(a) __attribute__ ((__aligned__ (a)))
|
||||||
|
#elif 1300 <= _MSC_VER
|
||||||
|
# define _Alignas(a) __declspec (align (a))
|
||||||
|
#endif
|
||||||
|
#ifdef _Alignas
|
||||||
|
# define alignas _Alignas
|
||||||
|
# define __alignas_is_defined 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _GL_STDALIGN_H */
|
||||||
132
lib/stdbool.in.h
Normal file
132
lib/stdbool.in.h
Normal file
|
|
@ -0,0 +1,132 @@
|
||||||
|
/* Copyright (C) 2001-2003, 2006-2012 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <haible@clisp.cons.org>, 2001.
|
||||||
|
|
||||||
|
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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _GL_STDBOOL_H
|
||||||
|
#define _GL_STDBOOL_H
|
||||||
|
|
||||||
|
/* ISO C 99 <stdbool.h> for platforms that lack it. */
|
||||||
|
|
||||||
|
/* Usage suggestions:
|
||||||
|
|
||||||
|
Programs that use <stdbool.h> should be aware of some limitations
|
||||||
|
and standards compliance issues.
|
||||||
|
|
||||||
|
Standards compliance:
|
||||||
|
|
||||||
|
- <stdbool.h> must be #included before 'bool', 'false', 'true'
|
||||||
|
can be used.
|
||||||
|
|
||||||
|
- You cannot assume that sizeof (bool) == 1.
|
||||||
|
|
||||||
|
- Programs should not undefine the macros bool, true, and false,
|
||||||
|
as C99 lists that as an "obsolescent feature".
|
||||||
|
|
||||||
|
Limitations of this substitute, when used in a C89 environment:
|
||||||
|
|
||||||
|
- <stdbool.h> must be #included before the '_Bool' type can be used.
|
||||||
|
|
||||||
|
- You cannot assume that _Bool is a typedef; it might be a macro.
|
||||||
|
|
||||||
|
- Bit-fields of type 'bool' are not supported. Portable code
|
||||||
|
should use 'unsigned int foo : 1;' rather than 'bool foo : 1;'.
|
||||||
|
|
||||||
|
- In C99, casts and automatic conversions to '_Bool' or 'bool' are
|
||||||
|
performed in such a way that every nonzero value gets converted
|
||||||
|
to 'true', and zero gets converted to 'false'. This doesn't work
|
||||||
|
with this substitute. With this substitute, only the values 0 and 1
|
||||||
|
give the expected result when converted to _Bool' or 'bool'.
|
||||||
|
|
||||||
|
- C99 allows the use of (_Bool)0.0 in constant expressions, but
|
||||||
|
this substitute cannot always provide this property.
|
||||||
|
|
||||||
|
Also, it is suggested that programs use 'bool' rather than '_Bool';
|
||||||
|
this isn't required, but 'bool' is more common. */
|
||||||
|
|
||||||
|
|
||||||
|
/* 7.16. Boolean type and values */
|
||||||
|
|
||||||
|
/* BeOS <sys/socket.h> already #defines false 0, true 1. We use the same
|
||||||
|
definitions below, but temporarily we have to #undef them. */
|
||||||
|
#if defined __BEOS__ && !defined __HAIKU__
|
||||||
|
# include <OS.h> /* defines bool but not _Bool */
|
||||||
|
# undef false
|
||||||
|
# undef true
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
# define _Bool bool
|
||||||
|
# define bool bool
|
||||||
|
#else
|
||||||
|
# if defined __BEOS__ && !defined __HAIKU__
|
||||||
|
/* A compiler known to have 'bool'. */
|
||||||
|
/* If the compiler already has both 'bool' and '_Bool', we can assume they
|
||||||
|
are the same types. */
|
||||||
|
# if !@HAVE__BOOL@
|
||||||
|
typedef bool _Bool;
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# if !defined __GNUC__
|
||||||
|
/* If @HAVE__BOOL@:
|
||||||
|
Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when
|
||||||
|
the built-in _Bool type is used. See
|
||||||
|
http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
|
||||||
|
http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
|
||||||
|
http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
|
||||||
|
Similar bugs are likely with other compilers as well; this file
|
||||||
|
wouldn't be used if <stdbool.h> was working.
|
||||||
|
So we override the _Bool type.
|
||||||
|
If !@HAVE__BOOL@:
|
||||||
|
Need to define _Bool ourselves. As 'signed char' or as an enum type?
|
||||||
|
Use of a typedef, with SunPRO C, leads to a stupid
|
||||||
|
"warning: _Bool is a keyword in ISO C99".
|
||||||
|
Use of an enum type, with IRIX cc, leads to a stupid
|
||||||
|
"warning(1185): enumerated type mixed with another type".
|
||||||
|
Even the existence of an enum type, without a typedef,
|
||||||
|
"Invalid enumerator. (badenum)" with HP-UX cc on Tru64.
|
||||||
|
The only benefit of the enum, debuggability, is not important
|
||||||
|
with these compilers. So use 'signed char' and no enum. */
|
||||||
|
# define _Bool signed char
|
||||||
|
# else
|
||||||
|
/* With this compiler, trust the _Bool type if the compiler has it. */
|
||||||
|
# if !@HAVE__BOOL@
|
||||||
|
/* For the sake of symbolic names in gdb, define true and false as
|
||||||
|
enum constants, not only as macros.
|
||||||
|
It is tempting to write
|
||||||
|
typedef enum { false = 0, true = 1 } _Bool;
|
||||||
|
so that gdb prints values of type 'bool' symbolically. But then
|
||||||
|
values of type '_Bool' might promote to 'int' or 'unsigned int'
|
||||||
|
(see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int'
|
||||||
|
(see ISO C 99 6.3.1.1.(2)). So add a negative value to the
|
||||||
|
enum; this ensures that '_Bool' promotes to 'int'. */
|
||||||
|
typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# define bool _Bool
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The other macros must be usable in preprocessor directives. */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
# define false false
|
||||||
|
# define true true
|
||||||
|
#else
|
||||||
|
# define false 0
|
||||||
|
# define true 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __bool_true_false_are_defined 1
|
||||||
|
|
||||||
|
#endif /* _GL_STDBOOL_H */
|
||||||
86
lib/stddef.in.h
Normal file
86
lib/stddef.in.h
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
/* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
|
||||||
|
|
||||||
|
Copyright (C) 2009-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Eric Blake. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* POSIX 2008 <stddef.h> for platforms that have issues.
|
||||||
|
* <http://www.opengroup.org/susv3xbd/stddef.h.html>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
#if defined __need_wchar_t || defined __need_size_t \
|
||||||
|
|| defined __need_ptrdiff_t || defined __need_NULL \
|
||||||
|
|| defined __need_wint_t
|
||||||
|
/* Special invocation convention inside gcc header files. In
|
||||||
|
particular, gcc provides a version of <stddef.h> that blindly
|
||||||
|
redefines NULL even when __need_wint_t was defined, even though
|
||||||
|
wint_t is not normally provided by <stddef.h>. Hence, we must
|
||||||
|
remember if special invocation has ever been used to obtain wint_t,
|
||||||
|
in which case we need to clean up NULL yet again. */
|
||||||
|
|
||||||
|
# if !(defined _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T)
|
||||||
|
# ifdef __need_wint_t
|
||||||
|
# undef _@GUARD_PREFIX@_STDDEF_H
|
||||||
|
# define _GL_STDDEF_WINT_T
|
||||||
|
# endif
|
||||||
|
# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* Normal invocation convention. */
|
||||||
|
|
||||||
|
# ifndef _@GUARD_PREFIX@_STDDEF_H
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
|
||||||
|
# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
|
||||||
|
|
||||||
|
# ifndef _@GUARD_PREFIX@_STDDEF_H
|
||||||
|
# define _@GUARD_PREFIX@_STDDEF_H
|
||||||
|
|
||||||
|
/* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */
|
||||||
|
#if @REPLACE_NULL@
|
||||||
|
# undef NULL
|
||||||
|
# ifdef __cplusplus
|
||||||
|
/* ISO C++ says that the macro NULL must expand to an integer constant
|
||||||
|
expression, hence '((void *) 0)' is not allowed in C++. */
|
||||||
|
# if __GNUG__ >= 3
|
||||||
|
/* GNU C++ has a __null macro that behaves like an integer ('int' or
|
||||||
|
'long') but has the same size as a pointer. Use that, to avoid
|
||||||
|
warnings. */
|
||||||
|
# define NULL __null
|
||||||
|
# else
|
||||||
|
# define NULL 0L
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# define NULL ((void *) 0)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Some platforms lack wchar_t. */
|
||||||
|
#if !@HAVE_WCHAR_T@
|
||||||
|
# define wchar_t int
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# endif /* _@GUARD_PREFIX@_STDDEF_H */
|
||||||
|
# endif /* _@GUARD_PREFIX@_STDDEF_H */
|
||||||
|
#endif /* __need_XXX */
|
||||||
636
lib/stdint.in.h
Normal file
636
lib/stdint.in.h
Normal file
|
|
@ -0,0 +1,636 @@
|
||||||
|
/* Copyright (C) 2001-2002, 2004-2012 Free Software Foundation, Inc.
|
||||||
|
Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood.
|
||||||
|
This file is part of gnulib.
|
||||||
|
|
||||||
|
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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ISO C 99 <stdint.h> for platforms that lack it.
|
||||||
|
* <http://www.opengroup.org/susv3xbd/stdint.h.html>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_STDINT_H
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
/* When including a system file that in turn includes <inttypes.h>,
|
||||||
|
use the system <inttypes.h>, not our substitute. This avoids
|
||||||
|
problems with (for example) VMS, whose <sys/bitypes.h> includes
|
||||||
|
<inttypes.h>. */
|
||||||
|
#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
|
||||||
|
|
||||||
|
/* On Android (Bionic libc), <sys/types.h> includes this file before
|
||||||
|
having defined 'time_t'. Therefore in this case avoid including
|
||||||
|
other system header files; just include the system's <stdint.h>.
|
||||||
|
Ideally we should test __BIONIC__ here, but it is only defined after
|
||||||
|
<sys/cdefs.h> has been included; hence test __ANDROID__ instead. */
|
||||||
|
#if defined __ANDROID__ \
|
||||||
|
&& defined _SYS_TYPES_H_ && !defined _SSIZE_T_DEFINED_
|
||||||
|
# @INCLUDE_NEXT@ @NEXT_STDINT_H@
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Get those types that are already defined in other system include
|
||||||
|
files, so that we can "#define int8_t signed char" below without
|
||||||
|
worrying about a later system include file containing a "typedef
|
||||||
|
signed char int8_t;" that will get messed up by our macro. Our
|
||||||
|
macros should all be consistent with the system versions, except
|
||||||
|
for the "fast" types and macros, which we recommend against using
|
||||||
|
in public interfaces due to compiler differences. */
|
||||||
|
|
||||||
|
#if @HAVE_STDINT_H@
|
||||||
|
# if defined __sgi && ! defined __c99
|
||||||
|
/* Bypass IRIX's <stdint.h> if in C89 mode, since it merely annoys users
|
||||||
|
with "This header file is to be used only for c99 mode compilations"
|
||||||
|
diagnostics. */
|
||||||
|
# define __STDINT_H__
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Some pre-C++11 <stdint.h> implementations need this. */
|
||||||
|
# ifdef __cplusplus
|
||||||
|
# ifndef __STDC_CONSTANT_MACROS
|
||||||
|
# define __STDC_CONSTANT_MACROS 1
|
||||||
|
# endif
|
||||||
|
# ifndef __STDC_LIMIT_MACROS
|
||||||
|
# define __STDC_LIMIT_MACROS 1
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Other systems may have an incomplete or buggy <stdint.h>.
|
||||||
|
Include it before <inttypes.h>, since any "#include <stdint.h>"
|
||||||
|
in <inttypes.h> would reinclude us, skipping our contents because
|
||||||
|
_@GUARD_PREFIX@_STDINT_H is defined.
|
||||||
|
The include_next requires a split double-inclusion guard. */
|
||||||
|
# @INCLUDE_NEXT@ @NEXT_STDINT_H@
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ! defined _@GUARD_PREFIX@_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H
|
||||||
|
#define _@GUARD_PREFIX@_STDINT_H
|
||||||
|
|
||||||
|
/* <sys/types.h> defines some of the stdint.h types as well, on glibc,
|
||||||
|
IRIX 6.5, and OpenBSD 3.8 (via <machine/types.h>).
|
||||||
|
AIX 5.2 <sys/types.h> isn't needed and causes troubles.
|
||||||
|
Mac OS X 10.4.6 <sys/types.h> includes <stdint.h> (which is us), but
|
||||||
|
relies on the system <stdint.h> definitions, so include
|
||||||
|
<sys/types.h> after @NEXT_STDINT_H@. */
|
||||||
|
#if @HAVE_SYS_TYPES_H@ && ! defined _AIX
|
||||||
|
# include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, INT_MIN, INT_MAX,
|
||||||
|
LONG_MIN, LONG_MAX, ULONG_MAX. */
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#if @HAVE_INTTYPES_H@
|
||||||
|
/* In OpenBSD 3.8, <inttypes.h> includes <machine/types.h>, which defines
|
||||||
|
int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__.
|
||||||
|
<inttypes.h> also defines intptr_t and uintptr_t. */
|
||||||
|
# include <inttypes.h>
|
||||||
|
#elif @HAVE_SYS_INTTYPES_H@
|
||||||
|
/* Solaris 7 <sys/inttypes.h> has the types except the *_fast*_t types, and
|
||||||
|
the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX. */
|
||||||
|
# include <sys/inttypes.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @HAVE_SYS_BITYPES_H@ && ! defined __BIT_TYPES_DEFINED__
|
||||||
|
/* Linux libc4 >= 4.6.7 and libc5 have a <sys/bitypes.h> that defines
|
||||||
|
int{8,16,32,64}_t and __BIT_TYPES_DEFINED__. In libc5 >= 5.2.2 it is
|
||||||
|
included by <sys/types.h>. */
|
||||||
|
# include <sys/bitypes.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
|
||||||
|
|
||||||
|
/* Minimum and maximum values for an integer type under the usual assumption.
|
||||||
|
Return an unspecified value if BITS == 0, adding a check to pacify
|
||||||
|
picky compilers. */
|
||||||
|
|
||||||
|
#define _STDINT_MIN(signed, bits, zero) \
|
||||||
|
((signed) ? (- ((zero) + 1) << ((bits) ? (bits) - 1 : 0)) : (zero))
|
||||||
|
|
||||||
|
#define _STDINT_MAX(signed, bits, zero) \
|
||||||
|
((signed) \
|
||||||
|
? ~ _STDINT_MIN (signed, bits, zero) \
|
||||||
|
: /* The expression for the unsigned case. The subtraction of (signed) \
|
||||||
|
is a nop in the unsigned case and avoids "signed integer overflow" \
|
||||||
|
warnings in the signed case. */ \
|
||||||
|
((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1)
|
||||||
|
|
||||||
|
#if !GNULIB_defined_stdint_types
|
||||||
|
|
||||||
|
/* 7.18.1.1. Exact-width integer types */
|
||||||
|
|
||||||
|
/* Here we assume a standard architecture where the hardware integer
|
||||||
|
types have 8, 16, 32, optionally 64 bits. */
|
||||||
|
|
||||||
|
#undef int8_t
|
||||||
|
#undef uint8_t
|
||||||
|
typedef signed char gl_int8_t;
|
||||||
|
typedef unsigned char gl_uint8_t;
|
||||||
|
#define int8_t gl_int8_t
|
||||||
|
#define uint8_t gl_uint8_t
|
||||||
|
|
||||||
|
#undef int16_t
|
||||||
|
#undef uint16_t
|
||||||
|
typedef short int gl_int16_t;
|
||||||
|
typedef unsigned short int gl_uint16_t;
|
||||||
|
#define int16_t gl_int16_t
|
||||||
|
#define uint16_t gl_uint16_t
|
||||||
|
|
||||||
|
#undef int32_t
|
||||||
|
#undef uint32_t
|
||||||
|
typedef int gl_int32_t;
|
||||||
|
typedef unsigned int gl_uint32_t;
|
||||||
|
#define int32_t gl_int32_t
|
||||||
|
#define uint32_t gl_uint32_t
|
||||||
|
|
||||||
|
/* If the system defines INT64_MAX, assume int64_t works. That way,
|
||||||
|
if the underlying platform defines int64_t to be a 64-bit long long
|
||||||
|
int, the code below won't mistakenly define it to be a 64-bit long
|
||||||
|
int, which would mess up C++ name mangling. We must use #ifdef
|
||||||
|
rather than #if, to avoid an error with HP-UX 10.20 cc. */
|
||||||
|
|
||||||
|
#ifdef INT64_MAX
|
||||||
|
# define GL_INT64_T
|
||||||
|
#else
|
||||||
|
/* Do not undefine int64_t if gnulib is not being used with 64-bit
|
||||||
|
types, since otherwise it breaks platforms like Tandem/NSK. */
|
||||||
|
# if LONG_MAX >> 31 >> 31 == 1
|
||||||
|
# undef int64_t
|
||||||
|
typedef long int gl_int64_t;
|
||||||
|
# define int64_t gl_int64_t
|
||||||
|
# define GL_INT64_T
|
||||||
|
# elif defined _MSC_VER
|
||||||
|
# undef int64_t
|
||||||
|
typedef __int64 gl_int64_t;
|
||||||
|
# define int64_t gl_int64_t
|
||||||
|
# define GL_INT64_T
|
||||||
|
# elif @HAVE_LONG_LONG_INT@
|
||||||
|
# undef int64_t
|
||||||
|
typedef long long int gl_int64_t;
|
||||||
|
# define int64_t gl_int64_t
|
||||||
|
# define GL_INT64_T
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef UINT64_MAX
|
||||||
|
# define GL_UINT64_T
|
||||||
|
#else
|
||||||
|
# if ULONG_MAX >> 31 >> 31 >> 1 == 1
|
||||||
|
# undef uint64_t
|
||||||
|
typedef unsigned long int gl_uint64_t;
|
||||||
|
# define uint64_t gl_uint64_t
|
||||||
|
# define GL_UINT64_T
|
||||||
|
# elif defined _MSC_VER
|
||||||
|
# undef uint64_t
|
||||||
|
typedef unsigned __int64 gl_uint64_t;
|
||||||
|
# define uint64_t gl_uint64_t
|
||||||
|
# define GL_UINT64_T
|
||||||
|
# elif @HAVE_UNSIGNED_LONG_LONG_INT@
|
||||||
|
# undef uint64_t
|
||||||
|
typedef unsigned long long int gl_uint64_t;
|
||||||
|
# define uint64_t gl_uint64_t
|
||||||
|
# define GL_UINT64_T
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Avoid collision with Solaris 2.5.1 <pthread.h> etc. */
|
||||||
|
#define _UINT8_T
|
||||||
|
#define _UINT32_T
|
||||||
|
#define _UINT64_T
|
||||||
|
|
||||||
|
|
||||||
|
/* 7.18.1.2. Minimum-width integer types */
|
||||||
|
|
||||||
|
/* Here we assume a standard architecture where the hardware integer
|
||||||
|
types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
|
||||||
|
are the same as the corresponding N_t types. */
|
||||||
|
|
||||||
|
#undef int_least8_t
|
||||||
|
#undef uint_least8_t
|
||||||
|
#undef int_least16_t
|
||||||
|
#undef uint_least16_t
|
||||||
|
#undef int_least32_t
|
||||||
|
#undef uint_least32_t
|
||||||
|
#undef int_least64_t
|
||||||
|
#undef uint_least64_t
|
||||||
|
#define int_least8_t int8_t
|
||||||
|
#define uint_least8_t uint8_t
|
||||||
|
#define int_least16_t int16_t
|
||||||
|
#define uint_least16_t uint16_t
|
||||||
|
#define int_least32_t int32_t
|
||||||
|
#define uint_least32_t uint32_t
|
||||||
|
#ifdef GL_INT64_T
|
||||||
|
# define int_least64_t int64_t
|
||||||
|
#endif
|
||||||
|
#ifdef GL_UINT64_T
|
||||||
|
# define uint_least64_t uint64_t
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 7.18.1.3. Fastest minimum-width integer types */
|
||||||
|
|
||||||
|
/* Note: Other <stdint.h> substitutes may define these types differently.
|
||||||
|
It is not recommended to use these types in public header files. */
|
||||||
|
|
||||||
|
/* Here we assume a standard architecture where the hardware integer
|
||||||
|
types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
|
||||||
|
are taken from the same list of types. The following code normally
|
||||||
|
uses types consistent with glibc, as that lessens the chance of
|
||||||
|
incompatibility with older GNU hosts. */
|
||||||
|
|
||||||
|
#undef int_fast8_t
|
||||||
|
#undef uint_fast8_t
|
||||||
|
#undef int_fast16_t
|
||||||
|
#undef uint_fast16_t
|
||||||
|
#undef int_fast32_t
|
||||||
|
#undef uint_fast32_t
|
||||||
|
#undef int_fast64_t
|
||||||
|
#undef uint_fast64_t
|
||||||
|
typedef signed char gl_int_fast8_t;
|
||||||
|
typedef unsigned char gl_uint_fast8_t;
|
||||||
|
|
||||||
|
#ifdef __sun
|
||||||
|
/* Define types compatible with SunOS 5.10, so that code compiled under
|
||||||
|
earlier SunOS versions works with code compiled under SunOS 5.10. */
|
||||||
|
typedef int gl_int_fast32_t;
|
||||||
|
typedef unsigned int gl_uint_fast32_t;
|
||||||
|
#else
|
||||||
|
typedef long int gl_int_fast32_t;
|
||||||
|
typedef unsigned long int gl_uint_fast32_t;
|
||||||
|
#endif
|
||||||
|
typedef gl_int_fast32_t gl_int_fast16_t;
|
||||||
|
typedef gl_uint_fast32_t gl_uint_fast16_t;
|
||||||
|
|
||||||
|
#define int_fast8_t gl_int_fast8_t
|
||||||
|
#define uint_fast8_t gl_uint_fast8_t
|
||||||
|
#define int_fast16_t gl_int_fast16_t
|
||||||
|
#define uint_fast16_t gl_uint_fast16_t
|
||||||
|
#define int_fast32_t gl_int_fast32_t
|
||||||
|
#define uint_fast32_t gl_uint_fast32_t
|
||||||
|
#ifdef GL_INT64_T
|
||||||
|
# define int_fast64_t int64_t
|
||||||
|
#endif
|
||||||
|
#ifdef GL_UINT64_T
|
||||||
|
# define uint_fast64_t uint64_t
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 7.18.1.4. Integer types capable of holding object pointers */
|
||||||
|
|
||||||
|
#undef intptr_t
|
||||||
|
#undef uintptr_t
|
||||||
|
typedef long int gl_intptr_t;
|
||||||
|
typedef unsigned long int gl_uintptr_t;
|
||||||
|
#define intptr_t gl_intptr_t
|
||||||
|
#define uintptr_t gl_uintptr_t
|
||||||
|
|
||||||
|
/* 7.18.1.5. Greatest-width integer types */
|
||||||
|
|
||||||
|
/* Note: These types are compiler dependent. It may be unwise to use them in
|
||||||
|
public header files. */
|
||||||
|
|
||||||
|
/* If the system defines INTMAX_MAX, assume that intmax_t works, and
|
||||||
|
similarly for UINTMAX_MAX and uintmax_t. This avoids problems with
|
||||||
|
assuming one type where another is used by the system. */
|
||||||
|
|
||||||
|
#ifndef INTMAX_MAX
|
||||||
|
# undef INTMAX_C
|
||||||
|
# undef intmax_t
|
||||||
|
# if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
|
||||||
|
typedef long long int gl_intmax_t;
|
||||||
|
# define intmax_t gl_intmax_t
|
||||||
|
# elif defined GL_INT64_T
|
||||||
|
# define intmax_t int64_t
|
||||||
|
# else
|
||||||
|
typedef long int gl_intmax_t;
|
||||||
|
# define intmax_t gl_intmax_t
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef UINTMAX_MAX
|
||||||
|
# undef UINTMAX_C
|
||||||
|
# undef uintmax_t
|
||||||
|
# if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
|
||||||
|
typedef unsigned long long int gl_uintmax_t;
|
||||||
|
# define uintmax_t gl_uintmax_t
|
||||||
|
# elif defined GL_UINT64_T
|
||||||
|
# define uintmax_t uint64_t
|
||||||
|
# else
|
||||||
|
typedef unsigned long int gl_uintmax_t;
|
||||||
|
# define uintmax_t gl_uintmax_t
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Verify that intmax_t and uintmax_t have the same size. Too much code
|
||||||
|
breaks if this is not the case. If this check fails, the reason is likely
|
||||||
|
to be found in the autoconf macros. */
|
||||||
|
typedef int _verify_intmax_size[sizeof (intmax_t) == sizeof (uintmax_t)
|
||||||
|
? 1 : -1];
|
||||||
|
|
||||||
|
#define GNULIB_defined_stdint_types 1
|
||||||
|
#endif /* !GNULIB_defined_stdint_types */
|
||||||
|
|
||||||
|
/* 7.18.2. Limits of specified-width integer types */
|
||||||
|
|
||||||
|
/* 7.18.2.1. Limits of exact-width integer types */
|
||||||
|
|
||||||
|
/* Here we assume a standard architecture where the hardware integer
|
||||||
|
types have 8, 16, 32, optionally 64 bits. */
|
||||||
|
|
||||||
|
#undef INT8_MIN
|
||||||
|
#undef INT8_MAX
|
||||||
|
#undef UINT8_MAX
|
||||||
|
#define INT8_MIN (~ INT8_MAX)
|
||||||
|
#define INT8_MAX 127
|
||||||
|
#define UINT8_MAX 255
|
||||||
|
|
||||||
|
#undef INT16_MIN
|
||||||
|
#undef INT16_MAX
|
||||||
|
#undef UINT16_MAX
|
||||||
|
#define INT16_MIN (~ INT16_MAX)
|
||||||
|
#define INT16_MAX 32767
|
||||||
|
#define UINT16_MAX 65535
|
||||||
|
|
||||||
|
#undef INT32_MIN
|
||||||
|
#undef INT32_MAX
|
||||||
|
#undef UINT32_MAX
|
||||||
|
#define INT32_MIN (~ INT32_MAX)
|
||||||
|
#define INT32_MAX 2147483647
|
||||||
|
#define UINT32_MAX 4294967295U
|
||||||
|
|
||||||
|
#if defined GL_INT64_T && ! defined INT64_MAX
|
||||||
|
/* Prefer (- INTMAX_C (1) << 63) over (~ INT64_MAX) because SunPRO C 5.0
|
||||||
|
evaluates the latter incorrectly in preprocessor expressions. */
|
||||||
|
# define INT64_MIN (- INTMAX_C (1) << 63)
|
||||||
|
# define INT64_MAX INTMAX_C (9223372036854775807)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined GL_UINT64_T && ! defined UINT64_MAX
|
||||||
|
# define UINT64_MAX UINTMAX_C (18446744073709551615)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 7.18.2.2. Limits of minimum-width integer types */
|
||||||
|
|
||||||
|
/* Here we assume a standard architecture where the hardware integer
|
||||||
|
types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
|
||||||
|
are the same as the corresponding N_t types. */
|
||||||
|
|
||||||
|
#undef INT_LEAST8_MIN
|
||||||
|
#undef INT_LEAST8_MAX
|
||||||
|
#undef UINT_LEAST8_MAX
|
||||||
|
#define INT_LEAST8_MIN INT8_MIN
|
||||||
|
#define INT_LEAST8_MAX INT8_MAX
|
||||||
|
#define UINT_LEAST8_MAX UINT8_MAX
|
||||||
|
|
||||||
|
#undef INT_LEAST16_MIN
|
||||||
|
#undef INT_LEAST16_MAX
|
||||||
|
#undef UINT_LEAST16_MAX
|
||||||
|
#define INT_LEAST16_MIN INT16_MIN
|
||||||
|
#define INT_LEAST16_MAX INT16_MAX
|
||||||
|
#define UINT_LEAST16_MAX UINT16_MAX
|
||||||
|
|
||||||
|
#undef INT_LEAST32_MIN
|
||||||
|
#undef INT_LEAST32_MAX
|
||||||
|
#undef UINT_LEAST32_MAX
|
||||||
|
#define INT_LEAST32_MIN INT32_MIN
|
||||||
|
#define INT_LEAST32_MAX INT32_MAX
|
||||||
|
#define UINT_LEAST32_MAX UINT32_MAX
|
||||||
|
|
||||||
|
#undef INT_LEAST64_MIN
|
||||||
|
#undef INT_LEAST64_MAX
|
||||||
|
#ifdef GL_INT64_T
|
||||||
|
# define INT_LEAST64_MIN INT64_MIN
|
||||||
|
# define INT_LEAST64_MAX INT64_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef UINT_LEAST64_MAX
|
||||||
|
#ifdef GL_UINT64_T
|
||||||
|
# define UINT_LEAST64_MAX UINT64_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 7.18.2.3. Limits of fastest minimum-width integer types */
|
||||||
|
|
||||||
|
/* Here we assume a standard architecture where the hardware integer
|
||||||
|
types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
|
||||||
|
are taken from the same list of types. */
|
||||||
|
|
||||||
|
#undef INT_FAST8_MIN
|
||||||
|
#undef INT_FAST8_MAX
|
||||||
|
#undef UINT_FAST8_MAX
|
||||||
|
#define INT_FAST8_MIN SCHAR_MIN
|
||||||
|
#define INT_FAST8_MAX SCHAR_MAX
|
||||||
|
#define UINT_FAST8_MAX UCHAR_MAX
|
||||||
|
|
||||||
|
#undef INT_FAST16_MIN
|
||||||
|
#undef INT_FAST16_MAX
|
||||||
|
#undef UINT_FAST16_MAX
|
||||||
|
#define INT_FAST16_MIN INT_FAST32_MIN
|
||||||
|
#define INT_FAST16_MAX INT_FAST32_MAX
|
||||||
|
#define UINT_FAST16_MAX UINT_FAST32_MAX
|
||||||
|
|
||||||
|
#undef INT_FAST32_MIN
|
||||||
|
#undef INT_FAST32_MAX
|
||||||
|
#undef UINT_FAST32_MAX
|
||||||
|
#ifdef __sun
|
||||||
|
# define INT_FAST32_MIN INT_MIN
|
||||||
|
# define INT_FAST32_MAX INT_MAX
|
||||||
|
# define UINT_FAST32_MAX UINT_MAX
|
||||||
|
#else
|
||||||
|
# define INT_FAST32_MIN LONG_MIN
|
||||||
|
# define INT_FAST32_MAX LONG_MAX
|
||||||
|
# define UINT_FAST32_MAX ULONG_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef INT_FAST64_MIN
|
||||||
|
#undef INT_FAST64_MAX
|
||||||
|
#ifdef GL_INT64_T
|
||||||
|
# define INT_FAST64_MIN INT64_MIN
|
||||||
|
# define INT_FAST64_MAX INT64_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef UINT_FAST64_MAX
|
||||||
|
#ifdef GL_UINT64_T
|
||||||
|
# define UINT_FAST64_MAX UINT64_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 7.18.2.4. Limits of integer types capable of holding object pointers */
|
||||||
|
|
||||||
|
#undef INTPTR_MIN
|
||||||
|
#undef INTPTR_MAX
|
||||||
|
#undef UINTPTR_MAX
|
||||||
|
#define INTPTR_MIN LONG_MIN
|
||||||
|
#define INTPTR_MAX LONG_MAX
|
||||||
|
#define UINTPTR_MAX ULONG_MAX
|
||||||
|
|
||||||
|
/* 7.18.2.5. Limits of greatest-width integer types */
|
||||||
|
|
||||||
|
#ifndef INTMAX_MAX
|
||||||
|
# undef INTMAX_MIN
|
||||||
|
# ifdef INT64_MAX
|
||||||
|
# define INTMAX_MIN INT64_MIN
|
||||||
|
# define INTMAX_MAX INT64_MAX
|
||||||
|
# else
|
||||||
|
# define INTMAX_MIN INT32_MIN
|
||||||
|
# define INTMAX_MAX INT32_MAX
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef UINTMAX_MAX
|
||||||
|
# ifdef UINT64_MAX
|
||||||
|
# define UINTMAX_MAX UINT64_MAX
|
||||||
|
# else
|
||||||
|
# define UINTMAX_MAX UINT32_MAX
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 7.18.3. Limits of other integer types */
|
||||||
|
|
||||||
|
/* ptrdiff_t limits */
|
||||||
|
#undef PTRDIFF_MIN
|
||||||
|
#undef PTRDIFF_MAX
|
||||||
|
#if @APPLE_UNIVERSAL_BUILD@
|
||||||
|
# ifdef _LP64
|
||||||
|
# define PTRDIFF_MIN _STDINT_MIN (1, 64, 0l)
|
||||||
|
# define PTRDIFF_MAX _STDINT_MAX (1, 64, 0l)
|
||||||
|
# else
|
||||||
|
# define PTRDIFF_MIN _STDINT_MIN (1, 32, 0)
|
||||||
|
# define PTRDIFF_MAX _STDINT_MAX (1, 32, 0)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define PTRDIFF_MIN \
|
||||||
|
_STDINT_MIN (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
|
||||||
|
# define PTRDIFF_MAX \
|
||||||
|
_STDINT_MAX (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* sig_atomic_t limits */
|
||||||
|
#undef SIG_ATOMIC_MIN
|
||||||
|
#undef SIG_ATOMIC_MAX
|
||||||
|
#define SIG_ATOMIC_MIN \
|
||||||
|
_STDINT_MIN (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \
|
||||||
|
0@SIG_ATOMIC_T_SUFFIX@)
|
||||||
|
#define SIG_ATOMIC_MAX \
|
||||||
|
_STDINT_MAX (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \
|
||||||
|
0@SIG_ATOMIC_T_SUFFIX@)
|
||||||
|
|
||||||
|
|
||||||
|
/* size_t limit */
|
||||||
|
#undef SIZE_MAX
|
||||||
|
#if @APPLE_UNIVERSAL_BUILD@
|
||||||
|
# ifdef _LP64
|
||||||
|
# define SIZE_MAX _STDINT_MAX (0, 64, 0ul)
|
||||||
|
# else
|
||||||
|
# define SIZE_MAX _STDINT_MAX (0, 32, 0ul)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define SIZE_MAX _STDINT_MAX (0, @BITSIZEOF_SIZE_T@, 0@SIZE_T_SUFFIX@)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* wchar_t limits */
|
||||||
|
/* Get WCHAR_MIN, WCHAR_MAX.
|
||||||
|
This include is not on the top, above, because on OSF/1 4.0 we have a
|
||||||
|
sequence of nested includes
|
||||||
|
<wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
|
||||||
|
<stdint.h> and assumes its types are already defined. */
|
||||||
|
#if @HAVE_WCHAR_H@ && ! (defined WCHAR_MIN && defined WCHAR_MAX)
|
||||||
|
/* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
|
||||||
|
included before <wchar.h>. */
|
||||||
|
# include <stddef.h>
|
||||||
|
# include <stdio.h>
|
||||||
|
# include <time.h>
|
||||||
|
# define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
|
||||||
|
# include <wchar.h>
|
||||||
|
# undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
|
||||||
|
#endif
|
||||||
|
#undef WCHAR_MIN
|
||||||
|
#undef WCHAR_MAX
|
||||||
|
#define WCHAR_MIN \
|
||||||
|
_STDINT_MIN (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
|
||||||
|
#define WCHAR_MAX \
|
||||||
|
_STDINT_MAX (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
|
||||||
|
|
||||||
|
/* wint_t limits */
|
||||||
|
#undef WINT_MIN
|
||||||
|
#undef WINT_MAX
|
||||||
|
#define WINT_MIN \
|
||||||
|
_STDINT_MIN (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
|
||||||
|
#define WINT_MAX \
|
||||||
|
_STDINT_MAX (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
|
||||||
|
|
||||||
|
/* 7.18.4. Macros for integer constants */
|
||||||
|
|
||||||
|
/* 7.18.4.1. Macros for minimum-width integer constants */
|
||||||
|
/* According to ISO C 99 Technical Corrigendum 1 */
|
||||||
|
|
||||||
|
/* Here we assume a standard architecture where the hardware integer
|
||||||
|
types have 8, 16, 32, optionally 64 bits, and int is 32 bits. */
|
||||||
|
|
||||||
|
#undef INT8_C
|
||||||
|
#undef UINT8_C
|
||||||
|
#define INT8_C(x) x
|
||||||
|
#define UINT8_C(x) x
|
||||||
|
|
||||||
|
#undef INT16_C
|
||||||
|
#undef UINT16_C
|
||||||
|
#define INT16_C(x) x
|
||||||
|
#define UINT16_C(x) x
|
||||||
|
|
||||||
|
#undef INT32_C
|
||||||
|
#undef UINT32_C
|
||||||
|
#define INT32_C(x) x
|
||||||
|
#define UINT32_C(x) x ## U
|
||||||
|
|
||||||
|
#undef INT64_C
|
||||||
|
#undef UINT64_C
|
||||||
|
#if LONG_MAX >> 31 >> 31 == 1
|
||||||
|
# define INT64_C(x) x##L
|
||||||
|
#elif defined _MSC_VER
|
||||||
|
# define INT64_C(x) x##i64
|
||||||
|
#elif @HAVE_LONG_LONG_INT@
|
||||||
|
# define INT64_C(x) x##LL
|
||||||
|
#endif
|
||||||
|
#if ULONG_MAX >> 31 >> 31 >> 1 == 1
|
||||||
|
# define UINT64_C(x) x##UL
|
||||||
|
#elif defined _MSC_VER
|
||||||
|
# define UINT64_C(x) x##ui64
|
||||||
|
#elif @HAVE_UNSIGNED_LONG_LONG_INT@
|
||||||
|
# define UINT64_C(x) x##ULL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 7.18.4.2. Macros for greatest-width integer constants */
|
||||||
|
|
||||||
|
#ifndef INTMAX_C
|
||||||
|
# if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
|
||||||
|
# define INTMAX_C(x) x##LL
|
||||||
|
# elif defined GL_INT64_T
|
||||||
|
# define INTMAX_C(x) INT64_C(x)
|
||||||
|
# else
|
||||||
|
# define INTMAX_C(x) x##L
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef UINTMAX_C
|
||||||
|
# if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
|
||||||
|
# define UINTMAX_C(x) x##ULL
|
||||||
|
# elif defined GL_UINT64_T
|
||||||
|
# define UINTMAX_C(x) UINT64_C(x)
|
||||||
|
# else
|
||||||
|
# define UINTMAX_C(x) x##UL
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_STDINT_H */
|
||||||
|
#endif /* !(defined __ANDROID__ && ...) */
|
||||||
|
#endif /* !defined _@GUARD_PREFIX@_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */
|
||||||
1339
lib/stdio.in.h
Normal file
1339
lib/stdio.in.h
Normal file
File diff suppressed because it is too large
Load diff
928
lib/stdlib.in.h
Normal file
928
lib/stdlib.in.h
Normal file
|
|
@ -0,0 +1,928 @@
|
||||||
|
/* A GNU-like <stdlib.h>.
|
||||||
|
|
||||||
|
Copyright (C) 1995, 2001-2004, 2006-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
#if defined __need_malloc_and_calloc
|
||||||
|
/* Special invocation convention inside glibc header files. */
|
||||||
|
|
||||||
|
#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* Normal invocation convention. */
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_STDLIB_H
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_STDLIB_H
|
||||||
|
#define _@GUARD_PREFIX@_STDLIB_H
|
||||||
|
|
||||||
|
/* NetBSD 5.0 mis-defines NULL. */
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* MirBSD 10 defines WEXITSTATUS in <sys/wait.h>, not in <stdlib.h>. */
|
||||||
|
#if @GNULIB_SYSTEM_POSIX@ && !defined WEXITSTATUS
|
||||||
|
# include <sys/wait.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Solaris declares getloadavg() in <sys/loadavg.h>. */
|
||||||
|
#if (@GNULIB_GETLOADAVG@ || defined GNULIB_POSIXCHECK) && @HAVE_SYS_LOADAVG_H@
|
||||||
|
# include <sys/loadavg.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Native Windows platforms declare mktemp() in <io.h>. */
|
||||||
|
#if 0 && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
|
||||||
|
# include <io.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM_R@
|
||||||
|
|
||||||
|
/* OSF/1 5.1 declares 'struct random_data' in <random.h>, which is included
|
||||||
|
from <stdlib.h> if _REENTRANT is defined. Include it whenever we need
|
||||||
|
'struct random_data'. */
|
||||||
|
# if @HAVE_RANDOM_H@
|
||||||
|
# include <random.h>
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if !@HAVE_STRUCT_RANDOM_DATA@ || @REPLACE_RANDOM_R@ || !@HAVE_RANDOM_R@
|
||||||
|
# include <stdint.h>
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if !@HAVE_STRUCT_RANDOM_DATA@
|
||||||
|
/* Define 'struct random_data'.
|
||||||
|
But allow multiple gnulib generated <stdlib.h> replacements to coexist. */
|
||||||
|
# if !GNULIB_defined_struct_random_data
|
||||||
|
struct random_data
|
||||||
|
{
|
||||||
|
int32_t *fptr; /* Front pointer. */
|
||||||
|
int32_t *rptr; /* Rear pointer. */
|
||||||
|
int32_t *state; /* Array of state values. */
|
||||||
|
int rand_type; /* Type of random number generator. */
|
||||||
|
int rand_deg; /* Degree of random number generator. */
|
||||||
|
int rand_sep; /* Distance between front and rear. */
|
||||||
|
int32_t *end_ptr; /* Pointer behind state table. */
|
||||||
|
};
|
||||||
|
# define GNULIB_defined_struct_random_data 1
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
|
||||||
|
/* On Mac OS X 10.3, only <unistd.h> declares mkstemp. */
|
||||||
|
/* On Mac OS X 10.5, only <unistd.h> declares mkstemps. */
|
||||||
|
/* On Cygwin 1.7.1, only <unistd.h> declares getsubopt. */
|
||||||
|
/* But avoid namespace pollution on glibc systems and native Windows. */
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||||
|
The attribute __pure__ was added in gcc 2.96. */
|
||||||
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
|
||||||
|
# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_PURE /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The definition of _Noreturn is copied here. */
|
||||||
|
|
||||||
|
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
|
||||||
|
|
||||||
|
/* The definition of _GL_ARG_NONNULL is copied here. */
|
||||||
|
|
||||||
|
/* The definition of _GL_WARN_ON_USE is copied here. */
|
||||||
|
|
||||||
|
|
||||||
|
/* Some systems do not define EXIT_*, despite otherwise supporting C89. */
|
||||||
|
#ifndef EXIT_SUCCESS
|
||||||
|
# define EXIT_SUCCESS 0
|
||||||
|
#endif
|
||||||
|
/* Tandem/NSK and other platforms that define EXIT_FAILURE as -1 interfere
|
||||||
|
with proper operation of xargs. */
|
||||||
|
#ifndef EXIT_FAILURE
|
||||||
|
# define EXIT_FAILURE 1
|
||||||
|
#elif EXIT_FAILURE != 1
|
||||||
|
# undef EXIT_FAILURE
|
||||||
|
# define EXIT_FAILURE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB__EXIT@
|
||||||
|
/* Terminate the current process with the given return code, without running
|
||||||
|
the 'atexit' handlers. */
|
||||||
|
# if !@HAVE__EXIT@
|
||||||
|
_GL_FUNCDECL_SYS (_Exit, _Noreturn void, (int status));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (_Exit, void, (int status));
|
||||||
|
_GL_CXXALIASWARN (_Exit);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef _Exit
|
||||||
|
# if HAVE_RAW_DECL__EXIT
|
||||||
|
_GL_WARN_ON_USE (_Exit, "_Exit is unportable - "
|
||||||
|
"use gnulib module _Exit for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_ATOLL@
|
||||||
|
/* Parse a signed decimal integer.
|
||||||
|
Returns the value of the integer. Errors are not detected. */
|
||||||
|
# if !@HAVE_ATOLL@
|
||||||
|
_GL_FUNCDECL_SYS (atoll, long long, (const char *string)
|
||||||
|
_GL_ATTRIBUTE_PURE
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (atoll, long long, (const char *string));
|
||||||
|
_GL_CXXALIASWARN (atoll);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef atoll
|
||||||
|
# if HAVE_RAW_DECL_ATOLL
|
||||||
|
_GL_WARN_ON_USE (atoll, "atoll is unportable - "
|
||||||
|
"use gnulib module atoll for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_CALLOC_POSIX@
|
||||||
|
# if @REPLACE_CALLOC@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef calloc
|
||||||
|
# define calloc rpl_calloc
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (calloc, void *, (size_t nmemb, size_t size));
|
||||||
|
_GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (calloc);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef calloc
|
||||||
|
/* Assume calloc is always declared. */
|
||||||
|
_GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - "
|
||||||
|
"use gnulib module calloc-posix for portability");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_CANONICALIZE_FILE_NAME@
|
||||||
|
# if @REPLACE_CANONICALIZE_FILE_NAME@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# define canonicalize_file_name rpl_canonicalize_file_name
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (canonicalize_file_name, char *, (const char *name)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
_GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_CANONICALIZE_FILE_NAME@
|
||||||
|
_GL_FUNCDECL_SYS (canonicalize_file_name, char *, (const char *name)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (canonicalize_file_name);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef canonicalize_file_name
|
||||||
|
# if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
|
||||||
|
_GL_WARN_ON_USE (canonicalize_file_name,
|
||||||
|
"canonicalize_file_name is unportable - "
|
||||||
|
"use gnulib module canonicalize-lgpl for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_GETLOADAVG@
|
||||||
|
/* Store max(NELEM,3) load average numbers in LOADAVG[].
|
||||||
|
The three numbers are the load average of the last 1 minute, the last 5
|
||||||
|
minutes, and the last 15 minutes, respectively.
|
||||||
|
LOADAVG is an array of NELEM numbers. */
|
||||||
|
# if !@HAVE_DECL_GETLOADAVG@
|
||||||
|
_GL_FUNCDECL_SYS (getloadavg, int, (double loadavg[], int nelem)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (getloadavg, int, (double loadavg[], int nelem));
|
||||||
|
_GL_CXXALIASWARN (getloadavg);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef getloadavg
|
||||||
|
# if HAVE_RAW_DECL_GETLOADAVG
|
||||||
|
_GL_WARN_ON_USE (getloadavg, "getloadavg is not portable - "
|
||||||
|
"use gnulib module getloadavg for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_GETSUBOPT@
|
||||||
|
/* Assuming *OPTIONP is a comma separated list of elements of the form
|
||||||
|
"token" or "token=value", getsubopt parses the first of these elements.
|
||||||
|
If the first element refers to a "token" that is member of the given
|
||||||
|
NULL-terminated array of tokens:
|
||||||
|
- It replaces the comma with a NUL byte, updates *OPTIONP to point past
|
||||||
|
the first option and the comma, sets *VALUEP to the value of the
|
||||||
|
element (or NULL if it doesn't contain an "=" sign),
|
||||||
|
- It returns the index of the "token" in the given array of tokens.
|
||||||
|
Otherwise it returns -1, and *OPTIONP and *VALUEP are undefined.
|
||||||
|
For more details see the POSIX:2001 specification.
|
||||||
|
http://www.opengroup.org/susv3xsh/getsubopt.html */
|
||||||
|
# if !@HAVE_GETSUBOPT@
|
||||||
|
_GL_FUNCDECL_SYS (getsubopt, int,
|
||||||
|
(char **optionp, char *const *tokens, char **valuep)
|
||||||
|
_GL_ARG_NONNULL ((1, 2, 3)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (getsubopt, int,
|
||||||
|
(char **optionp, char *const *tokens, char **valuep));
|
||||||
|
_GL_CXXALIASWARN (getsubopt);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef getsubopt
|
||||||
|
# if HAVE_RAW_DECL_GETSUBOPT
|
||||||
|
_GL_WARN_ON_USE (getsubopt, "getsubopt is unportable - "
|
||||||
|
"use gnulib module getsubopt for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_GRANTPT@
|
||||||
|
/* Change the ownership and access permission of the slave side of the
|
||||||
|
pseudo-terminal whose master side is specified by FD. */
|
||||||
|
# if !@HAVE_GRANTPT@
|
||||||
|
_GL_FUNCDECL_SYS (grantpt, int, (int fd));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (grantpt, int, (int fd));
|
||||||
|
_GL_CXXALIASWARN (grantpt);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef grantpt
|
||||||
|
# if HAVE_RAW_DECL_GRANTPT
|
||||||
|
_GL_WARN_ON_USE (grantpt, "grantpt is not portable - "
|
||||||
|
"use gnulib module grantpt for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If _GL_USE_STDLIB_ALLOC is nonzero, the including module does not
|
||||||
|
rely on GNU or POSIX semantics for malloc and realloc (for example,
|
||||||
|
by never specifying a zero size), so it does not need malloc or
|
||||||
|
realloc to be redefined. */
|
||||||
|
#if @GNULIB_MALLOC_POSIX@
|
||||||
|
# if @REPLACE_MALLOC@
|
||||||
|
# if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
|
||||||
|
|| _GL_USE_STDLIB_ALLOC)
|
||||||
|
# undef malloc
|
||||||
|
# define malloc rpl_malloc
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (malloc, void *, (size_t size));
|
||||||
|
_GL_CXXALIAS_RPL (malloc, void *, (size_t size));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (malloc, void *, (size_t size));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (malloc);
|
||||||
|
#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
|
||||||
|
# undef malloc
|
||||||
|
/* Assume malloc is always declared. */
|
||||||
|
_GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - "
|
||||||
|
"use gnulib module malloc-posix for portability");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Convert a multibyte character to a wide character. */
|
||||||
|
#if @GNULIB_MBTOWC@
|
||||||
|
# if @REPLACE_MBTOWC@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef mbtowc
|
||||||
|
# define mbtowc rpl_mbtowc
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
|
||||||
|
_GL_CXXALIAS_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (mbtowc);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_MKDTEMP@
|
||||||
|
/* Create a unique temporary directory from TEMPLATE.
|
||||||
|
The last six characters of TEMPLATE must be "XXXXXX";
|
||||||
|
they are replaced with a string that makes the directory name unique.
|
||||||
|
Returns TEMPLATE, or a null pointer if it cannot get a unique name.
|
||||||
|
The directory is created mode 700. */
|
||||||
|
# if !@HAVE_MKDTEMP@
|
||||||
|
_GL_FUNCDECL_SYS (mkdtemp, char *, (char * /*template*/) _GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (mkdtemp, char *, (char * /*template*/));
|
||||||
|
_GL_CXXALIASWARN (mkdtemp);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef mkdtemp
|
||||||
|
# if HAVE_RAW_DECL_MKDTEMP
|
||||||
|
_GL_WARN_ON_USE (mkdtemp, "mkdtemp is unportable - "
|
||||||
|
"use gnulib module mkdtemp for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_MKOSTEMP@
|
||||||
|
/* Create a unique temporary file from TEMPLATE.
|
||||||
|
The last six characters of TEMPLATE must be "XXXXXX";
|
||||||
|
they are replaced with a string that makes the file name unique.
|
||||||
|
The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
|
||||||
|
and O_TEXT, O_BINARY (defined in "binary-io.h").
|
||||||
|
The file is then created, with the specified flags, ensuring it didn't exist
|
||||||
|
before.
|
||||||
|
The file is created read-write (mask at least 0600 & ~umask), but it may be
|
||||||
|
world-readable and world-writable (mask 0666 & ~umask), depending on the
|
||||||
|
implementation.
|
||||||
|
Returns the open file descriptor if successful, otherwise -1 and errno
|
||||||
|
set. */
|
||||||
|
# if !@HAVE_MKOSTEMP@
|
||||||
|
_GL_FUNCDECL_SYS (mkostemp, int, (char * /*template*/, int /*flags*/)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (mkostemp, int, (char * /*template*/, int /*flags*/));
|
||||||
|
_GL_CXXALIASWARN (mkostemp);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef mkostemp
|
||||||
|
# if HAVE_RAW_DECL_MKOSTEMP
|
||||||
|
_GL_WARN_ON_USE (mkostemp, "mkostemp is unportable - "
|
||||||
|
"use gnulib module mkostemp for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_MKOSTEMPS@
|
||||||
|
/* Create a unique temporary file from TEMPLATE.
|
||||||
|
The last six characters of TEMPLATE before a suffix of length
|
||||||
|
SUFFIXLEN must be "XXXXXX";
|
||||||
|
they are replaced with a string that makes the file name unique.
|
||||||
|
The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
|
||||||
|
and O_TEXT, O_BINARY (defined in "binary-io.h").
|
||||||
|
The file is then created, with the specified flags, ensuring it didn't exist
|
||||||
|
before.
|
||||||
|
The file is created read-write (mask at least 0600 & ~umask), but it may be
|
||||||
|
world-readable and world-writable (mask 0666 & ~umask), depending on the
|
||||||
|
implementation.
|
||||||
|
Returns the open file descriptor if successful, otherwise -1 and errno
|
||||||
|
set. */
|
||||||
|
# if !@HAVE_MKOSTEMPS@
|
||||||
|
_GL_FUNCDECL_SYS (mkostemps, int,
|
||||||
|
(char * /*template*/, int /*suffixlen*/, int /*flags*/)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (mkostemps, int,
|
||||||
|
(char * /*template*/, int /*suffixlen*/, int /*flags*/));
|
||||||
|
_GL_CXXALIASWARN (mkostemps);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef mkostemps
|
||||||
|
# if HAVE_RAW_DECL_MKOSTEMPS
|
||||||
|
_GL_WARN_ON_USE (mkostemps, "mkostemps is unportable - "
|
||||||
|
"use gnulib module mkostemps for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_MKSTEMP@
|
||||||
|
/* Create a unique temporary file from TEMPLATE.
|
||||||
|
The last six characters of TEMPLATE must be "XXXXXX";
|
||||||
|
they are replaced with a string that makes the file name unique.
|
||||||
|
The file is then created, ensuring it didn't exist before.
|
||||||
|
The file is created read-write (mask at least 0600 & ~umask), but it may be
|
||||||
|
world-readable and world-writable (mask 0666 & ~umask), depending on the
|
||||||
|
implementation.
|
||||||
|
Returns the open file descriptor if successful, otherwise -1 and errno
|
||||||
|
set. */
|
||||||
|
# if @REPLACE_MKSTEMP@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# define mkstemp rpl_mkstemp
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1)));
|
||||||
|
_GL_CXXALIAS_RPL (mkstemp, int, (char * /*template*/));
|
||||||
|
# else
|
||||||
|
# if ! @HAVE_MKSTEMP@
|
||||||
|
_GL_FUNCDECL_SYS (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (mkstemp, int, (char * /*template*/));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (mkstemp);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef mkstemp
|
||||||
|
# if HAVE_RAW_DECL_MKSTEMP
|
||||||
|
_GL_WARN_ON_USE (mkstemp, "mkstemp is unportable - "
|
||||||
|
"use gnulib module mkstemp for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_MKSTEMPS@
|
||||||
|
/* Create a unique temporary file from TEMPLATE.
|
||||||
|
The last six characters of TEMPLATE prior to a suffix of length
|
||||||
|
SUFFIXLEN must be "XXXXXX";
|
||||||
|
they are replaced with a string that makes the file name unique.
|
||||||
|
The file is then created, ensuring it didn't exist before.
|
||||||
|
The file is created read-write (mask at least 0600 & ~umask), but it may be
|
||||||
|
world-readable and world-writable (mask 0666 & ~umask), depending on the
|
||||||
|
implementation.
|
||||||
|
Returns the open file descriptor if successful, otherwise -1 and errno
|
||||||
|
set. */
|
||||||
|
# if !@HAVE_MKSTEMPS@
|
||||||
|
_GL_FUNCDECL_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/));
|
||||||
|
_GL_CXXALIASWARN (mkstemps);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef mkstemps
|
||||||
|
# if HAVE_RAW_DECL_MKSTEMPS
|
||||||
|
_GL_WARN_ON_USE (mkstemps, "mkstemps is unportable - "
|
||||||
|
"use gnulib module mkstemps for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_POSIX_OPENPT@
|
||||||
|
/* Return an FD open to the master side of a pseudo-terminal. Flags should
|
||||||
|
include O_RDWR, and may also include O_NOCTTY. */
|
||||||
|
# if !@HAVE_POSIX_OPENPT@
|
||||||
|
_GL_FUNCDECL_SYS (posix_openpt, int, (int flags));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (posix_openpt, int, (int flags));
|
||||||
|
_GL_CXXALIASWARN (posix_openpt);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef posix_openpt
|
||||||
|
# if HAVE_RAW_DECL_POSIX_OPENPT
|
||||||
|
_GL_WARN_ON_USE (posix_openpt, "posix_openpt is not portable - "
|
||||||
|
"use gnulib module posix_openpt for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_PTSNAME@
|
||||||
|
/* Return the pathname of the pseudo-terminal slave associated with
|
||||||
|
the master FD is open on, or NULL on errors. */
|
||||||
|
# if !@HAVE_PTSNAME@
|
||||||
|
_GL_FUNCDECL_SYS (ptsname, char *, (int fd));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (ptsname, char *, (int fd));
|
||||||
|
_GL_CXXALIASWARN (ptsname);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef ptsname
|
||||||
|
# if HAVE_RAW_DECL_PTSNAME
|
||||||
|
_GL_WARN_ON_USE (ptsname, "ptsname is not portable - "
|
||||||
|
"use gnulib module ptsname for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_PTSNAME_R@
|
||||||
|
/* Set the pathname of the pseudo-terminal slave associated with
|
||||||
|
the master FD is open on and return 0, or set errno and return
|
||||||
|
non-zero on errors. */
|
||||||
|
# if @REPLACE_PTSNAME_R@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef ptsname_r
|
||||||
|
# define ptsname_r rpl_ptsname_r
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
|
||||||
|
_GL_CXXALIAS_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_PTSNAME_R@
|
||||||
|
_GL_FUNCDECL_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (ptsname_r);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef ptsname_r
|
||||||
|
# if HAVE_RAW_DECL_PTSNAME_R
|
||||||
|
_GL_WARN_ON_USE (ptsname_r, "ptsname_r is not portable - "
|
||||||
|
"use gnulib module ptsname_r for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_PUTENV@
|
||||||
|
# if @REPLACE_PUTENV@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef putenv
|
||||||
|
# define putenv rpl_putenv
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1)));
|
||||||
|
_GL_CXXALIAS_RPL (putenv, int, (char *string));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (putenv, int, (char *string));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (putenv);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM_R@
|
||||||
|
# if !@HAVE_RANDOM_R@
|
||||||
|
# ifndef RAND_MAX
|
||||||
|
# define RAND_MAX 2147483647
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM@
|
||||||
|
# if !@HAVE_RANDOM@
|
||||||
|
_GL_FUNCDECL_SYS (random, long, (void));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (random, long, (void));
|
||||||
|
_GL_CXXALIASWARN (random);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef random
|
||||||
|
# if HAVE_RAW_DECL_RANDOM
|
||||||
|
_GL_WARN_ON_USE (random, "random is unportable - "
|
||||||
|
"use gnulib module random for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM@
|
||||||
|
# if !@HAVE_RANDOM@
|
||||||
|
_GL_FUNCDECL_SYS (srandom, void, (unsigned int seed));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (srandom, void, (unsigned int seed));
|
||||||
|
_GL_CXXALIASWARN (srandom);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef srandom
|
||||||
|
# if HAVE_RAW_DECL_SRANDOM
|
||||||
|
_GL_WARN_ON_USE (srandom, "srandom is unportable - "
|
||||||
|
"use gnulib module random for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM@
|
||||||
|
# if !@HAVE_RANDOM@
|
||||||
|
_GL_FUNCDECL_SYS (initstate, char *,
|
||||||
|
(unsigned int seed, char *buf, size_t buf_size)
|
||||||
|
_GL_ARG_NONNULL ((2)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (initstate, char *,
|
||||||
|
(unsigned int seed, char *buf, size_t buf_size));
|
||||||
|
_GL_CXXALIASWARN (initstate);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef initstate
|
||||||
|
# if HAVE_RAW_DECL_INITSTATE_R
|
||||||
|
_GL_WARN_ON_USE (initstate, "initstate is unportable - "
|
||||||
|
"use gnulib module random for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM@
|
||||||
|
# if !@HAVE_RANDOM@
|
||||||
|
_GL_FUNCDECL_SYS (setstate, char *, (char *arg_state) _GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (setstate, char *, (char *arg_state));
|
||||||
|
_GL_CXXALIASWARN (setstate);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef setstate
|
||||||
|
# if HAVE_RAW_DECL_SETSTATE_R
|
||||||
|
_GL_WARN_ON_USE (setstate, "setstate is unportable - "
|
||||||
|
"use gnulib module random for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM_R@
|
||||||
|
# if @REPLACE_RANDOM_R@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef random_r
|
||||||
|
# define random_r rpl_random_r
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (random_r, int, (struct random_data *buf, int32_t *result)
|
||||||
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
|
_GL_CXXALIAS_RPL (random_r, int, (struct random_data *buf, int32_t *result));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_RANDOM_R@
|
||||||
|
_GL_FUNCDECL_SYS (random_r, int, (struct random_data *buf, int32_t *result)
|
||||||
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (random_r, int, (struct random_data *buf, int32_t *result));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (random_r);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef random_r
|
||||||
|
# if HAVE_RAW_DECL_RANDOM_R
|
||||||
|
_GL_WARN_ON_USE (random_r, "random_r is unportable - "
|
||||||
|
"use gnulib module random_r for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM_R@
|
||||||
|
# if @REPLACE_RANDOM_R@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef srandom_r
|
||||||
|
# define srandom_r rpl_srandom_r
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (srandom_r, int,
|
||||||
|
(unsigned int seed, struct random_data *rand_state)
|
||||||
|
_GL_ARG_NONNULL ((2)));
|
||||||
|
_GL_CXXALIAS_RPL (srandom_r, int,
|
||||||
|
(unsigned int seed, struct random_data *rand_state));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_RANDOM_R@
|
||||||
|
_GL_FUNCDECL_SYS (srandom_r, int,
|
||||||
|
(unsigned int seed, struct random_data *rand_state)
|
||||||
|
_GL_ARG_NONNULL ((2)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (srandom_r, int,
|
||||||
|
(unsigned int seed, struct random_data *rand_state));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (srandom_r);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef srandom_r
|
||||||
|
# if HAVE_RAW_DECL_SRANDOM_R
|
||||||
|
_GL_WARN_ON_USE (srandom_r, "srandom_r is unportable - "
|
||||||
|
"use gnulib module random_r for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM_R@
|
||||||
|
# if @REPLACE_RANDOM_R@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef initstate_r
|
||||||
|
# define initstate_r rpl_initstate_r
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (initstate_r, int,
|
||||||
|
(unsigned int seed, char *buf, size_t buf_size,
|
||||||
|
struct random_data *rand_state)
|
||||||
|
_GL_ARG_NONNULL ((2, 4)));
|
||||||
|
_GL_CXXALIAS_RPL (initstate_r, int,
|
||||||
|
(unsigned int seed, char *buf, size_t buf_size,
|
||||||
|
struct random_data *rand_state));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_RANDOM_R@
|
||||||
|
_GL_FUNCDECL_SYS (initstate_r, int,
|
||||||
|
(unsigned int seed, char *buf, size_t buf_size,
|
||||||
|
struct random_data *rand_state)
|
||||||
|
_GL_ARG_NONNULL ((2, 4)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (initstate_r, int,
|
||||||
|
(unsigned int seed, char *buf, size_t buf_size,
|
||||||
|
struct random_data *rand_state));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (initstate_r);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef initstate_r
|
||||||
|
# if HAVE_RAW_DECL_INITSTATE_R
|
||||||
|
_GL_WARN_ON_USE (initstate_r, "initstate_r is unportable - "
|
||||||
|
"use gnulib module random_r for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM_R@
|
||||||
|
# if @REPLACE_RANDOM_R@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef setstate_r
|
||||||
|
# define setstate_r rpl_setstate_r
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (setstate_r, int,
|
||||||
|
(char *arg_state, struct random_data *rand_state)
|
||||||
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
|
_GL_CXXALIAS_RPL (setstate_r, int,
|
||||||
|
(char *arg_state, struct random_data *rand_state));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_RANDOM_R@
|
||||||
|
_GL_FUNCDECL_SYS (setstate_r, int,
|
||||||
|
(char *arg_state, struct random_data *rand_state)
|
||||||
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (setstate_r, int,
|
||||||
|
(char *arg_state, struct random_data *rand_state));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (setstate_r);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef setstate_r
|
||||||
|
# if HAVE_RAW_DECL_SETSTATE_R
|
||||||
|
_GL_WARN_ON_USE (setstate_r, "setstate_r is unportable - "
|
||||||
|
"use gnulib module random_r for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_REALLOC_POSIX@
|
||||||
|
# if @REPLACE_REALLOC@
|
||||||
|
# if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
|
||||||
|
|| _GL_USE_STDLIB_ALLOC)
|
||||||
|
# undef realloc
|
||||||
|
# define realloc rpl_realloc
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size));
|
||||||
|
_GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (realloc);
|
||||||
|
#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
|
||||||
|
# undef realloc
|
||||||
|
/* Assume realloc is always declared. */
|
||||||
|
_GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - "
|
||||||
|
"use gnulib module realloc-posix for portability");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_REALPATH@
|
||||||
|
# if @REPLACE_REALPATH@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# define realpath rpl_realpath
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (realpath, char *, (const char *name, char *resolved)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
_GL_CXXALIAS_RPL (realpath, char *, (const char *name, char *resolved));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_REALPATH@
|
||||||
|
_GL_FUNCDECL_SYS (realpath, char *, (const char *name, char *resolved)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (realpath, char *, (const char *name, char *resolved));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (realpath);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef realpath
|
||||||
|
# if HAVE_RAW_DECL_REALPATH
|
||||||
|
_GL_WARN_ON_USE (realpath, "realpath is unportable - use gnulib module "
|
||||||
|
"canonicalize or canonicalize-lgpl for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_RPMATCH@
|
||||||
|
/* Test a user response to a question.
|
||||||
|
Return 1 if it is affirmative, 0 if it is negative, or -1 if not clear. */
|
||||||
|
# if !@HAVE_RPMATCH@
|
||||||
|
_GL_FUNCDECL_SYS (rpmatch, int, (const char *response) _GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (rpmatch, int, (const char *response));
|
||||||
|
_GL_CXXALIASWARN (rpmatch);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef rpmatch
|
||||||
|
# if HAVE_RAW_DECL_RPMATCH
|
||||||
|
_GL_WARN_ON_USE (rpmatch, "rpmatch is unportable - "
|
||||||
|
"use gnulib module rpmatch for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_SETENV@
|
||||||
|
/* Set NAME to VALUE in the environment.
|
||||||
|
If REPLACE is nonzero, overwrite an existing value. */
|
||||||
|
# if @REPLACE_SETENV@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef setenv
|
||||||
|
# define setenv rpl_setenv
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (setenv, int,
|
||||||
|
(const char *name, const char *value, int replace)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
_GL_CXXALIAS_RPL (setenv, int,
|
||||||
|
(const char *name, const char *value, int replace));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_DECL_SETENV@
|
||||||
|
_GL_FUNCDECL_SYS (setenv, int,
|
||||||
|
(const char *name, const char *value, int replace)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (setenv, int,
|
||||||
|
(const char *name, const char *value, int replace));
|
||||||
|
# endif
|
||||||
|
# if !(@REPLACE_SETENV@ && !@HAVE_DECL_SETENV@)
|
||||||
|
_GL_CXXALIASWARN (setenv);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef setenv
|
||||||
|
# if HAVE_RAW_DECL_SETENV
|
||||||
|
_GL_WARN_ON_USE (setenv, "setenv is unportable - "
|
||||||
|
"use gnulib module setenv for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_STRTOD@
|
||||||
|
/* Parse a double from STRING, updating ENDP if appropriate. */
|
||||||
|
# if @REPLACE_STRTOD@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# define strtod rpl_strtod
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (strtod, double, (const char *str, char **endp)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
_GL_CXXALIAS_RPL (strtod, double, (const char *str, char **endp));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_STRTOD@
|
||||||
|
_GL_FUNCDECL_SYS (strtod, double, (const char *str, char **endp)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (strtod, double, (const char *str, char **endp));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (strtod);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef strtod
|
||||||
|
# if HAVE_RAW_DECL_STRTOD
|
||||||
|
_GL_WARN_ON_USE (strtod, "strtod is unportable - "
|
||||||
|
"use gnulib module strtod for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_STRTOLL@
|
||||||
|
/* Parse a signed integer whose textual representation starts at STRING.
|
||||||
|
The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
|
||||||
|
it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
|
||||||
|
"0x").
|
||||||
|
If ENDPTR is not NULL, the address of the first byte after the integer is
|
||||||
|
stored in *ENDPTR.
|
||||||
|
Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set
|
||||||
|
to ERANGE. */
|
||||||
|
# if !@HAVE_STRTOLL@
|
||||||
|
_GL_FUNCDECL_SYS (strtoll, long long,
|
||||||
|
(const char *string, char **endptr, int base)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (strtoll, long long,
|
||||||
|
(const char *string, char **endptr, int base));
|
||||||
|
_GL_CXXALIASWARN (strtoll);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef strtoll
|
||||||
|
# if HAVE_RAW_DECL_STRTOLL
|
||||||
|
_GL_WARN_ON_USE (strtoll, "strtoll is unportable - "
|
||||||
|
"use gnulib module strtoll for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_STRTOULL@
|
||||||
|
/* Parse an unsigned integer whose textual representation starts at STRING.
|
||||||
|
The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
|
||||||
|
it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
|
||||||
|
"0x").
|
||||||
|
If ENDPTR is not NULL, the address of the first byte after the integer is
|
||||||
|
stored in *ENDPTR.
|
||||||
|
Upon overflow, the return value is ULLONG_MAX, and errno is set to
|
||||||
|
ERANGE. */
|
||||||
|
# if !@HAVE_STRTOULL@
|
||||||
|
_GL_FUNCDECL_SYS (strtoull, unsigned long long,
|
||||||
|
(const char *string, char **endptr, int base)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (strtoull, unsigned long long,
|
||||||
|
(const char *string, char **endptr, int base));
|
||||||
|
_GL_CXXALIASWARN (strtoull);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef strtoull
|
||||||
|
# if HAVE_RAW_DECL_STRTOULL
|
||||||
|
_GL_WARN_ON_USE (strtoull, "strtoull is unportable - "
|
||||||
|
"use gnulib module strtoull for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_UNLOCKPT@
|
||||||
|
/* Unlock the slave side of the pseudo-terminal whose master side is specified
|
||||||
|
by FD, so that it can be opened. */
|
||||||
|
# if !@HAVE_UNLOCKPT@
|
||||||
|
_GL_FUNCDECL_SYS (unlockpt, int, (int fd));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (unlockpt, int, (int fd));
|
||||||
|
_GL_CXXALIASWARN (unlockpt);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef unlockpt
|
||||||
|
# if HAVE_RAW_DECL_UNLOCKPT
|
||||||
|
_GL_WARN_ON_USE (unlockpt, "unlockpt is not portable - "
|
||||||
|
"use gnulib module unlockpt for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_UNSETENV@
|
||||||
|
/* Remove the variable NAME from the environment. */
|
||||||
|
# if @REPLACE_UNSETENV@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef unsetenv
|
||||||
|
# define unsetenv rpl_unsetenv
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
|
||||||
|
_GL_CXXALIAS_RPL (unsetenv, int, (const char *name));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_DECL_UNSETENV@
|
||||||
|
_GL_FUNCDECL_SYS (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (unsetenv, int, (const char *name));
|
||||||
|
# endif
|
||||||
|
# if !(@REPLACE_UNSETENV@ && !@HAVE_DECL_UNSETENV@)
|
||||||
|
_GL_CXXALIASWARN (unsetenv);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef unsetenv
|
||||||
|
# if HAVE_RAW_DECL_UNSETENV
|
||||||
|
_GL_WARN_ON_USE (unsetenv, "unsetenv is unportable - "
|
||||||
|
"use gnulib module unsetenv for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Convert a wide character to a multibyte character. */
|
||||||
|
#if @GNULIB_WCTOMB@
|
||||||
|
# if @REPLACE_WCTOMB@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef wctomb
|
||||||
|
# define wctomb rpl_wctomb
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (wctomb, int, (char *s, wchar_t wc));
|
||||||
|
_GL_CXXALIAS_RPL (wctomb, int, (char *s, wchar_t wc));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (wctomb, int, (char *s, wchar_t wc));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (wctomb);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_STDLIB_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_STDLIB_H */
|
||||||
|
#endif
|
||||||
62
lib/strcasecmp.c
Normal file
62
lib/strcasecmp.c
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
/* Case-insensitive string comparison function.
|
||||||
|
Copyright (C) 1998-1999, 2005-2007, 2009-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
|
||||||
|
|
||||||
|
/* Compare strings 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.
|
||||||
|
Note: This function does not work with multibyte strings! */
|
||||||
|
|
||||||
|
int
|
||||||
|
strcasecmp (const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
|
||||||
|
++p1;
|
||||||
|
++p2;
|
||||||
|
}
|
||||||
|
while (c1 == c2);
|
||||||
|
|
||||||
|
if (UCHAR_MAX <= INT_MAX)
|
||||||
|
return c1 - c2;
|
||||||
|
else
|
||||||
|
/* On machines where 'char' and 'int' are types of the same size, the
|
||||||
|
difference of two 'unsigned char' values - including the sign bit -
|
||||||
|
doesn't fit in an 'int'. */
|
||||||
|
return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
|
||||||
|
}
|
||||||
142
lib/strchrnul.c
Normal file
142
lib/strchrnul.c
Normal file
|
|
@ -0,0 +1,142 @@
|
||||||
|
/* Searching in a string.
|
||||||
|
Copyright (C) 2003, 2007-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* Find the first occurrence of C in S or the final NUL byte. */
|
||||||
|
char *
|
||||||
|
strchrnul (const char *s, int c_in)
|
||||||
|
{
|
||||||
|
/* On 32-bit hardware, choosing longword to be a 32-bit unsigned
|
||||||
|
long instead of a 64-bit uintmax_t tends to give better
|
||||||
|
performance. On 64-bit hardware, unsigned long is generally 64
|
||||||
|
bits already. Change this typedef to experiment with
|
||||||
|
performance. */
|
||||||
|
typedef unsigned long int longword;
|
||||||
|
|
||||||
|
const unsigned char *char_ptr;
|
||||||
|
const longword *longword_ptr;
|
||||||
|
longword repeated_one;
|
||||||
|
longword repeated_c;
|
||||||
|
unsigned char c;
|
||||||
|
|
||||||
|
c = (unsigned char) c_in;
|
||||||
|
if (!c)
|
||||||
|
return rawmemchr (s, 0);
|
||||||
|
|
||||||
|
/* Handle the first few bytes by reading one byte at a time.
|
||||||
|
Do this until CHAR_PTR is aligned on a longword boundary. */
|
||||||
|
for (char_ptr = (const unsigned char *) s;
|
||||||
|
(size_t) char_ptr % sizeof (longword) != 0;
|
||||||
|
++char_ptr)
|
||||||
|
if (!*char_ptr || *char_ptr == c)
|
||||||
|
return (char *) char_ptr;
|
||||||
|
|
||||||
|
longword_ptr = (const longword *) char_ptr;
|
||||||
|
|
||||||
|
/* All these elucidatory comments refer to 4-byte longwords,
|
||||||
|
but the theory applies equally well to any size longwords. */
|
||||||
|
|
||||||
|
/* Compute auxiliary longword values:
|
||||||
|
repeated_one is a value which has a 1 in every byte.
|
||||||
|
repeated_c has c in every byte. */
|
||||||
|
repeated_one = 0x01010101;
|
||||||
|
repeated_c = c | (c << 8);
|
||||||
|
repeated_c |= repeated_c << 16;
|
||||||
|
if (0xffffffffU < (longword) -1)
|
||||||
|
{
|
||||||
|
repeated_one |= repeated_one << 31 << 1;
|
||||||
|
repeated_c |= repeated_c << 31 << 1;
|
||||||
|
if (8 < sizeof (longword))
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 64; i < sizeof (longword) * 8; i *= 2)
|
||||||
|
{
|
||||||
|
repeated_one |= repeated_one << i;
|
||||||
|
repeated_c |= repeated_c << i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Instead of the traditional loop which tests each byte, we will
|
||||||
|
test a longword at a time. The tricky part is testing if *any of
|
||||||
|
the four* bytes in the longword in question are equal to NUL or
|
||||||
|
c. We first use an xor with repeated_c. This reduces the task
|
||||||
|
to testing whether *any of the four* bytes in longword1 or
|
||||||
|
longword2 is zero.
|
||||||
|
|
||||||
|
Let's consider longword1. We compute tmp =
|
||||||
|
((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
|
||||||
|
That is, we perform the following operations:
|
||||||
|
1. Subtract repeated_one.
|
||||||
|
2. & ~longword1.
|
||||||
|
3. & a mask consisting of 0x80 in every byte.
|
||||||
|
Consider what happens in each byte:
|
||||||
|
- If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
|
||||||
|
and step 3 transforms it into 0x80. A carry can also be propagated
|
||||||
|
to more significant bytes.
|
||||||
|
- If a byte of longword1 is nonzero, let its lowest 1 bit be at
|
||||||
|
position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
|
||||||
|
the byte ends in a single bit of value 0 and k bits of value 1.
|
||||||
|
After step 2, the result is just k bits of value 1: 2^k - 1. After
|
||||||
|
step 3, the result is 0. And no carry is produced.
|
||||||
|
So, if longword1 has only non-zero bytes, tmp is zero.
|
||||||
|
Whereas if longword1 has a zero byte, call j the position of the least
|
||||||
|
significant zero byte. Then the result has a zero at positions 0, ...,
|
||||||
|
j-1 and a 0x80 at position j. We cannot predict the result at the more
|
||||||
|
significant bytes (positions j+1..3), but it does not matter since we
|
||||||
|
already have a non-zero bit at position 8*j+7.
|
||||||
|
|
||||||
|
The test whether any byte in longword1 or longword2 is zero is equivalent
|
||||||
|
to testing whether tmp1 is nonzero or tmp2 is nonzero. We can combine
|
||||||
|
this into a single test, whether (tmp1 | tmp2) is nonzero.
|
||||||
|
|
||||||
|
This test can read more than one byte beyond the end of a string,
|
||||||
|
depending on where the terminating NUL is encountered. However,
|
||||||
|
this is considered safe since the initialization phase ensured
|
||||||
|
that the read will be aligned, therefore, the read will not cross
|
||||||
|
page boundaries and will not cause a fault. */
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
longword longword1 = *longword_ptr ^ repeated_c;
|
||||||
|
longword longword2 = *longword_ptr;
|
||||||
|
|
||||||
|
if (((((longword1 - repeated_one) & ~longword1)
|
||||||
|
| ((longword2 - repeated_one) & ~longword2))
|
||||||
|
& (repeated_one << 7)) != 0)
|
||||||
|
break;
|
||||||
|
longword_ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
char_ptr = (const unsigned char *) longword_ptr;
|
||||||
|
|
||||||
|
/* At this point, we know that one of the sizeof (longword) bytes
|
||||||
|
starting at char_ptr is == 0 or == c. On little-endian machines,
|
||||||
|
we could determine the first such byte without any further memory
|
||||||
|
accesses, just by looking at the tmp result from the last loop
|
||||||
|
iteration. But this does not work on big-endian machines.
|
||||||
|
Choose code that works in both cases. */
|
||||||
|
|
||||||
|
char_ptr = (unsigned char *) longword_ptr;
|
||||||
|
while (*char_ptr && (*char_ptr != c))
|
||||||
|
char_ptr++;
|
||||||
|
return (char *) char_ptr;
|
||||||
|
}
|
||||||
12
lib/strchrnul.valgrind
Normal file
12
lib/strchrnul.valgrind
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
# Suppress a valgrind message about use of uninitialized memory in strchrnul().
|
||||||
|
# This use is OK because it provides only a speedup.
|
||||||
|
{
|
||||||
|
strchrnul-value4
|
||||||
|
Memcheck:Value4
|
||||||
|
fun:strchrnul
|
||||||
|
}
|
||||||
|
{
|
||||||
|
strchrnul-value8
|
||||||
|
Memcheck:Value8
|
||||||
|
fun:strchrnul
|
||||||
|
}
|
||||||
297
lib/strerror-override.c
Normal file
297
lib/strerror-override.c
Normal file
|
|
@ -0,0 +1,297 @@
|
||||||
|
/* strerror-override.c --- POSIX compatible system error routine
|
||||||
|
|
||||||
|
Copyright (C) 2010-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "strerror-override.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#if GNULIB_defined_EWINSOCK /* native Windows platforms */
|
||||||
|
# if HAVE_WINSOCK2_H
|
||||||
|
# include <winsock2.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If ERRNUM maps to an errno value defined by gnulib, return a string
|
||||||
|
describing the error. Otherwise return NULL. */
|
||||||
|
const char *
|
||||||
|
strerror_override (int errnum)
|
||||||
|
{
|
||||||
|
/* These error messages are taken from glibc/sysdeps/gnu/errlist.c. */
|
||||||
|
switch (errnum)
|
||||||
|
{
|
||||||
|
#if REPLACE_STRERROR_0
|
||||||
|
case 0:
|
||||||
|
return "Success";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_ESOCK /* native Windows platforms with older <errno.h> */
|
||||||
|
case EINPROGRESS:
|
||||||
|
return "Operation now in progress";
|
||||||
|
case EALREADY:
|
||||||
|
return "Operation already in progress";
|
||||||
|
case ENOTSOCK:
|
||||||
|
return "Socket operation on non-socket";
|
||||||
|
case EDESTADDRREQ:
|
||||||
|
return "Destination address required";
|
||||||
|
case EMSGSIZE:
|
||||||
|
return "Message too long";
|
||||||
|
case EPROTOTYPE:
|
||||||
|
return "Protocol wrong type for socket";
|
||||||
|
case ENOPROTOOPT:
|
||||||
|
return "Protocol not available";
|
||||||
|
case EPROTONOSUPPORT:
|
||||||
|
return "Protocol not supported";
|
||||||
|
case EOPNOTSUPP:
|
||||||
|
return "Operation not supported";
|
||||||
|
case EAFNOSUPPORT:
|
||||||
|
return "Address family not supported by protocol";
|
||||||
|
case EADDRINUSE:
|
||||||
|
return "Address already in use";
|
||||||
|
case EADDRNOTAVAIL:
|
||||||
|
return "Cannot assign requested address";
|
||||||
|
case ENETDOWN:
|
||||||
|
return "Network is down";
|
||||||
|
case ENETUNREACH:
|
||||||
|
return "Network is unreachable";
|
||||||
|
case ECONNRESET:
|
||||||
|
return "Connection reset by peer";
|
||||||
|
case ENOBUFS:
|
||||||
|
return "No buffer space available";
|
||||||
|
case EISCONN:
|
||||||
|
return "Transport endpoint is already connected";
|
||||||
|
case ENOTCONN:
|
||||||
|
return "Transport endpoint is not connected";
|
||||||
|
case ETIMEDOUT:
|
||||||
|
return "Connection timed out";
|
||||||
|
case ECONNREFUSED:
|
||||||
|
return "Connection refused";
|
||||||
|
case ELOOP:
|
||||||
|
return "Too many levels of symbolic links";
|
||||||
|
case EHOSTUNREACH:
|
||||||
|
return "No route to host";
|
||||||
|
case EWOULDBLOCK:
|
||||||
|
return "Operation would block";
|
||||||
|
#endif
|
||||||
|
#if GNULIB_defined_ESTREAMS /* native Windows platforms with older <errno.h> */
|
||||||
|
case ETXTBSY:
|
||||||
|
return "Text file busy";
|
||||||
|
case ENODATA:
|
||||||
|
return "No data available";
|
||||||
|
case ENOSR:
|
||||||
|
return "Out of streams resources";
|
||||||
|
case ENOSTR:
|
||||||
|
return "Device not a stream";
|
||||||
|
case ETIME:
|
||||||
|
return "Timer expired";
|
||||||
|
case EOTHER:
|
||||||
|
return "Other error";
|
||||||
|
#endif
|
||||||
|
#if GNULIB_defined_EWINSOCK /* native Windows platforms */
|
||||||
|
case ESOCKTNOSUPPORT:
|
||||||
|
return "Socket type not supported";
|
||||||
|
case EPFNOSUPPORT:
|
||||||
|
return "Protocol family not supported";
|
||||||
|
case ESHUTDOWN:
|
||||||
|
return "Cannot send after transport endpoint shutdown";
|
||||||
|
case ETOOMANYREFS:
|
||||||
|
return "Too many references: cannot splice";
|
||||||
|
case EHOSTDOWN:
|
||||||
|
return "Host is down";
|
||||||
|
case EPROCLIM:
|
||||||
|
return "Too many processes";
|
||||||
|
case EUSERS:
|
||||||
|
return "Too many users";
|
||||||
|
case EDQUOT:
|
||||||
|
return "Disk quota exceeded";
|
||||||
|
case ESTALE:
|
||||||
|
return "Stale NFS file handle";
|
||||||
|
case EREMOTE:
|
||||||
|
return "Object is remote";
|
||||||
|
# if HAVE_WINSOCK2_H
|
||||||
|
/* WSA_INVALID_HANDLE maps to EBADF */
|
||||||
|
/* WSA_NOT_ENOUGH_MEMORY maps to ENOMEM */
|
||||||
|
/* WSA_INVALID_PARAMETER maps to EINVAL */
|
||||||
|
case WSA_OPERATION_ABORTED:
|
||||||
|
return "Overlapped operation aborted";
|
||||||
|
case WSA_IO_INCOMPLETE:
|
||||||
|
return "Overlapped I/O event object not in signaled state";
|
||||||
|
case WSA_IO_PENDING:
|
||||||
|
return "Overlapped operations will complete later";
|
||||||
|
/* WSAEINTR maps to EINTR */
|
||||||
|
/* WSAEBADF maps to EBADF */
|
||||||
|
/* WSAEACCES maps to EACCES */
|
||||||
|
/* WSAEFAULT maps to EFAULT */
|
||||||
|
/* WSAEINVAL maps to EINVAL */
|
||||||
|
/* WSAEMFILE maps to EMFILE */
|
||||||
|
/* WSAEWOULDBLOCK maps to EWOULDBLOCK */
|
||||||
|
/* WSAEINPROGRESS maps to EINPROGRESS */
|
||||||
|
/* WSAEALREADY maps to EALREADY */
|
||||||
|
/* WSAENOTSOCK maps to ENOTSOCK */
|
||||||
|
/* WSAEDESTADDRREQ maps to EDESTADDRREQ */
|
||||||
|
/* WSAEMSGSIZE maps to EMSGSIZE */
|
||||||
|
/* WSAEPROTOTYPE maps to EPROTOTYPE */
|
||||||
|
/* WSAENOPROTOOPT maps to ENOPROTOOPT */
|
||||||
|
/* WSAEPROTONOSUPPORT maps to EPROTONOSUPPORT */
|
||||||
|
/* WSAESOCKTNOSUPPORT is ESOCKTNOSUPPORT */
|
||||||
|
/* WSAEOPNOTSUPP maps to EOPNOTSUPP */
|
||||||
|
/* WSAEPFNOSUPPORT is EPFNOSUPPORT */
|
||||||
|
/* WSAEAFNOSUPPORT maps to EAFNOSUPPORT */
|
||||||
|
/* WSAEADDRINUSE maps to EADDRINUSE */
|
||||||
|
/* WSAEADDRNOTAVAIL maps to EADDRNOTAVAIL */
|
||||||
|
/* WSAENETDOWN maps to ENETDOWN */
|
||||||
|
/* WSAENETUNREACH maps to ENETUNREACH */
|
||||||
|
/* WSAENETRESET maps to ENETRESET */
|
||||||
|
/* WSAECONNABORTED maps to ECONNABORTED */
|
||||||
|
/* WSAECONNRESET maps to ECONNRESET */
|
||||||
|
/* WSAENOBUFS maps to ENOBUFS */
|
||||||
|
/* WSAEISCONN maps to EISCONN */
|
||||||
|
/* WSAENOTCONN maps to ENOTCONN */
|
||||||
|
/* WSAESHUTDOWN is ESHUTDOWN */
|
||||||
|
/* WSAETOOMANYREFS is ETOOMANYREFS */
|
||||||
|
/* WSAETIMEDOUT maps to ETIMEDOUT */
|
||||||
|
/* WSAECONNREFUSED maps to ECONNREFUSED */
|
||||||
|
/* WSAELOOP maps to ELOOP */
|
||||||
|
/* WSAENAMETOOLONG maps to ENAMETOOLONG */
|
||||||
|
/* WSAEHOSTDOWN is EHOSTDOWN */
|
||||||
|
/* WSAEHOSTUNREACH maps to EHOSTUNREACH */
|
||||||
|
/* WSAENOTEMPTY maps to ENOTEMPTY */
|
||||||
|
/* WSAEPROCLIM is EPROCLIM */
|
||||||
|
/* WSAEUSERS is EUSERS */
|
||||||
|
/* WSAEDQUOT is EDQUOT */
|
||||||
|
/* WSAESTALE is ESTALE */
|
||||||
|
/* WSAEREMOTE is EREMOTE */
|
||||||
|
case WSASYSNOTREADY:
|
||||||
|
return "Network subsystem is unavailable";
|
||||||
|
case WSAVERNOTSUPPORTED:
|
||||||
|
return "Winsock.dll version out of range";
|
||||||
|
case WSANOTINITIALISED:
|
||||||
|
return "Successful WSAStartup not yet performed";
|
||||||
|
case WSAEDISCON:
|
||||||
|
return "Graceful shutdown in progress";
|
||||||
|
case WSAENOMORE: case WSA_E_NO_MORE:
|
||||||
|
return "No more results";
|
||||||
|
case WSAECANCELLED: case WSA_E_CANCELLED:
|
||||||
|
return "Call was canceled";
|
||||||
|
case WSAEINVALIDPROCTABLE:
|
||||||
|
return "Procedure call table is invalid";
|
||||||
|
case WSAEINVALIDPROVIDER:
|
||||||
|
return "Service provider is invalid";
|
||||||
|
case WSAEPROVIDERFAILEDINIT:
|
||||||
|
return "Service provider failed to initialize";
|
||||||
|
case WSASYSCALLFAILURE:
|
||||||
|
return "System call failure";
|
||||||
|
case WSASERVICE_NOT_FOUND:
|
||||||
|
return "Service not found";
|
||||||
|
case WSATYPE_NOT_FOUND:
|
||||||
|
return "Class type not found";
|
||||||
|
case WSAEREFUSED:
|
||||||
|
return "Database query was refused";
|
||||||
|
case WSAHOST_NOT_FOUND:
|
||||||
|
return "Host not found";
|
||||||
|
case WSATRY_AGAIN:
|
||||||
|
return "Nonauthoritative host not found";
|
||||||
|
case WSANO_RECOVERY:
|
||||||
|
return "Nonrecoverable error";
|
||||||
|
case WSANO_DATA:
|
||||||
|
return "Valid name, no data record of requested type";
|
||||||
|
/* WSA_QOS_* omitted */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_ENOMSG
|
||||||
|
case ENOMSG:
|
||||||
|
return "No message of desired type";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_EIDRM
|
||||||
|
case EIDRM:
|
||||||
|
return "Identifier removed";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_ENOLINK
|
||||||
|
case ENOLINK:
|
||||||
|
return "Link has been severed";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_EPROTO
|
||||||
|
case EPROTO:
|
||||||
|
return "Protocol error";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_EMULTIHOP
|
||||||
|
case EMULTIHOP:
|
||||||
|
return "Multihop attempted";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_EBADMSG
|
||||||
|
case EBADMSG:
|
||||||
|
return "Bad message";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_EOVERFLOW
|
||||||
|
case EOVERFLOW:
|
||||||
|
return "Value too large for defined data type";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_ENOTSUP
|
||||||
|
case ENOTSUP:
|
||||||
|
return "Not supported";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_ENETRESET
|
||||||
|
case ENETRESET:
|
||||||
|
return "Network dropped connection on reset";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_ECONNABORTED
|
||||||
|
case ECONNABORTED:
|
||||||
|
return "Software caused connection abort";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_ESTALE
|
||||||
|
case ESTALE:
|
||||||
|
return "Stale NFS file handle";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_EDQUOT
|
||||||
|
case EDQUOT:
|
||||||
|
return "Disk quota exceeded";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_ECANCELED
|
||||||
|
case ECANCELED:
|
||||||
|
return "Operation canceled";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_EOWNERDEAD
|
||||||
|
case EOWNERDEAD:
|
||||||
|
return "Owner died";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GNULIB_defined_ENOTRECOVERABLE
|
||||||
|
case ENOTRECOVERABLE:
|
||||||
|
return "State not recoverable";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
55
lib/strerror-override.h
Normal file
55
lib/strerror-override.h
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
/* strerror-override.h --- POSIX compatible system error routine
|
||||||
|
|
||||||
|
Copyright (C) 2010-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _GL_STRERROR_OVERRIDE_H
|
||||||
|
# define _GL_STRERROR_OVERRIDE_H
|
||||||
|
|
||||||
|
# include <errno.h>
|
||||||
|
# include <stddef.h>
|
||||||
|
|
||||||
|
/* Reasonable buffer size that should never trigger ERANGE; if this
|
||||||
|
proves too small, we intentionally abort(), to remind us to fix
|
||||||
|
this value. */
|
||||||
|
# define STACKBUF_LEN 256
|
||||||
|
|
||||||
|
/* If ERRNUM maps to an errno value defined by gnulib, return a string
|
||||||
|
describing the error. Otherwise return NULL. */
|
||||||
|
# if REPLACE_STRERROR_0 \
|
||||||
|
|| GNULIB_defined_ESOCK \
|
||||||
|
|| GNULIB_defined_ESTREAMS \
|
||||||
|
|| GNULIB_defined_EWINSOCK \
|
||||||
|
|| GNULIB_defined_ENOMSG \
|
||||||
|
|| GNULIB_defined_EIDRM \
|
||||||
|
|| GNULIB_defined_ENOLINK \
|
||||||
|
|| GNULIB_defined_EPROTO \
|
||||||
|
|| GNULIB_defined_EMULTIHOP \
|
||||||
|
|| GNULIB_defined_EBADMSG \
|
||||||
|
|| GNULIB_defined_EOVERFLOW \
|
||||||
|
|| GNULIB_defined_ENOTSUP \
|
||||||
|
|| GNULIB_defined_ENETRESET \
|
||||||
|
|| GNULIB_defined_ECONNABORTED \
|
||||||
|
|| GNULIB_defined_ESTALE \
|
||||||
|
|| GNULIB_defined_EDQUOT \
|
||||||
|
|| GNULIB_defined_ECANCELED \
|
||||||
|
|| GNULIB_defined_EOWNERDEAD \
|
||||||
|
|| GNULIB_defined_ENOTRECOVERABLE
|
||||||
|
extern const char *strerror_override (int errnum);
|
||||||
|
# else
|
||||||
|
# define strerror_override(ignored) NULL
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif /* _GL_STRERROR_OVERRIDE_H */
|
||||||
70
lib/strerror.c
Normal file
70
lib/strerror.c
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
/* strerror.c --- POSIX compatible system error routine
|
||||||
|
|
||||||
|
Copyright (C) 2007-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "intprops.h"
|
||||||
|
#include "strerror-override.h"
|
||||||
|
#include "verify.h"
|
||||||
|
|
||||||
|
/* Use the system functions, not the gnulib overrides in this file. */
|
||||||
|
#undef sprintf
|
||||||
|
|
||||||
|
char *
|
||||||
|
strerror (int n)
|
||||||
|
#undef strerror
|
||||||
|
{
|
||||||
|
static char buf[STACKBUF_LEN];
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
/* Cast away const, due to the historical signature of strerror;
|
||||||
|
callers should not be modifying the string. */
|
||||||
|
const char *msg = strerror_override (n);
|
||||||
|
if (msg)
|
||||||
|
return (char *) msg;
|
||||||
|
|
||||||
|
msg = strerror (n);
|
||||||
|
|
||||||
|
/* Our strerror_r implementation might use the system's strerror
|
||||||
|
buffer, so all other clients of strerror have to see the error
|
||||||
|
copied into a buffer that we manage. This is not thread-safe,
|
||||||
|
even if the system strerror is, but portable programs shouldn't
|
||||||
|
be using strerror if they care about thread-safety. */
|
||||||
|
if (!msg || !*msg)
|
||||||
|
{
|
||||||
|
static char const fmt[] = "Unknown error %d";
|
||||||
|
verify (sizeof buf >= sizeof (fmt) + INT_STRLEN_BOUND (n));
|
||||||
|
sprintf (buf, fmt, n);
|
||||||
|
errno = EINVAL;
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fix STACKBUF_LEN if this ever aborts. */
|
||||||
|
len = strlen (msg);
|
||||||
|
if (sizeof buf <= len)
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
return memcpy (buf, msg, len + 1);
|
||||||
|
}
|
||||||
1029
lib/string.in.h
Normal file
1029
lib/string.in.h
Normal file
File diff suppressed because it is too large
Load diff
122
lib/strings.in.h
Normal file
122
lib/strings.in.h
Normal file
|
|
@ -0,0 +1,122 @@
|
||||||
|
/* A substitute <strings.h>.
|
||||||
|
|
||||||
|
Copyright (C) 2007-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_STRINGS_H
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
/* Minix 3.1.8 has a bug: <sys/types.h> must be included before <strings.h>.
|
||||||
|
But avoid namespace pollution on glibc systems. */
|
||||||
|
#if defined __minix && !defined __GLIBC__
|
||||||
|
# include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
#if @HAVE_STRINGS_H@
|
||||||
|
# @INCLUDE_NEXT@ @NEXT_STRINGS_H@
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_STRINGS_H
|
||||||
|
#define _@GUARD_PREFIX@_STRINGS_H
|
||||||
|
|
||||||
|
#if ! @HAVE_DECL_STRNCASECMP@
|
||||||
|
/* Get size_t. */
|
||||||
|
# include <stddef.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
|
||||||
|
|
||||||
|
/* The definition of _GL_ARG_NONNULL is copied here. */
|
||||||
|
|
||||||
|
/* The definition of _GL_WARN_ON_USE is copied here. */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Find the index of the least-significant set bit. */
|
||||||
|
#if @GNULIB_FFS@
|
||||||
|
# if !@HAVE_FFS@
|
||||||
|
_GL_FUNCDECL_SYS (ffs, int, (int i));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (ffs, int, (int i));
|
||||||
|
_GL_CXXALIASWARN (ffs);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef ffs
|
||||||
|
# if HAVE_RAW_DECL_FFS
|
||||||
|
_GL_WARN_ON_USE (ffs, "ffs is not portable - use the ffs module");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Compare strings 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.
|
||||||
|
Note: This function does not work in multibyte locales. */
|
||||||
|
#if ! @HAVE_STRCASECMP@
|
||||||
|
extern int strcasecmp (char const *s1, char const *s2)
|
||||||
|
_GL_ARG_NONNULL ((1, 2));
|
||||||
|
#endif
|
||||||
|
#if defined GNULIB_POSIXCHECK
|
||||||
|
/* strcasecmp() does not work with multibyte strings:
|
||||||
|
POSIX says that it operates on "strings", and "string" in POSIX is defined
|
||||||
|
as a sequence of bytes, not of characters. */
|
||||||
|
# undef strcasecmp
|
||||||
|
# if HAVE_RAW_DECL_STRCASECMP
|
||||||
|
_GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character "
|
||||||
|
"strings in multibyte locales - "
|
||||||
|
"use mbscasecmp if you care about "
|
||||||
|
"internationalization, or use c_strcasecmp , "
|
||||||
|
"gnulib module c-strcase) if you want a locale "
|
||||||
|
"independent function");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Compare no more than N bytes of strings 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.
|
||||||
|
Note: This function cannot work correctly in multibyte locales. */
|
||||||
|
#if ! @HAVE_DECL_STRNCASECMP@
|
||||||
|
extern int strncasecmp (char const *s1, char const *s2, size_t n)
|
||||||
|
_GL_ARG_NONNULL ((1, 2));
|
||||||
|
#endif
|
||||||
|
#if defined GNULIB_POSIXCHECK
|
||||||
|
/* strncasecmp() does not work with multibyte strings:
|
||||||
|
POSIX says that it operates on "strings", and "string" in POSIX is defined
|
||||||
|
as a sequence of bytes, not of characters. */
|
||||||
|
# undef strncasecmp
|
||||||
|
# if HAVE_RAW_DECL_STRNCASECMP
|
||||||
|
_GL_WARN_ON_USE (strncasecmp, "strncasecmp cannot work correctly on character "
|
||||||
|
"strings in multibyte locales - "
|
||||||
|
"use mbsncasecmp or mbspcasecmp if you care about "
|
||||||
|
"internationalization, or use c_strncasecmp , "
|
||||||
|
"gnulib module c-strcase) if you want a locale "
|
||||||
|
"independent function");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_STRING_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_STRING_H */
|
||||||
45
lib/stripslash.c
Normal file
45
lib/stripslash.c
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
/* stripslash.c -- remove redundant trailing slashes from a file name
|
||||||
|
|
||||||
|
Copyright (C) 1990, 2001, 2003-2006, 2009-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "dirname.h"
|
||||||
|
|
||||||
|
/* Remove trailing slashes from FILE. Return true if a trailing slash
|
||||||
|
was removed. This is useful when using file name completion from a
|
||||||
|
shell that adds a "/" after directory names (such as tcsh and
|
||||||
|
bash), because on symlinks to directories, several system calls
|
||||||
|
have different semantics according to whether a trailing slash is
|
||||||
|
present. */
|
||||||
|
|
||||||
|
bool
|
||||||
|
strip_trailing_slashes (char *file)
|
||||||
|
{
|
||||||
|
char *base = last_component (file);
|
||||||
|
char *base_lim;
|
||||||
|
bool had_slash;
|
||||||
|
|
||||||
|
/* last_component returns "" for file system roots, but we need to turn
|
||||||
|
"///" into "/". */
|
||||||
|
if (! *base)
|
||||||
|
base = file;
|
||||||
|
base_lim = base + base_len (base);
|
||||||
|
had_slash = (*base_lim != '\0');
|
||||||
|
*base_lim = '\0';
|
||||||
|
return had_slash;
|
||||||
|
}
|
||||||
62
lib/strncasecmp.c
Normal file
62
lib/strncasecmp.c
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
/* strncasecmp.c -- case insensitive string comparator
|
||||||
|
Copyright (C) 1998-1999, 2005-2007, 2009-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
|
||||||
|
|
||||||
|
/* Compare no more than N bytes of strings 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.
|
||||||
|
Note: This function cannot work correctly in multibyte locales. */
|
||||||
|
|
||||||
|
int
|
||||||
|
strncasecmp (const char *s1, const char *s2, size_t n)
|
||||||
|
{
|
||||||
|
register const unsigned char *p1 = (const unsigned char *) s1;
|
||||||
|
register const unsigned char *p2 = (const unsigned char *) s2;
|
||||||
|
unsigned char c1, c2;
|
||||||
|
|
||||||
|
if (p1 == p2 || n == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
c1 = TOLOWER (*p1);
|
||||||
|
c2 = TOLOWER (*p2);
|
||||||
|
|
||||||
|
if (--n == 0 || c1 == '\0')
|
||||||
|
break;
|
||||||
|
|
||||||
|
++p1;
|
||||||
|
++p2;
|
||||||
|
}
|
||||||
|
while (c1 == c2);
|
||||||
|
|
||||||
|
if (UCHAR_MAX <= INT_MAX)
|
||||||
|
return c1 - c2;
|
||||||
|
else
|
||||||
|
/* On machines where 'char' and 'int' are types of the same size, the
|
||||||
|
difference of two 'unsigned char' values - including the sign bit -
|
||||||
|
doesn't fit in an 'int'. */
|
||||||
|
return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
|
||||||
|
}
|
||||||
36
lib/strndup.c
Normal file
36
lib/strndup.c
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
/* A replacement function, for systems that lack strndup.
|
||||||
|
|
||||||
|
Copyright (C) 1996-1998, 2001-2003, 2005-2007, 2009-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
char *
|
||||||
|
strndup (char const *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);
|
||||||
|
}
|
||||||
30
lib/strnlen.c
Normal file
30
lib/strnlen.c
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
/* Find the length of STRING, but scan at most MAXLEN characters.
|
||||||
|
Copyright (C) 2005-2007, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
Written by Simon Josefsson.
|
||||||
|
|
||||||
|
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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#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 ? (size_t) (end - string) : maxlen;
|
||||||
|
}
|
||||||
51
lib/sys_types.in.h
Normal file
51
lib/sys_types.in.h
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
/* Provide a more complete sys/types.h.
|
||||||
|
|
||||||
|
Copyright (C) 2011-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
#@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
|
||||||
|
#define _@GUARD_PREFIX@_SYS_TYPES_H
|
||||||
|
|
||||||
|
/* Override off_t if Large File Support is requested on native Windows. */
|
||||||
|
#if @WINDOWS_64_BIT_OFF_T@
|
||||||
|
/* Same as int64_t in <stdint.h>. */
|
||||||
|
# if defined _MSC_VER
|
||||||
|
# define off_t __int64
|
||||||
|
# else
|
||||||
|
# define off_t long long int
|
||||||
|
# endif
|
||||||
|
/* Indicator, for gnulib internal purposes. */
|
||||||
|
# define _GL_WINDOWS_64_BIT_OFF_T 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* MSVC 9 defines size_t in <stddef.h>, not in <sys/types.h>. */
|
||||||
|
/* But avoid namespace pollution on glibc systems. */
|
||||||
|
#if ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) \
|
||||||
|
&& ! defined __GLIBC__
|
||||||
|
# include <stddef.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
|
||||||
72
lib/sysexits.in.h
Normal file
72
lib/sysexits.in.h
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
/* exit() exit codes for some BSD system programs.
|
||||||
|
Copyright (C) 2003, 2006-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Simon Josefsson based on sysexits(3) man page */
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_SYSEXITS_H
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
#if @HAVE_SYSEXITS_H@
|
||||||
|
|
||||||
|
/* IRIX 6.5 has an <unistd.h> that defines a macro EX_OK with a nonzero
|
||||||
|
value. Override it. See
|
||||||
|
<http://lists.gnu.org/archive/html/bug-gnulib/2007-03/msg00361.html> */
|
||||||
|
# ifdef __sgi
|
||||||
|
# include <unistd.h>
|
||||||
|
# undef EX_OK
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
# @INCLUDE_NEXT@ @NEXT_SYSEXITS_H@
|
||||||
|
|
||||||
|
/* HP-UX 11 <sysexits.h> ends at EX_NOPERM. */
|
||||||
|
# ifndef EX_CONFIG
|
||||||
|
# define EX_CONFIG 78
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_SYSEXITS_H
|
||||||
|
#define _@GUARD_PREFIX@_SYSEXITS_H
|
||||||
|
|
||||||
|
#if !@HAVE_SYSEXITS_H@
|
||||||
|
|
||||||
|
# define EX_OK 0 /* same value as EXIT_SUCCESS */
|
||||||
|
|
||||||
|
# define EX_USAGE 64
|
||||||
|
# define EX_DATAERR 65
|
||||||
|
# define EX_NOINPUT 66
|
||||||
|
# define EX_NOUSER 67
|
||||||
|
# define EX_NOHOST 68
|
||||||
|
# define EX_UNAVAILABLE 69
|
||||||
|
# define EX_SOFTWARE 70
|
||||||
|
# define EX_OSERR 71
|
||||||
|
# define EX_OSFILE 72
|
||||||
|
# define EX_CANTCREAT 73
|
||||||
|
# define EX_IOERR 74
|
||||||
|
# define EX_TEMPFAIL 75
|
||||||
|
# define EX_PROTOCOL 76
|
||||||
|
# define EX_NOPERM 77
|
||||||
|
# define EX_CONFIG 78
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_SYSEXITS_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_SYSEXITS_H */
|
||||||
1535
lib/unistd.in.h
Normal file
1535
lib/unistd.in.h
Normal file
File diff suppressed because it is too large
Load diff
5606
lib/vasnprintf.c
Normal file
5606
lib/vasnprintf.c
Normal file
File diff suppressed because it is too large
Load diff
79
lib/vasnprintf.h
Normal file
79
lib/vasnprintf.h
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
/* vsprintf with automatic memory allocation.
|
||||||
|
Copyright (C) 2002-2004, 2007-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _VASNPRINTF_H
|
||||||
|
#define _VASNPRINTF_H
|
||||||
|
|
||||||
|
/* Get va_list. */
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
/* Get size_t. */
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||||
|
The __-protected variants of the attributes 'format' and 'printf' are
|
||||||
|
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
||||||
|
We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
|
||||||
|
gnulib and libintl do '#define printf __printf__' when they override
|
||||||
|
the 'printf' function. */
|
||||||
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Write formatted output to a string dynamically allocated with malloc().
|
||||||
|
You can pass a preallocated buffer for the result in RESULTBUF and its
|
||||||
|
size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
|
||||||
|
If successful, return the address of the string (this may be = RESULTBUF
|
||||||
|
if no dynamic memory allocation was necessary) and set *LENGTHP to the
|
||||||
|
number of resulting bytes, excluding the trailing NUL. Upon error, set
|
||||||
|
errno and return NULL.
|
||||||
|
|
||||||
|
When dynamic memory allocation occurs, the preallocated buffer is left
|
||||||
|
alone (with possibly modified contents). This makes it possible to use
|
||||||
|
a statically allocated or stack-allocated buffer, like this:
|
||||||
|
|
||||||
|
char buf[100];
|
||||||
|
size_t len = sizeof (buf);
|
||||||
|
char *output = vasnprintf (buf, &len, format, args);
|
||||||
|
if (output == NULL)
|
||||||
|
... error handling ...;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
... use the output string ...;
|
||||||
|
if (output != buf)
|
||||||
|
free (output);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
#if REPLACE_VASNPRINTF
|
||||||
|
# define asnprintf rpl_asnprintf
|
||||||
|
# define vasnprintf rpl_vasnprintf
|
||||||
|
#endif
|
||||||
|
extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4));
|
||||||
|
extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 3, 0));
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _VASNPRINTF_H */
|
||||||
245
lib/verify.h
Normal file
245
lib/verify.h
Normal file
|
|
@ -0,0 +1,245 @@
|
||||||
|
/* Compile-time assert-like macros.
|
||||||
|
|
||||||
|
Copyright (C) 2005-2006, 2009-2012 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
|
||||||
|
|
||||||
|
#ifndef _GL_VERIFY_H
|
||||||
|
# define _GL_VERIFY_H
|
||||||
|
|
||||||
|
|
||||||
|
/* Define _GL_HAVE__STATIC_ASSERT to 1 if _Static_assert works as per C11.
|
||||||
|
This is supported by GCC 4.6.0 and later, in C mode, and its use
|
||||||
|
here generates easier-to-read diagnostics when verify (R) fails.
|
||||||
|
|
||||||
|
Define _GL_HAVE_STATIC_ASSERT to 1 if static_assert works as per C++11.
|
||||||
|
This will likely be supported by future GCC versions, in C++ mode.
|
||||||
|
|
||||||
|
Use this only with GCC. If we were willing to slow 'configure'
|
||||||
|
down we could also use it with other compilers, but since this
|
||||||
|
affects only the quality of diagnostics, why bother? */
|
||||||
|
# if (4 < __GNUC__ || (__GNUC__ == 4 && 6 <= __GNUC_MINOR__)) && !defined __cplusplus
|
||||||
|
# define _GL_HAVE__STATIC_ASSERT 1
|
||||||
|
# endif
|
||||||
|
/* The condition (99 < __GNUC__) is temporary, until we know about the
|
||||||
|
first G++ release that supports static_assert. */
|
||||||
|
# if (99 < __GNUC__) && defined __cplusplus
|
||||||
|
# define _GL_HAVE_STATIC_ASSERT 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Each of these macros verifies that its argument R is nonzero. To
|
||||||
|
be portable, R should be an integer constant expression. Unlike
|
||||||
|
assert (R), there is no run-time overhead.
|
||||||
|
|
||||||
|
If _Static_assert works, verify (R) uses it directly. Similarly,
|
||||||
|
_GL_VERIFY_TRUE works by packaging a _Static_assert inside a struct
|
||||||
|
that is an operand of sizeof.
|
||||||
|
|
||||||
|
The code below uses several ideas for C++ compilers, and for C
|
||||||
|
compilers that do not support _Static_assert:
|
||||||
|
|
||||||
|
* The first step is ((R) ? 1 : -1). Given an expression R, of
|
||||||
|
integral or boolean or floating-point type, this yields an
|
||||||
|
expression of integral type, whose value is later verified to be
|
||||||
|
constant and nonnegative.
|
||||||
|
|
||||||
|
* Next this expression W is wrapped in a type
|
||||||
|
struct _gl_verify_type {
|
||||||
|
unsigned int _gl_verify_error_if_negative: W;
|
||||||
|
}.
|
||||||
|
If W is negative, this yields a compile-time error. No compiler can
|
||||||
|
deal with a bit-field of negative size.
|
||||||
|
|
||||||
|
One might think that an array size check would have the same
|
||||||
|
effect, that is, that the type struct { unsigned int dummy[W]; }
|
||||||
|
would work as well. However, inside a function, some compilers
|
||||||
|
(such as C++ compilers and GNU C) allow local parameters and
|
||||||
|
variables inside array size expressions. With these compilers,
|
||||||
|
an array size check would not properly diagnose this misuse of
|
||||||
|
the verify macro:
|
||||||
|
|
||||||
|
void function (int n) { verify (n < 0); }
|
||||||
|
|
||||||
|
* For the verify macro, the struct _gl_verify_type will need to
|
||||||
|
somehow be embedded into a declaration. To be portable, this
|
||||||
|
declaration must declare an object, a constant, a function, or a
|
||||||
|
typedef name. If the declared entity uses the type directly,
|
||||||
|
such as in
|
||||||
|
|
||||||
|
struct dummy {...};
|
||||||
|
typedef struct {...} dummy;
|
||||||
|
extern struct {...} *dummy;
|
||||||
|
extern void dummy (struct {...} *);
|
||||||
|
extern struct {...} *dummy (void);
|
||||||
|
|
||||||
|
two uses of the verify macro would yield colliding declarations
|
||||||
|
if the entity names are not disambiguated. A workaround is to
|
||||||
|
attach the current line number to the entity name:
|
||||||
|
|
||||||
|
#define _GL_CONCAT0(x, y) x##y
|
||||||
|
#define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
|
||||||
|
extern struct {...} * _GL_CONCAT (dummy, __LINE__);
|
||||||
|
|
||||||
|
But this has the problem that two invocations of verify from
|
||||||
|
within the same macro would collide, since the __LINE__ value
|
||||||
|
would be the same for both invocations. (The GCC __COUNTER__
|
||||||
|
macro solves this problem, but is not portable.)
|
||||||
|
|
||||||
|
A solution is to use the sizeof operator. It yields a number,
|
||||||
|
getting rid of the identity of the type. Declarations like
|
||||||
|
|
||||||
|
extern int dummy [sizeof (struct {...})];
|
||||||
|
extern void dummy (int [sizeof (struct {...})]);
|
||||||
|
extern int (*dummy (void)) [sizeof (struct {...})];
|
||||||
|
|
||||||
|
can be repeated.
|
||||||
|
|
||||||
|
* Should the implementation use a named struct or an unnamed struct?
|
||||||
|
Which of the following alternatives can be used?
|
||||||
|
|
||||||
|
extern int dummy [sizeof (struct {...})];
|
||||||
|
extern int dummy [sizeof (struct _gl_verify_type {...})];
|
||||||
|
extern void dummy (int [sizeof (struct {...})]);
|
||||||
|
extern void dummy (int [sizeof (struct _gl_verify_type {...})]);
|
||||||
|
extern int (*dummy (void)) [sizeof (struct {...})];
|
||||||
|
extern int (*dummy (void)) [sizeof (struct _gl_verify_type {...})];
|
||||||
|
|
||||||
|
In the second and sixth case, the struct type is exported to the
|
||||||
|
outer scope; two such declarations therefore collide. GCC warns
|
||||||
|
about the first, third, and fourth cases. So the only remaining
|
||||||
|
possibility is the fifth case:
|
||||||
|
|
||||||
|
extern int (*dummy (void)) [sizeof (struct {...})];
|
||||||
|
|
||||||
|
* GCC warns about duplicate declarations of the dummy function if
|
||||||
|
-Wredundant-decls is used. GCC 4.3 and later have a builtin
|
||||||
|
__COUNTER__ macro that can let us generate unique identifiers for
|
||||||
|
each dummy function, to suppress this warning.
|
||||||
|
|
||||||
|
* This implementation exploits the fact that older versions of GCC,
|
||||||
|
which do not support _Static_assert, also do not warn about the
|
||||||
|
last declaration mentioned above.
|
||||||
|
|
||||||
|
* GCC warns if -Wnested-externs is enabled and verify() is used
|
||||||
|
within a function body; but inside a function, you can always
|
||||||
|
arrange to use verify_expr() instead.
|
||||||
|
|
||||||
|
* In C++, any struct definition inside sizeof is invalid.
|
||||||
|
Use a template type to work around the problem. */
|
||||||
|
|
||||||
|
/* Concatenate two preprocessor tokens. */
|
||||||
|
# define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
|
||||||
|
# define _GL_CONCAT0(x, y) x##y
|
||||||
|
|
||||||
|
/* _GL_COUNTER is an integer, preferably one that changes each time we
|
||||||
|
use it. Use __COUNTER__ if it works, falling back on __LINE__
|
||||||
|
otherwise. __LINE__ isn't perfect, but it's better than a
|
||||||
|
constant. */
|
||||||
|
# if defined __COUNTER__ && __COUNTER__ != __COUNTER__
|
||||||
|
# define _GL_COUNTER __COUNTER__
|
||||||
|
# else
|
||||||
|
# define _GL_COUNTER __LINE__
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Generate a symbol with the given prefix, making it unique if
|
||||||
|
possible. */
|
||||||
|
# define _GL_GENSYM(prefix) _GL_CONCAT (prefix, _GL_COUNTER)
|
||||||
|
|
||||||
|
/* Verify requirement R at compile-time, as an integer constant expression
|
||||||
|
that returns 1. If R is false, fail at compile-time, preferably
|
||||||
|
with a diagnostic that includes the string-literal DIAGNOSTIC. */
|
||||||
|
|
||||||
|
# define _GL_VERIFY_TRUE(R, DIAGNOSTIC) \
|
||||||
|
(!!sizeof (_GL_VERIFY_TYPE (R, DIAGNOSTIC)))
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
# if !GNULIB_defined_struct__gl_verify_type
|
||||||
|
template <int w>
|
||||||
|
struct _gl_verify_type {
|
||||||
|
unsigned int _gl_verify_error_if_negative: w;
|
||||||
|
};
|
||||||
|
# define GNULIB_defined_struct__gl_verify_type 1
|
||||||
|
# endif
|
||||||
|
# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
|
||||||
|
_gl_verify_type<(R) ? 1 : -1>
|
||||||
|
# elif defined _GL_HAVE__STATIC_ASSERT
|
||||||
|
# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
|
||||||
|
struct { \
|
||||||
|
_Static_assert (R, DIAGNOSTIC); \
|
||||||
|
int _gl_dummy; \
|
||||||
|
}
|
||||||
|
# else
|
||||||
|
# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
|
||||||
|
struct { unsigned int _gl_verify_error_if_negative: (R) ? 1 : -1; }
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Verify requirement R at compile-time, as a declaration without a
|
||||||
|
trailing ';'. If R is false, fail at compile-time, preferably
|
||||||
|
with a diagnostic that includes the string-literal DIAGNOSTIC.
|
||||||
|
|
||||||
|
Unfortunately, unlike C11, this implementation must appear as an
|
||||||
|
ordinary declaration, and cannot appear inside struct { ... }. */
|
||||||
|
|
||||||
|
# ifdef _GL_HAVE__STATIC_ASSERT
|
||||||
|
# define _GL_VERIFY _Static_assert
|
||||||
|
# else
|
||||||
|
# define _GL_VERIFY(R, DIAGNOSTIC) \
|
||||||
|
extern int (*_GL_GENSYM (_gl_verify_function) (void)) \
|
||||||
|
[_GL_VERIFY_TRUE (R, DIAGNOSTIC)]
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h. */
|
||||||
|
# ifdef _GL_STATIC_ASSERT_H
|
||||||
|
# if !defined _GL_HAVE__STATIC_ASSERT && !defined _Static_assert
|
||||||
|
# define _Static_assert(R, DIAGNOSTIC) _GL_VERIFY (R, DIAGNOSTIC)
|
||||||
|
# endif
|
||||||
|
# if !defined _GL_HAVE_STATIC_ASSERT && !defined static_assert
|
||||||
|
# define static_assert _Static_assert /* C11 requires this #define. */
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* @assert.h omit start@ */
|
||||||
|
|
||||||
|
/* Each of these macros verifies that its argument R is nonzero. To
|
||||||
|
be portable, R should be an integer constant expression. Unlike
|
||||||
|
assert (R), there is no run-time overhead.
|
||||||
|
|
||||||
|
There are two macros, since no single macro can be used in all
|
||||||
|
contexts in C. verify_true (R) is for scalar contexts, including
|
||||||
|
integer constant expression contexts. verify (R) is for declaration
|
||||||
|
contexts, e.g., the top level. */
|
||||||
|
|
||||||
|
/* Verify requirement R at compile-time, as an integer constant expression.
|
||||||
|
Return 1. This is equivalent to verify_expr (R, 1).
|
||||||
|
|
||||||
|
verify_true is obsolescent; please use verify_expr instead. */
|
||||||
|
|
||||||
|
# define verify_true(R) _GL_VERIFY_TRUE (R, "verify_true (" #R ")")
|
||||||
|
|
||||||
|
/* Verify requirement R at compile-time. Return the value of the
|
||||||
|
expression E. */
|
||||||
|
|
||||||
|
# define verify_expr(R, E) \
|
||||||
|
(_GL_VERIFY_TRUE (R, "verify_expr (" #R ", " #E ")") ? (E) : (E))
|
||||||
|
|
||||||
|
/* Verify requirement R at compile-time, as a declaration without a
|
||||||
|
trailing ';'. */
|
||||||
|
|
||||||
|
# define verify(R) _GL_VERIFY (R, "verify (" #R ")")
|
||||||
|
|
||||||
|
/* @assert.h omit end@ */
|
||||||
|
|
||||||
|
#endif
|
||||||
70
lib/vsnprintf.c
Normal file
70
lib/vsnprintf.c
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
/* Formatted output to strings.
|
||||||
|
Copyright (C) 2004, 2006-2012 Free Software Foundation, Inc.
|
||||||
|
Written by Simon Josefsson and Yoann Vandoorselaere <yoann@prelude-ids.org>.
|
||||||
|
|
||||||
|
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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "vasnprintf.h"
|
||||||
|
|
||||||
|
/* Print formatted output to string STR. Similar to vsprintf, but
|
||||||
|
additional length SIZE limit how much is written into STR. Returns
|
||||||
|
string length of formatted string (which may be larger than SIZE).
|
||||||
|
STR may be NULL, in which case nothing will be written. On error,
|
||||||
|
return a negative value. */
|
||||||
|
int
|
||||||
|
vsnprintf (char *str, size_t size, const char *format, va_list args)
|
||||||
|
{
|
||||||
|
char *output;
|
||||||
|
size_t len;
|
||||||
|
size_t lenbuf = size;
|
||||||
|
|
||||||
|
output = vasnprintf (str, &lenbuf, format, args);
|
||||||
|
len = lenbuf;
|
||||||
|
|
||||||
|
if (!output)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (output != str)
|
||||||
|
{
|
||||||
|
if (size)
|
||||||
|
{
|
||||||
|
size_t pruned_len = (len < size ? len : size - 1);
|
||||||
|
memcpy (str, output, pruned_len);
|
||||||
|
str[pruned_len] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
free (output);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len > INT_MAX)
|
||||||
|
{
|
||||||
|
errno = EOVERFLOW;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
1028
lib/wchar.in.h
Normal file
1028
lib/wchar.in.h
Normal file
File diff suppressed because it is too large
Load diff
107
lib/xsize.h
Normal file
107
lib/xsize.h
Normal file
|
|
@ -0,0 +1,107 @@
|
||||||
|
/* xsize.h -- Checked size_t computations.
|
||||||
|
|
||||||
|
Copyright (C) 2003, 2008-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _XSIZE_H
|
||||||
|
#define _XSIZE_H
|
||||||
|
|
||||||
|
/* Get size_t. */
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* Get SIZE_MAX. */
|
||||||
|
#include <limits.h>
|
||||||
|
#if HAVE_STDINT_H
|
||||||
|
# include <stdint.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The size of memory objects is often computed through expressions of
|
||||||
|
type size_t. Example:
|
||||||
|
void* p = malloc (header_size + n * element_size).
|
||||||
|
These computations can lead to overflow. When this happens, malloc()
|
||||||
|
returns a piece of memory that is way too small, and the program then
|
||||||
|
crashes while attempting to fill the memory.
|
||||||
|
To avoid this, the functions and macros in this file check for overflow.
|
||||||
|
The convention is that SIZE_MAX represents overflow.
|
||||||
|
malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc
|
||||||
|
implementation that uses mmap --, it's recommended to use size_overflow_p()
|
||||||
|
or size_in_bounds_p() before invoking malloc().
|
||||||
|
The example thus becomes:
|
||||||
|
size_t size = xsum (header_size, xtimes (n, element_size));
|
||||||
|
void *p = (size_in_bounds_p (size) ? malloc (size) : NULL);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Convert an arbitrary value >= 0 to type size_t. */
|
||||||
|
#define xcast_size_t(N) \
|
||||||
|
((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX)
|
||||||
|
|
||||||
|
/* Sum of two sizes, with overflow check. */
|
||||||
|
static inline size_t
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
__attribute__ ((__pure__))
|
||||||
|
#endif
|
||||||
|
xsum (size_t size1, size_t size2)
|
||||||
|
{
|
||||||
|
size_t sum = size1 + size2;
|
||||||
|
return (sum >= size1 ? sum : SIZE_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sum of three sizes, with overflow check. */
|
||||||
|
static inline size_t
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
__attribute__ ((__pure__))
|
||||||
|
#endif
|
||||||
|
xsum3 (size_t size1, size_t size2, size_t size3)
|
||||||
|
{
|
||||||
|
return xsum (xsum (size1, size2), size3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sum of four sizes, with overflow check. */
|
||||||
|
static inline size_t
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
__attribute__ ((__pure__))
|
||||||
|
#endif
|
||||||
|
xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
|
||||||
|
{
|
||||||
|
return xsum (xsum (xsum (size1, size2), size3), size4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Maximum of two sizes, with overflow check. */
|
||||||
|
static inline size_t
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
__attribute__ ((__pure__))
|
||||||
|
#endif
|
||||||
|
xmax (size_t size1, size_t size2)
|
||||||
|
{
|
||||||
|
/* No explicit check is needed here, because for any n:
|
||||||
|
max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */
|
||||||
|
return (size1 >= size2 ? size1 : size2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Multiplication of a count with an element size, with overflow check.
|
||||||
|
The count must be >= 0 and the element size must be > 0.
|
||||||
|
This is a macro, not an inline function, so that it works correctly even
|
||||||
|
when N is of a wider type and N > SIZE_MAX. */
|
||||||
|
#define xtimes(N, ELSIZE) \
|
||||||
|
((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX)
|
||||||
|
|
||||||
|
/* Check for overflow. */
|
||||||
|
#define size_overflow_p(SIZE) \
|
||||||
|
((SIZE) == SIZE_MAX)
|
||||||
|
/* Check against overflow. */
|
||||||
|
#define size_in_bounds_p(SIZE) \
|
||||||
|
((SIZE) != SIZE_MAX)
|
||||||
|
|
||||||
|
#endif /* _XSIZE_H */
|
||||||
30
m4/00gnulib.m4
Normal file
30
m4/00gnulib.m4
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
# 00gnulib.m4 serial 2
|
||||||
|
dnl Copyright (C) 2009-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
dnl This file must be named something that sorts before all other
|
||||||
|
dnl gnulib-provided .m4 files. It is needed until such time as we can
|
||||||
|
dnl assume Autoconf 2.64, with its improved AC_DEFUN_ONCE semantics.
|
||||||
|
|
||||||
|
# AC_DEFUN_ONCE([NAME], VALUE)
|
||||||
|
# ----------------------------
|
||||||
|
# Define NAME to expand to VALUE on the first use (whether by direct
|
||||||
|
# expansion, or by AC_REQUIRE), and to nothing on all subsequent uses.
|
||||||
|
# Avoid bugs in AC_REQUIRE in Autoconf 2.63 and earlier. This
|
||||||
|
# definition is slower than the version in Autoconf 2.64, because it
|
||||||
|
# can only use interfaces that existed since 2.59; but it achieves the
|
||||||
|
# same effect. Quoting is necessary to avoid confusing Automake.
|
||||||
|
m4_version_prereq([2.63.263], [],
|
||||||
|
[m4_define([AC][_DEFUN_ONCE],
|
||||||
|
[AC][_DEFUN([$1],
|
||||||
|
[AC_REQUIRE([_gl_DEFUN_ONCE([$1])],
|
||||||
|
[m4_indir([_gl_DEFUN_ONCE([$1])])])])]dnl
|
||||||
|
[AC][_DEFUN([_gl_DEFUN_ONCE([$1])], [$2])])])
|
||||||
|
|
||||||
|
# gl_00GNULIB
|
||||||
|
# -----------
|
||||||
|
# Witness macro that this file has been included. Needed to force
|
||||||
|
# Automake to include this file prior to all other gnulib .m4 files.
|
||||||
|
AC_DEFUN([gl_00GNULIB])
|
||||||
121
m4/alloca.m4
Normal file
121
m4/alloca.m4
Normal file
|
|
@ -0,0 +1,121 @@
|
||||||
|
# alloca.m4 serial 14
|
||||||
|
dnl Copyright (C) 2002-2004, 2006-2007, 2009-2012 Free Software Foundation,
|
||||||
|
dnl Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FUNC_ALLOCA],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_FUNC_ALLOCA])
|
||||||
|
if test $ac_cv_func_alloca_works = no; then
|
||||||
|
gl_PREREQ_ALLOCA
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Define an additional variable used in the Makefile substitution.
|
||||||
|
if test $ac_cv_working_alloca_h = yes; then
|
||||||
|
AC_CACHE_CHECK([for alloca as a compiler built-in], [gl_cv_rpl_alloca], [
|
||||||
|
AC_EGREP_CPP([Need own alloca], [
|
||||||
|
#if defined __GNUC__ || defined _AIX || defined _MSC_VER
|
||||||
|
Need own alloca
|
||||||
|
#endif
|
||||||
|
], [gl_cv_rpl_alloca=yes], [gl_cv_rpl_alloca=no])
|
||||||
|
])
|
||||||
|
if test $gl_cv_rpl_alloca = yes; then
|
||||||
|
dnl OK, alloca can be implemented through a compiler built-in.
|
||||||
|
AC_DEFINE([HAVE_ALLOCA], [1],
|
||||||
|
[Define to 1 if you have 'alloca' after including <alloca.h>,
|
||||||
|
a header that may be supplied by this distribution.])
|
||||||
|
ALLOCA_H=alloca.h
|
||||||
|
else
|
||||||
|
dnl alloca exists as a library function, i.e. it is slow and probably
|
||||||
|
dnl a memory leak. Don't define HAVE_ALLOCA in this case.
|
||||||
|
ALLOCA_H=
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
ALLOCA_H=alloca.h
|
||||||
|
fi
|
||||||
|
AC_SUBST([ALLOCA_H])
|
||||||
|
AM_CONDITIONAL([GL_GENERATE_ALLOCA_H], [test -n "$ALLOCA_H"])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Prerequisites of lib/alloca.c.
|
||||||
|
# STACK_DIRECTION is already handled by AC_FUNC_ALLOCA.
|
||||||
|
AC_DEFUN([gl_PREREQ_ALLOCA], [:])
|
||||||
|
|
||||||
|
# This works around a bug in autoconf <= 2.68.
|
||||||
|
# See <http://lists.gnu.org/archive/html/bug-gnulib/2011-06/msg00277.html>.
|
||||||
|
|
||||||
|
m4_version_prereq([2.69], [] ,[
|
||||||
|
|
||||||
|
# This is taken from the following Autoconf patch:
|
||||||
|
# http://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=6cd9f12520b0d6f76d3230d7565feba1ecf29497
|
||||||
|
|
||||||
|
# _AC_LIBOBJ_ALLOCA
|
||||||
|
# -----------------
|
||||||
|
# Set up the LIBOBJ replacement of 'alloca'. Well, not exactly
|
||||||
|
# AC_LIBOBJ since we actually set the output variable 'ALLOCA'.
|
||||||
|
# Nevertheless, for Automake, AC_LIBSOURCES it.
|
||||||
|
m4_define([_AC_LIBOBJ_ALLOCA],
|
||||||
|
[# The SVR3 libPW and SVR4 libucb both contain incompatible functions
|
||||||
|
# that cause trouble. Some versions do not even contain alloca or
|
||||||
|
# contain a buggy version. If you still want to use their alloca,
|
||||||
|
# use ar to extract alloca.o from them instead of compiling alloca.c.
|
||||||
|
AC_LIBSOURCES(alloca.c)
|
||||||
|
AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])dnl
|
||||||
|
AC_DEFINE(C_ALLOCA, 1, [Define to 1 if using 'alloca.c'.])
|
||||||
|
|
||||||
|
AC_CACHE_CHECK(whether 'alloca.c' needs Cray hooks, ac_cv_os_cray,
|
||||||
|
[AC_EGREP_CPP(webecray,
|
||||||
|
[#if defined CRAY && ! defined CRAY2
|
||||||
|
webecray
|
||||||
|
#else
|
||||||
|
wenotbecray
|
||||||
|
#endif
|
||||||
|
], ac_cv_os_cray=yes, ac_cv_os_cray=no)])
|
||||||
|
if test $ac_cv_os_cray = yes; then
|
||||||
|
for ac_func in _getb67 GETB67 getb67; do
|
||||||
|
AC_CHECK_FUNC($ac_func,
|
||||||
|
[AC_DEFINE_UNQUOTED(CRAY_STACKSEG_END, $ac_func,
|
||||||
|
[Define to one of '_getb67', 'GETB67',
|
||||||
|
'getb67' for Cray-2 and Cray-YMP
|
||||||
|
systems. This function is required for
|
||||||
|
'alloca.c' support on those systems.])
|
||||||
|
break])
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_CACHE_CHECK([stack direction for C alloca],
|
||||||
|
[ac_cv_c_stack_direction],
|
||||||
|
[AC_RUN_IFELSE([AC_LANG_SOURCE(
|
||||||
|
[AC_INCLUDES_DEFAULT
|
||||||
|
int
|
||||||
|
find_stack_direction (int *addr, int depth)
|
||||||
|
{
|
||||||
|
int dir, dummy = 0;
|
||||||
|
if (! addr)
|
||||||
|
addr = &dummy;
|
||||||
|
*addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
|
||||||
|
dir = depth ? find_stack_direction (addr, depth - 1) : 0;
|
||||||
|
return dir + dummy;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
return find_stack_direction (0, argc + !argv + 20) < 0;
|
||||||
|
}])],
|
||||||
|
[ac_cv_c_stack_direction=1],
|
||||||
|
[ac_cv_c_stack_direction=-1],
|
||||||
|
[ac_cv_c_stack_direction=0])])
|
||||||
|
AH_VERBATIM([STACK_DIRECTION],
|
||||||
|
[/* If using the C implementation of alloca, define if you know the
|
||||||
|
direction of stack growth for your system; otherwise it will be
|
||||||
|
automatically deduced at runtime.
|
||||||
|
STACK_DIRECTION > 0 => grows toward higher addresses
|
||||||
|
STACK_DIRECTION < 0 => grows toward lower addresses
|
||||||
|
STACK_DIRECTION = 0 => direction of growth unknown */
|
||||||
|
@%:@undef STACK_DIRECTION])dnl
|
||||||
|
AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction)
|
||||||
|
])# _AC_LIBOBJ_ALLOCA
|
||||||
|
])
|
||||||
61
m4/argp.m4
Normal file
61
m4/argp.m4
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
# argp.m4 serial 14
|
||||||
|
dnl Copyright (C) 2003-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_ARGP],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_C_INLINE])
|
||||||
|
AC_REQUIRE([AC_C_RESTRICT])
|
||||||
|
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
||||||
|
|
||||||
|
AC_CHECK_DECLS([program_invocation_name], [],
|
||||||
|
[AC_DEFINE([GNULIB_PROGRAM_INVOCATION_NAME], [1],
|
||||||
|
[Define to 1 to add extern declaration of program_invocation_name to argp.h])],
|
||||||
|
[[#include <errno.h>]])
|
||||||
|
AC_CHECK_DECLS([program_invocation_short_name], [],
|
||||||
|
[AC_DEFINE([GNULIB_PROGRAM_INVOCATION_SHORT_NAME], [1],
|
||||||
|
[Define to 1 to add extern declaration of program_invocation_short_name to argp.h])],
|
||||||
|
[[#include <errno.h>]])
|
||||||
|
|
||||||
|
# Check if program_invocation_name and program_invocation_short_name
|
||||||
|
# are defined elsewhere. It is improbable that only one of them will
|
||||||
|
# be defined and other not, I prefer to stay on the safe side and to
|
||||||
|
# test each one separately.
|
||||||
|
AC_MSG_CHECKING([whether program_invocation_name is defined])
|
||||||
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <argp.h>]],
|
||||||
|
[[program_invocation_name = "test";]])],
|
||||||
|
[AC_DEFINE([HAVE_PROGRAM_INVOCATION_NAME], [1],
|
||||||
|
[Define if program_invocation_name is defined])
|
||||||
|
AC_MSG_RESULT([yes])],
|
||||||
|
[AC_MSG_RESULT([no])])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([whether program_invocation_short_name is defined])
|
||||||
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <argp.h>]],
|
||||||
|
[[program_invocation_short_name = "test";]])],
|
||||||
|
[AC_DEFINE([HAVE_PROGRAM_INVOCATION_SHORT_NAME], [1],
|
||||||
|
[Define if program_invocation_short_name is defined])
|
||||||
|
AC_MSG_RESULT([yes])],
|
||||||
|
[AC_MSG_RESULT([no])])
|
||||||
|
|
||||||
|
AC_CHECK_DECLS_ONCE([clearerr_unlocked])
|
||||||
|
AC_CHECK_DECLS_ONCE([feof_unlocked])
|
||||||
|
AC_CHECK_DECLS_ONCE([ferror_unlocked])
|
||||||
|
AC_CHECK_DECLS_ONCE([fflush_unlocked])
|
||||||
|
AC_CHECK_DECLS_ONCE([fgets_unlocked])
|
||||||
|
AC_CHECK_DECLS_ONCE([fputc_unlocked])
|
||||||
|
AC_CHECK_DECLS_ONCE([fputs_unlocked])
|
||||||
|
AC_CHECK_DECLS_ONCE([fread_unlocked])
|
||||||
|
AC_CHECK_DECLS_ONCE([fwrite_unlocked])
|
||||||
|
AC_CHECK_DECLS_ONCE([getc_unlocked])
|
||||||
|
AC_CHECK_DECLS_ONCE([getchar_unlocked])
|
||||||
|
AC_CHECK_DECLS_ONCE([putc_unlocked])
|
||||||
|
AC_CHECK_DECLS_ONCE([putchar_unlocked])
|
||||||
|
AC_CHECK_FUNCS_ONCE([flockfile funlockfile])
|
||||||
|
AC_CHECK_HEADERS_ONCE([features.h linewrap.h])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl argp-parse.c depends on GNU getopt internals, therefore use GNU getopt
|
||||||
|
dnl always.
|
||||||
|
AC_DEFUN([gl_REPLACE_GETOPT_ALWAYS], [])
|
||||||
19
m4/dirname.m4
Normal file
19
m4/dirname.m4
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
#serial 10 -*- autoconf -*-
|
||||||
|
dnl Copyright (C) 2002-2006, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_DIRNAME],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_DIRNAME_LGPL])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_DIRNAME_LGPL],
|
||||||
|
[
|
||||||
|
dnl Prerequisites of lib/dirname.h.
|
||||||
|
AC_REQUIRE([gl_DOUBLE_SLASH_ROOT])
|
||||||
|
|
||||||
|
dnl No prerequisites of lib/basename-lgpl.c, lib/dirname-lgpl.c,
|
||||||
|
dnl lib/stripslash.c.
|
||||||
|
])
|
||||||
38
m4/double-slash-root.m4
Normal file
38
m4/double-slash-root.m4
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
# double-slash-root.m4 serial 4 -*- Autoconf -*-
|
||||||
|
dnl Copyright (C) 2006, 2008-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_DOUBLE_SLASH_ROOT],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
|
AC_CACHE_CHECK([whether // is distinct from /], [gl_cv_double_slash_root],
|
||||||
|
[ if test x"$cross_compiling" = xyes ; then
|
||||||
|
# When cross-compiling, there is no way to tell whether // is special
|
||||||
|
# short of a list of hosts. However, the only known hosts to date
|
||||||
|
# that have a distinct // are Apollo DomainOS (too old to port to),
|
||||||
|
# Cygwin, and z/OS. If anyone knows of another system for which // has
|
||||||
|
# special semantics and is distinct from /, please report it to
|
||||||
|
# <bug-gnulib@gnu.org>.
|
||||||
|
case $host in
|
||||||
|
*-cygwin | i370-ibm-openedition)
|
||||||
|
gl_cv_double_slash_root=yes ;;
|
||||||
|
*)
|
||||||
|
# Be optimistic and assume that / and // are the same when we
|
||||||
|
# don't know.
|
||||||
|
gl_cv_double_slash_root='unknown, assuming no' ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
set x `ls -di / // 2>/dev/null`
|
||||||
|
if test "$[2]" = "$[4]" && wc //dev/null >/dev/null 2>&1; then
|
||||||
|
gl_cv_double_slash_root=no
|
||||||
|
else
|
||||||
|
gl_cv_double_slash_root=yes
|
||||||
|
fi
|
||||||
|
fi])
|
||||||
|
if test "$gl_cv_double_slash_root" = yes; then
|
||||||
|
AC_DEFINE([DOUBLE_SLASH_IS_DISTINCT_ROOT], [1],
|
||||||
|
[Define to 1 if // is a file system root distinct from /.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
134
m4/errno_h.m4
Normal file
134
m4/errno_h.m4
Normal file
|
|
@ -0,0 +1,134 @@
|
||||||
|
# errno_h.m4 serial 11
|
||||||
|
dnl Copyright (C) 2004, 2006, 2008-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
AC_DEFUN_ONCE([gl_HEADER_ERRNO_H],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_CACHE_CHECK([for complete errno.h], [gl_cv_header_errno_h_complete], [
|
||||||
|
AC_EGREP_CPP([booboo],[
|
||||||
|
#include <errno.h>
|
||||||
|
#if !defined ETXTBSY
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined ENOMSG
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined EIDRM
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined ENOLINK
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined EPROTO
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined EMULTIHOP
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined EBADMSG
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined EOVERFLOW
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined ENOTSUP
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined ENETRESET
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined ECONNABORTED
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined ESTALE
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined EDQUOT
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined ECANCELED
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined EOWNERDEAD
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
#if !defined ENOTRECOVERABLE
|
||||||
|
booboo
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
[gl_cv_header_errno_h_complete=no],
|
||||||
|
[gl_cv_header_errno_h_complete=yes])
|
||||||
|
])
|
||||||
|
if test $gl_cv_header_errno_h_complete = yes; then
|
||||||
|
ERRNO_H=''
|
||||||
|
else
|
||||||
|
gl_NEXT_HEADERS([errno.h])
|
||||||
|
ERRNO_H='errno.h'
|
||||||
|
fi
|
||||||
|
AC_SUBST([ERRNO_H])
|
||||||
|
AM_CONDITIONAL([GL_GENERATE_ERRNO_H], [test -n "$ERRNO_H"])
|
||||||
|
gl_REPLACE_ERRNO_VALUE([EMULTIHOP])
|
||||||
|
gl_REPLACE_ERRNO_VALUE([ENOLINK])
|
||||||
|
gl_REPLACE_ERRNO_VALUE([EOVERFLOW])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Assuming $1 = EOVERFLOW.
|
||||||
|
# The EOVERFLOW errno value ought to be defined in <errno.h>, according to
|
||||||
|
# POSIX. But some systems (like OpenBSD 4.0 or AIX 3) don't define it, and
|
||||||
|
# some systems (like OSF/1) define it when _XOPEN_SOURCE_EXTENDED is defined.
|
||||||
|
# Check for the value of EOVERFLOW.
|
||||||
|
# Set the variables EOVERFLOW_HIDDEN and EOVERFLOW_VALUE.
|
||||||
|
AC_DEFUN([gl_REPLACE_ERRNO_VALUE],
|
||||||
|
[
|
||||||
|
if test -n "$ERRNO_H"; then
|
||||||
|
AC_CACHE_CHECK([for ]$1[ value], [gl_cv_header_errno_h_]$1, [
|
||||||
|
AC_EGREP_CPP([yes],[
|
||||||
|
#include <errno.h>
|
||||||
|
#ifdef ]$1[
|
||||||
|
yes
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
[gl_cv_header_errno_h_]$1[=yes],
|
||||||
|
[gl_cv_header_errno_h_]$1[=no])
|
||||||
|
if test $gl_cv_header_errno_h_]$1[ = no; then
|
||||||
|
AC_EGREP_CPP([yes],[
|
||||||
|
#define _XOPEN_SOURCE_EXTENDED 1
|
||||||
|
#include <errno.h>
|
||||||
|
#ifdef ]$1[
|
||||||
|
yes
|
||||||
|
#endif
|
||||||
|
], [gl_cv_header_errno_h_]$1[=hidden])
|
||||||
|
if test $gl_cv_header_errno_h_]$1[ = hidden; then
|
||||||
|
dnl The macro exists but is hidden.
|
||||||
|
dnl Define it to the same value.
|
||||||
|
AC_COMPUTE_INT([gl_cv_header_errno_h_]$1, $1, [
|
||||||
|
#define _XOPEN_SOURCE_EXTENDED 1
|
||||||
|
#include <errno.h>
|
||||||
|
/* The following two lines are a workaround against an autoconf-2.52 bug. */
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
case $gl_cv_header_errno_h_]$1[ in
|
||||||
|
yes | no)
|
||||||
|
]$1[_HIDDEN=0; ]$1[_VALUE=
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
]$1[_HIDDEN=1; ]$1[_VALUE="$gl_cv_header_errno_h_]$1["
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
AC_SUBST($1[_HIDDEN])
|
||||||
|
AC_SUBST($1[_VALUE])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in.
|
||||||
|
dnl Remove this when we can assume autoconf >= 2.61.
|
||||||
|
m4_ifdef([AC_COMPUTE_INT], [], [
|
||||||
|
AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])])
|
||||||
|
])
|
||||||
116
m4/exponentd.m4
Normal file
116
m4/exponentd.m4
Normal file
|
|
@ -0,0 +1,116 @@
|
||||||
|
# exponentd.m4 serial 3
|
||||||
|
dnl Copyright (C) 2007-2008, 2010-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
AC_DEFUN([gl_DOUBLE_EXPONENT_LOCATION],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([where to find the exponent in a 'double'],
|
||||||
|
[gl_cv_cc_double_expbit0],
|
||||||
|
[
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#include <float.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#define NWORDS \
|
||||||
|
((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
|
||||||
|
typedef union { double value; unsigned int word[NWORDS]; } memory_double;
|
||||||
|
static unsigned int ored_words[NWORDS];
|
||||||
|
static unsigned int anded_words[NWORDS];
|
||||||
|
static void add_to_ored_words (double x)
|
||||||
|
{
|
||||||
|
memory_double m;
|
||||||
|
size_t i;
|
||||||
|
/* Clear it first, in case sizeof (double) < sizeof (memory_double). */
|
||||||
|
memset (&m, 0, sizeof (memory_double));
|
||||||
|
m.value = x;
|
||||||
|
for (i = 0; i < NWORDS; i++)
|
||||||
|
{
|
||||||
|
ored_words[i] |= m.word[i];
|
||||||
|
anded_words[i] &= m.word[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
size_t j;
|
||||||
|
FILE *fp = fopen ("conftest.out", "w");
|
||||||
|
if (fp == NULL)
|
||||||
|
return 1;
|
||||||
|
for (j = 0; j < NWORDS; j++)
|
||||||
|
anded_words[j] = ~ (unsigned int) 0;
|
||||||
|
add_to_ored_words (0.25);
|
||||||
|
add_to_ored_words (0.5);
|
||||||
|
add_to_ored_words (1.0);
|
||||||
|
add_to_ored_words (2.0);
|
||||||
|
add_to_ored_words (4.0);
|
||||||
|
/* Remove bits that are common (e.g. if representation of the first mantissa
|
||||||
|
bit is explicit). */
|
||||||
|
for (j = 0; j < NWORDS; j++)
|
||||||
|
ored_words[j] &= ~anded_words[j];
|
||||||
|
/* Now find the nonzero word. */
|
||||||
|
for (j = 0; j < NWORDS; j++)
|
||||||
|
if (ored_words[j] != 0)
|
||||||
|
break;
|
||||||
|
if (j < NWORDS)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = j + 1; i < NWORDS; i++)
|
||||||
|
if (ored_words[i] != 0)
|
||||||
|
{
|
||||||
|
fprintf (fp, "unknown");
|
||||||
|
return (fclose (fp) != 0);
|
||||||
|
}
|
||||||
|
for (i = 0; ; i++)
|
||||||
|
if ((ored_words[j] >> i) & 1)
|
||||||
|
{
|
||||||
|
fprintf (fp, "word %d bit %d", (int) j, (int) i);
|
||||||
|
return (fclose (fp) != 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf (fp, "unknown");
|
||||||
|
return (fclose (fp) != 0);
|
||||||
|
}
|
||||||
|
]])],
|
||||||
|
[gl_cv_cc_double_expbit0=`cat conftest.out`],
|
||||||
|
[gl_cv_cc_double_expbit0="unknown"],
|
||||||
|
[
|
||||||
|
dnl On ARM, there are two 'double' floating-point formats, used by
|
||||||
|
dnl different sets of instructions: The older FPA instructions assume
|
||||||
|
dnl that they are stored in big-endian word order, while the words
|
||||||
|
dnl (like integer types) are stored in little-endian byte order.
|
||||||
|
dnl The newer VFP instructions assume little-endian order
|
||||||
|
dnl consistently.
|
||||||
|
AC_EGREP_CPP([mixed_endianness], [
|
||||||
|
#if defined arm || defined __arm || defined __arm__
|
||||||
|
mixed_endianness
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
[gl_cv_cc_double_expbit0="unknown"],
|
||||||
|
[
|
||||||
|
pushdef([AC_MSG_CHECKING],[:])dnl
|
||||||
|
pushdef([AC_MSG_RESULT],[:])dnl
|
||||||
|
pushdef([AC_MSG_RESULT_UNQUOTED],[:])dnl
|
||||||
|
AC_C_BIGENDIAN(
|
||||||
|
[gl_cv_cc_double_expbit0="word 0 bit 20"],
|
||||||
|
[gl_cv_cc_double_expbit0="word 1 bit 20"],
|
||||||
|
[gl_cv_cc_double_expbit0="unknown"])
|
||||||
|
popdef([AC_MSG_RESULT_UNQUOTED])dnl
|
||||||
|
popdef([AC_MSG_RESULT])dnl
|
||||||
|
popdef([AC_MSG_CHECKING])dnl
|
||||||
|
])
|
||||||
|
])
|
||||||
|
rm -f conftest.out
|
||||||
|
])
|
||||||
|
case "$gl_cv_cc_double_expbit0" in
|
||||||
|
word*bit*)
|
||||||
|
word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
|
||||||
|
bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'`
|
||||||
|
AC_DEFINE_UNQUOTED([DBL_EXPBIT0_WORD], [$word],
|
||||||
|
[Define as the word index where to find the exponent of 'double'.])
|
||||||
|
AC_DEFINE_UNQUOTED([DBL_EXPBIT0_BIT], [$bit],
|
||||||
|
[Define as the bit index in the word where to find bit 0 of the exponent of 'double'.])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
123
m4/extensions.m4
Normal file
123
m4/extensions.m4
Normal file
|
|
@ -0,0 +1,123 @@
|
||||||
|
# serial 12 -*- Autoconf -*-
|
||||||
|
# Enable extensions on systems that normally disable them.
|
||||||
|
|
||||||
|
# Copyright (C) 2003, 2006-2012 Free Software Foundation, Inc.
|
||||||
|
# This file is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This definition of AC_USE_SYSTEM_EXTENSIONS is stolen from CVS
|
||||||
|
# Autoconf. Perhaps we can remove this once we can assume Autoconf
|
||||||
|
# 2.62 or later everywhere, but since CVS Autoconf mutates rapidly
|
||||||
|
# enough in this area it's likely we'll need to redefine
|
||||||
|
# AC_USE_SYSTEM_EXTENSIONS for quite some time.
|
||||||
|
|
||||||
|
# If autoconf reports a warning
|
||||||
|
# warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
|
||||||
|
# or warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
|
||||||
|
# the fix is
|
||||||
|
# 1) to ensure that AC_USE_SYSTEM_EXTENSIONS is never directly invoked
|
||||||
|
# but always AC_REQUIREd,
|
||||||
|
# 2) to ensure that for each occurrence of
|
||||||
|
# AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
|
||||||
|
# or
|
||||||
|
# AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
||||||
|
# the corresponding gnulib module description has 'extensions' among
|
||||||
|
# its dependencies. This will ensure that the gl_USE_SYSTEM_EXTENSIONS
|
||||||
|
# invocation occurs in gl_EARLY, not in gl_INIT.
|
||||||
|
|
||||||
|
# AC_USE_SYSTEM_EXTENSIONS
|
||||||
|
# ------------------------
|
||||||
|
# Enable extensions on systems that normally disable them,
|
||||||
|
# typically due to standards-conformance issues.
|
||||||
|
# Remember that #undef in AH_VERBATIM gets replaced with #define by
|
||||||
|
# AC_DEFINE. The goal here is to define all known feature-enabling
|
||||||
|
# macros, then, if reports of conflicts are made, disable macros that
|
||||||
|
# cause problems on some platforms (such as __EXTENSIONS__).
|
||||||
|
AC_DEFUN_ONCE([AC_USE_SYSTEM_EXTENSIONS],
|
||||||
|
[AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
|
||||||
|
AC_BEFORE([$0], [AC_RUN_IFELSE])dnl
|
||||||
|
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
|
|
||||||
|
AC_CHECK_HEADER([minix/config.h], [MINIX=yes], [MINIX=])
|
||||||
|
if test "$MINIX" = yes; then
|
||||||
|
AC_DEFINE([_POSIX_SOURCE], [1],
|
||||||
|
[Define to 1 if you need to in order for 'stat' and other
|
||||||
|
things to work.])
|
||||||
|
AC_DEFINE([_POSIX_1_SOURCE], [2],
|
||||||
|
[Define to 2 if the system does not provide POSIX.1 features
|
||||||
|
except with this defined.])
|
||||||
|
AC_DEFINE([_MINIX], [1],
|
||||||
|
[Define to 1 if on MINIX.])
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl HP-UX 11.11 defines mbstate_t only if _XOPEN_SOURCE is defined to 500,
|
||||||
|
dnl regardless of whether the flags -Ae or _D_HPUX_SOURCE=1 are already
|
||||||
|
dnl provided.
|
||||||
|
case "$host_os" in
|
||||||
|
hpux*)
|
||||||
|
AC_DEFINE([_XOPEN_SOURCE], [500],
|
||||||
|
[Define to 500 only on HP-UX.])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
AH_VERBATIM([__EXTENSIONS__],
|
||||||
|
[/* Enable extensions on AIX 3, Interix. */
|
||||||
|
#ifndef _ALL_SOURCE
|
||||||
|
# undef _ALL_SOURCE
|
||||||
|
#endif
|
||||||
|
/* Enable general extensions on Mac OS X. */
|
||||||
|
#ifndef _DARWIN_C_SOURCE
|
||||||
|
# undef _DARWIN_C_SOURCE
|
||||||
|
#endif
|
||||||
|
/* Enable GNU extensions on systems that have them. */
|
||||||
|
#ifndef _GNU_SOURCE
|
||||||
|
# undef _GNU_SOURCE
|
||||||
|
#endif
|
||||||
|
/* Enable threading extensions on Solaris. */
|
||||||
|
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||||
|
# undef _POSIX_PTHREAD_SEMANTICS
|
||||||
|
#endif
|
||||||
|
/* Enable extensions on HP NonStop. */
|
||||||
|
#ifndef _TANDEM_SOURCE
|
||||||
|
# undef _TANDEM_SOURCE
|
||||||
|
#endif
|
||||||
|
/* Enable general extensions on Solaris. */
|
||||||
|
#ifndef __EXTENSIONS__
|
||||||
|
# undef __EXTENSIONS__
|
||||||
|
#endif
|
||||||
|
])
|
||||||
|
AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__],
|
||||||
|
[ac_cv_safe_to_define___extensions__],
|
||||||
|
[AC_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([[
|
||||||
|
# define __EXTENSIONS__ 1
|
||||||
|
]AC_INCLUDES_DEFAULT])],
|
||||||
|
[ac_cv_safe_to_define___extensions__=yes],
|
||||||
|
[ac_cv_safe_to_define___extensions__=no])])
|
||||||
|
test $ac_cv_safe_to_define___extensions__ = yes &&
|
||||||
|
AC_DEFINE([__EXTENSIONS__])
|
||||||
|
AC_DEFINE([_ALL_SOURCE])
|
||||||
|
AC_DEFINE([_DARWIN_C_SOURCE])
|
||||||
|
AC_DEFINE([_GNU_SOURCE])
|
||||||
|
AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
|
||||||
|
AC_DEFINE([_TANDEM_SOURCE])
|
||||||
|
])# AC_USE_SYSTEM_EXTENSIONS
|
||||||
|
|
||||||
|
# gl_USE_SYSTEM_EXTENSIONS
|
||||||
|
# ------------------------
|
||||||
|
# Enable extensions on systems that normally disable them,
|
||||||
|
# typically due to standards-conformance issues.
|
||||||
|
AC_DEFUN_ONCE([gl_USE_SYSTEM_EXTENSIONS],
|
||||||
|
[
|
||||||
|
dnl Require this macro before AC_USE_SYSTEM_EXTENSIONS.
|
||||||
|
dnl gnulib does not need it. But if it gets required by third-party macros
|
||||||
|
dnl after AC_USE_SYSTEM_EXTENSIONS is required, autoconf 2.62..2.63 emit a
|
||||||
|
dnl warning: "AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS".
|
||||||
|
dnl Note: We can do this only for one of the macros AC_AIX, AC_GNU_SOURCE,
|
||||||
|
dnl AC_MINIX. If people still use AC_AIX or AC_MINIX, they are out of luck.
|
||||||
|
AC_REQUIRE([AC_GNU_SOURCE])
|
||||||
|
|
||||||
|
AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
|
||||||
|
])
|
||||||
98
m4/float_h.m4
Normal file
98
m4/float_h.m4
Normal file
|
|
@ -0,0 +1,98 @@
|
||||||
|
# float_h.m4 serial 9
|
||||||
|
dnl Copyright (C) 2007, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FLOAT_H],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
|
FLOAT_H=
|
||||||
|
REPLACE_FLOAT_LDBL=0
|
||||||
|
case "$host_os" in
|
||||||
|
aix* | beos* | openbsd* | mirbsd* | irix*)
|
||||||
|
FLOAT_H=float.h
|
||||||
|
;;
|
||||||
|
freebsd*)
|
||||||
|
case "$host_cpu" in
|
||||||
|
changequote(,)dnl
|
||||||
|
i[34567]86 )
|
||||||
|
changequote([,])dnl
|
||||||
|
FLOAT_H=float.h
|
||||||
|
;;
|
||||||
|
x86_64 )
|
||||||
|
# On x86_64 systems, the C compiler may still be generating
|
||||||
|
# 32-bit code.
|
||||||
|
AC_EGREP_CPP([yes],
|
||||||
|
[#if defined __LP64__ || defined __x86_64__ || defined __amd64__
|
||||||
|
yes
|
||||||
|
#endif],
|
||||||
|
[],
|
||||||
|
[FLOAT_H=float.h])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
linux*)
|
||||||
|
case "$host_cpu" in
|
||||||
|
powerpc*)
|
||||||
|
FLOAT_H=float.h
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case "$host_os" in
|
||||||
|
aix* | freebsd* | linux*)
|
||||||
|
if test -n "$FLOAT_H"; then
|
||||||
|
REPLACE_FLOAT_LDBL=1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
dnl Test against glibc-2.7 Linux/SPARC64 bug.
|
||||||
|
REPLACE_ITOLD=0
|
||||||
|
AC_CACHE_CHECK([whether conversion from 'int' to 'long double' works],
|
||||||
|
[gl_cv_func_itold_works],
|
||||||
|
[
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
int i = -1;
|
||||||
|
volatile long double ld;
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
ld += i * 1.0L;
|
||||||
|
if (ld > 0)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}]])],
|
||||||
|
[gl_cv_func_itold_works=yes],
|
||||||
|
[gl_cv_func_itold_works=no],
|
||||||
|
[case "$host" in
|
||||||
|
sparc*-*-linux*)
|
||||||
|
AC_EGREP_CPP([yes],
|
||||||
|
[#if defined __LP64__ || defined __arch64__
|
||||||
|
yes
|
||||||
|
#endif],
|
||||||
|
[gl_cv_func_itold_works="guessing no"],
|
||||||
|
[gl_cv_func_itold_works="guessing yes"])
|
||||||
|
;;
|
||||||
|
*) gl_cv_func_itold_works="guessing yes" ;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
])
|
||||||
|
case "$gl_cv_func_itold_works" in
|
||||||
|
*no)
|
||||||
|
REPLACE_ITOLD=1
|
||||||
|
dnl We add the workaround to <float.h> but also to <math.h>,
|
||||||
|
dnl to increase the chances that the fix function gets pulled in.
|
||||||
|
FLOAT_H=float.h
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test -n "$FLOAT_H"; then
|
||||||
|
gl_NEXT_HEADERS([float.h])
|
||||||
|
fi
|
||||||
|
AC_SUBST([FLOAT_H])
|
||||||
|
AM_CONDITIONAL([GL_GENERATE_FLOAT_H], [test -n "$FLOAT_H"])
|
||||||
|
AC_SUBST([REPLACE_ITOLD])
|
||||||
|
])
|
||||||
368
m4/getopt.m4
Normal file
368
m4/getopt.m4
Normal file
|
|
@ -0,0 +1,368 @@
|
||||||
|
# getopt.m4 serial 44
|
||||||
|
dnl Copyright (C) 2002-2006, 2008-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# Request a POSIX compliant getopt function.
|
||||||
|
AC_DEFUN([gl_FUNC_GETOPT_POSIX],
|
||||||
|
[
|
||||||
|
m4_divert_text([DEFAULTS], [gl_getopt_required=POSIX])
|
||||||
|
AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
|
||||||
|
AC_REQUIRE([gl_GETOPT_CHECK_HEADERS])
|
||||||
|
dnl Other modules can request the gnulib implementation of the getopt
|
||||||
|
dnl functions unconditionally, by defining gl_REPLACE_GETOPT_ALWAYS.
|
||||||
|
dnl argp.m4 does this.
|
||||||
|
m4_ifdef([gl_REPLACE_GETOPT_ALWAYS], [
|
||||||
|
REPLACE_GETOPT=1
|
||||||
|
], [
|
||||||
|
REPLACE_GETOPT=0
|
||||||
|
if test -n "$gl_replace_getopt"; then
|
||||||
|
REPLACE_GETOPT=1
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
if test $REPLACE_GETOPT = 1; then
|
||||||
|
dnl Arrange for getopt.h to be created.
|
||||||
|
gl_GETOPT_SUBSTITUTE_HEADER
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# Request a POSIX compliant getopt function with GNU extensions (such as
|
||||||
|
# options with optional arguments) and the functions getopt_long,
|
||||||
|
# getopt_long_only.
|
||||||
|
AC_DEFUN([gl_FUNC_GETOPT_GNU],
|
||||||
|
[
|
||||||
|
m4_divert_text([INIT_PREPARE], [gl_getopt_required=GNU])
|
||||||
|
|
||||||
|
AC_REQUIRE([gl_FUNC_GETOPT_POSIX])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Determine whether to replace the entire getopt facility.
|
||||||
|
AC_DEFUN([gl_GETOPT_CHECK_HEADERS],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
||||||
|
AC_REQUIRE([AC_PROG_AWK]) dnl for awk that supports ENVIRON
|
||||||
|
|
||||||
|
dnl Persuade Solaris <unistd.h> to declare optarg, optind, opterr, optopt.
|
||||||
|
AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
|
||||||
|
|
||||||
|
gl_CHECK_NEXT_HEADERS([getopt.h])
|
||||||
|
if test $ac_cv_header_getopt_h = yes; then
|
||||||
|
HAVE_GETOPT_H=1
|
||||||
|
else
|
||||||
|
HAVE_GETOPT_H=0
|
||||||
|
fi
|
||||||
|
AC_SUBST([HAVE_GETOPT_H])
|
||||||
|
|
||||||
|
gl_replace_getopt=
|
||||||
|
|
||||||
|
dnl Test whether <getopt.h> is available.
|
||||||
|
if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
|
||||||
|
AC_CHECK_HEADERS([getopt.h], [], [gl_replace_getopt=yes])
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Test whether the function getopt_long is available.
|
||||||
|
if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
|
||||||
|
AC_CHECK_FUNCS([getopt_long_only], [], [gl_replace_getopt=yes])
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl POSIX 2008 does not specify leading '+' behavior, but see
|
||||||
|
dnl http://austingroupbugs.net/view.php?id=191 for a recommendation on
|
||||||
|
dnl the next version of POSIX. For now, we only guarantee leading '+'
|
||||||
|
dnl behavior with getopt-gnu.
|
||||||
|
if test -z "$gl_replace_getopt"; then
|
||||||
|
AC_CACHE_CHECK([whether getopt is POSIX compatible],
|
||||||
|
[gl_cv_func_getopt_posix],
|
||||||
|
[
|
||||||
|
dnl Merging these three different test programs into a single one
|
||||||
|
dnl would require a reset mechanism. On BSD systems, it can be done
|
||||||
|
dnl through 'optreset'; on some others (glibc), it can be done by
|
||||||
|
dnl setting 'optind' to 0; on others again (HP-UX, IRIX, OSF/1,
|
||||||
|
dnl Solaris 9, musl libc), there is no such mechanism.
|
||||||
|
if test $cross_compiling = no; then
|
||||||
|
dnl Sanity check. Succeeds everywhere (except on MSVC,
|
||||||
|
dnl which lacks <unistd.h> and getopt() entirely).
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
static char program[] = "program";
|
||||||
|
static char a[] = "-a";
|
||||||
|
static char foo[] = "foo";
|
||||||
|
static char bar[] = "bar";
|
||||||
|
char *argv[] = { program, a, foo, bar, NULL };
|
||||||
|
int c;
|
||||||
|
|
||||||
|
c = getopt (4, argv, "ab");
|
||||||
|
if (!(c == 'a'))
|
||||||
|
return 1;
|
||||||
|
c = getopt (4, argv, "ab");
|
||||||
|
if (!(c == -1))
|
||||||
|
return 2;
|
||||||
|
if (!(optind == 2))
|
||||||
|
return 3;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
]])],
|
||||||
|
[gl_cv_func_getopt_posix=maybe],
|
||||||
|
[gl_cv_func_getopt_posix=no])
|
||||||
|
if test $gl_cv_func_getopt_posix = maybe; then
|
||||||
|
dnl Sanity check with '+'. Succeeds everywhere (except on MSVC,
|
||||||
|
dnl which lacks <unistd.h> and getopt() entirely).
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
static char program[] = "program";
|
||||||
|
static char donald[] = "donald";
|
||||||
|
static char p[] = "-p";
|
||||||
|
static char billy[] = "billy";
|
||||||
|
static char duck[] = "duck";
|
||||||
|
static char a[] = "-a";
|
||||||
|
static char bar[] = "bar";
|
||||||
|
char *argv[] = { program, donald, p, billy, duck, a, bar, NULL };
|
||||||
|
int c;
|
||||||
|
|
||||||
|
c = getopt (7, argv, "+abp:q:");
|
||||||
|
if (!(c == -1))
|
||||||
|
return 4;
|
||||||
|
if (!(strcmp (argv[0], "program") == 0))
|
||||||
|
return 5;
|
||||||
|
if (!(strcmp (argv[1], "donald") == 0))
|
||||||
|
return 6;
|
||||||
|
if (!(strcmp (argv[2], "-p") == 0))
|
||||||
|
return 7;
|
||||||
|
if (!(strcmp (argv[3], "billy") == 0))
|
||||||
|
return 8;
|
||||||
|
if (!(strcmp (argv[4], "duck") == 0))
|
||||||
|
return 9;
|
||||||
|
if (!(strcmp (argv[5], "-a") == 0))
|
||||||
|
return 10;
|
||||||
|
if (!(strcmp (argv[6], "bar") == 0))
|
||||||
|
return 11;
|
||||||
|
if (!(optind == 1))
|
||||||
|
return 12;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
]])],
|
||||||
|
[gl_cv_func_getopt_posix=maybe],
|
||||||
|
[gl_cv_func_getopt_posix=no])
|
||||||
|
fi
|
||||||
|
if test $gl_cv_func_getopt_posix = maybe; then
|
||||||
|
dnl Detect Mac OS X 10.5, AIX 7.1, mingw bug.
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
static char program[] = "program";
|
||||||
|
static char ab[] = "-ab";
|
||||||
|
char *argv[3] = { program, ab, NULL };
|
||||||
|
if (getopt (2, argv, "ab:") != 'a')
|
||||||
|
return 13;
|
||||||
|
if (getopt (2, argv, "ab:") != '?')
|
||||||
|
return 14;
|
||||||
|
if (optopt != 'b')
|
||||||
|
return 15;
|
||||||
|
if (optind != 2)
|
||||||
|
return 16;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
]])],
|
||||||
|
[gl_cv_func_getopt_posix=yes],
|
||||||
|
[gl_cv_func_getopt_posix=no])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
case "$host_os" in
|
||||||
|
darwin* | aix* | mingw*) gl_cv_func_getopt_posix="guessing no";;
|
||||||
|
*) gl_cv_func_getopt_posix="guessing yes";;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
case "$gl_cv_func_getopt_posix" in
|
||||||
|
*no) gl_replace_getopt=yes ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
|
||||||
|
AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_getopt_gnu],
|
||||||
|
[# Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the
|
||||||
|
# optstring is necessary for programs like m4 that have POSIX-mandated
|
||||||
|
# semantics for supporting options interspersed with files.
|
||||||
|
# Also, since getopt_long is a GNU extension, we require optind=0.
|
||||||
|
# Bash ties 'set -o posix' to a non-exported POSIXLY_CORRECT;
|
||||||
|
# so take care to revert to the correct (non-)export state.
|
||||||
|
dnl GNU Coding Standards currently allow awk but not env; besides, env
|
||||||
|
dnl is ambiguous with environment values that contain newlines.
|
||||||
|
gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }'
|
||||||
|
case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" </dev/null` in
|
||||||
|
xx) gl_had_POSIXLY_CORRECT=exported ;;
|
||||||
|
x) gl_had_POSIXLY_CORRECT=yes ;;
|
||||||
|
*) gl_had_POSIXLY_CORRECT= ;;
|
||||||
|
esac
|
||||||
|
POSIXLY_CORRECT=1
|
||||||
|
export POSIXLY_CORRECT
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([[#include <getopt.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
]GL_NOCRASH[
|
||||||
|
]], [[
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
nocrash_init();
|
||||||
|
|
||||||
|
/* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw,
|
||||||
|
and fails on Mac OS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5,
|
||||||
|
OSF/1 5.1, Solaris 10. */
|
||||||
|
{
|
||||||
|
static char conftest[] = "conftest";
|
||||||
|
static char plus[] = "-+";
|
||||||
|
char *argv[3] = { conftest, plus, NULL };
|
||||||
|
opterr = 0;
|
||||||
|
if (getopt (2, argv, "+a") != '?')
|
||||||
|
result |= 1;
|
||||||
|
}
|
||||||
|
/* This code succeeds on glibc 2.8, mingw,
|
||||||
|
and fails on Mac OS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11,
|
||||||
|
IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x. */
|
||||||
|
{
|
||||||
|
static char program[] = "program";
|
||||||
|
static char p[] = "-p";
|
||||||
|
static char foo[] = "foo";
|
||||||
|
static char bar[] = "bar";
|
||||||
|
char *argv[] = { program, p, foo, bar, NULL };
|
||||||
|
|
||||||
|
optind = 1;
|
||||||
|
if (getopt (4, argv, "p::") != 'p')
|
||||||
|
result |= 2;
|
||||||
|
else if (optarg != NULL)
|
||||||
|
result |= 4;
|
||||||
|
else if (getopt (4, argv, "p::") != -1)
|
||||||
|
result |= 6;
|
||||||
|
else if (optind != 2)
|
||||||
|
result |= 8;
|
||||||
|
}
|
||||||
|
/* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0. */
|
||||||
|
{
|
||||||
|
static char program[] = "program";
|
||||||
|
static char foo[] = "foo";
|
||||||
|
static char p[] = "-p";
|
||||||
|
char *argv[] = { program, foo, p, NULL };
|
||||||
|
optind = 0;
|
||||||
|
if (getopt (3, argv, "-p") != 1)
|
||||||
|
result |= 16;
|
||||||
|
else if (getopt (3, argv, "-p") != 'p')
|
||||||
|
result |= 16;
|
||||||
|
}
|
||||||
|
/* This code fails on glibc 2.11. */
|
||||||
|
{
|
||||||
|
static char program[] = "program";
|
||||||
|
static char b[] = "-b";
|
||||||
|
static char a[] = "-a";
|
||||||
|
char *argv[] = { program, b, a, NULL };
|
||||||
|
optind = opterr = 0;
|
||||||
|
if (getopt (3, argv, "+:a:b") != 'b')
|
||||||
|
result |= 32;
|
||||||
|
else if (getopt (3, argv, "+:a:b") != ':')
|
||||||
|
result |= 32;
|
||||||
|
}
|
||||||
|
/* This code dumps core on glibc 2.14. */
|
||||||
|
{
|
||||||
|
static char program[] = "program";
|
||||||
|
static char w[] = "-W";
|
||||||
|
static char dummy[] = "dummy";
|
||||||
|
char *argv[] = { program, w, dummy, NULL };
|
||||||
|
optind = opterr = 1;
|
||||||
|
if (getopt (3, argv, "W;") != 'W')
|
||||||
|
result |= 64;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
]])],
|
||||||
|
[gl_cv_func_getopt_gnu=yes],
|
||||||
|
[gl_cv_func_getopt_gnu=no],
|
||||||
|
[dnl Cross compiling. Assume the worst, even on glibc platforms.
|
||||||
|
gl_cv_func_getopt_gnu="guessing no"
|
||||||
|
])
|
||||||
|
case $gl_had_POSIXLY_CORRECT in
|
||||||
|
exported) ;;
|
||||||
|
yes) AS_UNSET([POSIXLY_CORRECT]); POSIXLY_CORRECT=1 ;;
|
||||||
|
*) AS_UNSET([POSIXLY_CORRECT]) ;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
if test "$gl_cv_func_getopt_gnu" != yes; then
|
||||||
|
gl_replace_getopt=yes
|
||||||
|
else
|
||||||
|
AC_CACHE_CHECK([for working GNU getopt_long function],
|
||||||
|
[gl_cv_func_getopt_long_gnu],
|
||||||
|
[AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <getopt.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
]],
|
||||||
|
[[static const struct option long_options[] =
|
||||||
|
{
|
||||||
|
{ "xtremely-",no_argument, NULL, 1003 },
|
||||||
|
{ "xtra", no_argument, NULL, 1001 },
|
||||||
|
{ "xtreme", no_argument, NULL, 1002 },
|
||||||
|
{ "xtremely", no_argument, NULL, 1003 },
|
||||||
|
{ NULL, 0, NULL, 0 }
|
||||||
|
};
|
||||||
|
/* This code fails on OpenBSD 5.0. */
|
||||||
|
{
|
||||||
|
static char program[] = "program";
|
||||||
|
static char xtremel[] = "--xtremel";
|
||||||
|
char *argv[] = { program, xtremel, NULL };
|
||||||
|
int option_index;
|
||||||
|
optind = 1; opterr = 0;
|
||||||
|
if (getopt_long (2, argv, "", long_options, &option_index) != 1003)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
]])],
|
||||||
|
[gl_cv_func_getopt_long_gnu=yes],
|
||||||
|
[gl_cv_func_getopt_long_gnu=no],
|
||||||
|
[dnl Cross compiling. Guess no on OpenBSD, yes otherwise.
|
||||||
|
case "$host_os" in
|
||||||
|
openbsd*) gl_cv_func_getopt_long_gnu="guessing no";;
|
||||||
|
*) gl_cv_func_getopt_long_gnu="guessing yes";;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
])
|
||||||
|
case "$gl_cv_func_getopt_long_gnu" in
|
||||||
|
*yes) ;;
|
||||||
|
*) gl_replace_getopt=yes ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER],
|
||||||
|
[
|
||||||
|
GETOPT_H=getopt.h
|
||||||
|
AC_DEFINE([__GETOPT_PREFIX], [[rpl_]],
|
||||||
|
[Define to rpl_ if the getopt replacement functions and variables
|
||||||
|
should be used.])
|
||||||
|
AC_SUBST([GETOPT_H])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Prerequisites of lib/getopt*.
|
||||||
|
AC_DEFUN([gl_PREREQ_GETOPT],
|
||||||
|
[
|
||||||
|
AC_CHECK_DECLS_ONCE([getenv])
|
||||||
|
])
|
||||||
48
m4/gnulib-cache.m4
Normal file
48
m4/gnulib-cache.m4
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
# Copyright (C) 2002-2012 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This file 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 file. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception to the GNU General Public License,
|
||||||
|
# this file may be distributed as part of a program that
|
||||||
|
# contains a configuration script generated by Autoconf, under
|
||||||
|
# the same distribution terms as the rest of that program.
|
||||||
|
#
|
||||||
|
# Generated by gnulib-tool.
|
||||||
|
#
|
||||||
|
# This file represents the specification of how gnulib-tool is used.
|
||||||
|
# It acts as a cache: It is written and read by gnulib-tool.
|
||||||
|
# In projects that use version control, this file is meant to be put under
|
||||||
|
# version control, like the configure.ac and various Makefile.am files.
|
||||||
|
|
||||||
|
|
||||||
|
# Specification in the form of a command-line invocation:
|
||||||
|
# gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=tools --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files argp
|
||||||
|
|
||||||
|
# Specification in the form of a few gnulib-tool.m4 macro invocations:
|
||||||
|
gl_LOCAL_DIR([])
|
||||||
|
gl_MODULES([
|
||||||
|
argp
|
||||||
|
])
|
||||||
|
gl_AVOID([])
|
||||||
|
gl_SOURCE_BASE([lib])
|
||||||
|
gl_M4_BASE([m4])
|
||||||
|
gl_PO_BASE([])
|
||||||
|
gl_DOC_BASE([doc])
|
||||||
|
gl_TESTS_BASE([tests])
|
||||||
|
gl_LIB([libgnu])
|
||||||
|
gl_MAKEFILE_NAME([])
|
||||||
|
gl_MACRO_PREFIX([gl])
|
||||||
|
gl_PO_DOMAIN([])
|
||||||
|
gl_WITNESS_C_MACRO([])
|
||||||
|
gl_VC_FILES([false])
|
||||||
373
m4/gnulib-common.m4
Normal file
373
m4/gnulib-common.m4
Normal file
|
|
@ -0,0 +1,373 @@
|
||||||
|
# gnulib-common.m4 serial 33
|
||||||
|
dnl Copyright (C) 2007-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# gl_COMMON
|
||||||
|
# is expanded unconditionally through gnulib-tool magic.
|
||||||
|
AC_DEFUN([gl_COMMON], [
|
||||||
|
dnl Use AC_REQUIRE here, so that the code is expanded once only.
|
||||||
|
AC_REQUIRE([gl_00GNULIB])
|
||||||
|
AC_REQUIRE([gl_COMMON_BODY])
|
||||||
|
])
|
||||||
|
AC_DEFUN([gl_COMMON_BODY], [
|
||||||
|
AH_VERBATIM([_Noreturn],
|
||||||
|
[/* The _Noreturn keyword of C11. */
|
||||||
|
#if ! (defined _Noreturn \
|
||||||
|
|| (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__))
|
||||||
|
# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \
|
||||||
|
|| 0x5110 <= __SUNPRO_C)
|
||||||
|
# define _Noreturn __attribute__ ((__noreturn__))
|
||||||
|
# elif defined _MSC_VER && 1200 <= _MSC_VER
|
||||||
|
# define _Noreturn __declspec (noreturn)
|
||||||
|
# else
|
||||||
|
# define _Noreturn
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
])
|
||||||
|
AH_VERBATIM([isoc99_inline],
|
||||||
|
[/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports
|
||||||
|
the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of
|
||||||
|
earlier versions), but does not display it by setting __GNUC_STDC_INLINE__.
|
||||||
|
__APPLE__ && __MACH__ test for Mac OS X.
|
||||||
|
__APPLE_CC__ tests for the Apple compiler and its version.
|
||||||
|
__STDC_VERSION__ tests for the C99 mode. */
|
||||||
|
#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__
|
||||||
|
# define __GNUC_STDC_INLINE__ 1
|
||||||
|
#endif])
|
||||||
|
AH_VERBATIM([unused_parameter],
|
||||||
|
[/* Define as a marker that can be attached to declarations that might not
|
||||||
|
be used. This helps to reduce warnings, such as from
|
||||||
|
GCC -Wunused-parameter. */
|
||||||
|
#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
|
# define _GL_UNUSED __attribute__ ((__unused__))
|
||||||
|
#else
|
||||||
|
# define _GL_UNUSED
|
||||||
|
#endif
|
||||||
|
/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name
|
||||||
|
is a misnomer outside of parameter lists. */
|
||||||
|
#define _UNUSED_PARAMETER_ _GL_UNUSED
|
||||||
|
|
||||||
|
/* The __pure__ attribute was added in gcc 2.96. */
|
||||||
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
|
||||||
|
# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_PURE /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The __const__ attribute was added in gcc 2.95. */
|
||||||
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
|
||||||
|
# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_CONST /* empty */
|
||||||
|
#endif
|
||||||
|
])
|
||||||
|
dnl Preparation for running test programs:
|
||||||
|
dnl Tell glibc to write diagnostics from -D_FORTIFY_SOURCE=2 to stderr, not
|
||||||
|
dnl to /dev/tty, so they can be redirected to log files. Such diagnostics
|
||||||
|
dnl arise e.g., in the macros gl_PRINTF_DIRECTIVE_N, gl_SNPRINTF_DIRECTIVE_N.
|
||||||
|
LIBC_FATAL_STDERR_=1
|
||||||
|
export LIBC_FATAL_STDERR_
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_MODULE_INDICATOR_CONDITION
|
||||||
|
# expands to a C preprocessor expression that evaluates to 1 or 0, depending
|
||||||
|
# whether a gnulib module that has been requested shall be considered present
|
||||||
|
# or not.
|
||||||
|
m4_define([gl_MODULE_INDICATOR_CONDITION], [1])
|
||||||
|
|
||||||
|
# gl_MODULE_INDICATOR_SET_VARIABLE([modulename])
|
||||||
|
# sets the shell variable that indicates the presence of the given module to
|
||||||
|
# a C preprocessor expression that will evaluate to 1.
|
||||||
|
AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE],
|
||||||
|
[
|
||||||
|
gl_MODULE_INDICATOR_SET_VARIABLE_AUX(
|
||||||
|
[GNULIB_[]m4_translit([[$1]],
|
||||||
|
[abcdefghijklmnopqrstuvwxyz./-],
|
||||||
|
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])],
|
||||||
|
[gl_MODULE_INDICATOR_CONDITION])
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_MODULE_INDICATOR_SET_VARIABLE_AUX([variable])
|
||||||
|
# modifies the shell variable to include the gl_MODULE_INDICATOR_CONDITION.
|
||||||
|
# The shell variable's value is a C preprocessor expression that evaluates
|
||||||
|
# to 0 or 1.
|
||||||
|
AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX],
|
||||||
|
[
|
||||||
|
m4_if(m4_defn([gl_MODULE_INDICATOR_CONDITION]), [1],
|
||||||
|
[
|
||||||
|
dnl Simplify the expression VALUE || 1 to 1.
|
||||||
|
$1=1
|
||||||
|
],
|
||||||
|
[gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([$1],
|
||||||
|
[gl_MODULE_INDICATOR_CONDITION])])
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([variable], [condition])
|
||||||
|
# modifies the shell variable to include the given condition. The shell
|
||||||
|
# variable's value is a C preprocessor expression that evaluates to 0 or 1.
|
||||||
|
AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR],
|
||||||
|
[
|
||||||
|
dnl Simplify the expression 1 || CONDITION to 1.
|
||||||
|
if test "$[]$1" != 1; then
|
||||||
|
dnl Simplify the expression 0 || CONDITION to CONDITION.
|
||||||
|
if test "$[]$1" = 0; then
|
||||||
|
$1=$2
|
||||||
|
else
|
||||||
|
$1="($[]$1 || $2)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_MODULE_INDICATOR([modulename])
|
||||||
|
# defines a C macro indicating the presence of the given module
|
||||||
|
# in a location where it can be used.
|
||||||
|
# | Value | Value |
|
||||||
|
# | in lib/ | in tests/ |
|
||||||
|
# --------------------------------------------+---------+-----------+
|
||||||
|
# Module present among main modules: | 1 | 1 |
|
||||||
|
# --------------------------------------------+---------+-----------+
|
||||||
|
# Module present among tests-related modules: | 0 | 1 |
|
||||||
|
# --------------------------------------------+---------+-----------+
|
||||||
|
# Module not present at all: | 0 | 0 |
|
||||||
|
# --------------------------------------------+---------+-----------+
|
||||||
|
AC_DEFUN([gl_MODULE_INDICATOR],
|
||||||
|
[
|
||||||
|
AC_DEFINE_UNQUOTED([GNULIB_]m4_translit([[$1]],
|
||||||
|
[abcdefghijklmnopqrstuvwxyz./-],
|
||||||
|
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___]),
|
||||||
|
[gl_MODULE_INDICATOR_CONDITION],
|
||||||
|
[Define to a C preprocessor expression that evaluates to 1 or 0,
|
||||||
|
depending whether the gnulib module $1 shall be considered present.])
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_MODULE_INDICATOR_FOR_TESTS([modulename])
|
||||||
|
# defines a C macro indicating the presence of the given module
|
||||||
|
# in lib or tests. This is useful to determine whether the module
|
||||||
|
# should be tested.
|
||||||
|
# | Value | Value |
|
||||||
|
# | in lib/ | in tests/ |
|
||||||
|
# --------------------------------------------+---------+-----------+
|
||||||
|
# Module present among main modules: | 1 | 1 |
|
||||||
|
# --------------------------------------------+---------+-----------+
|
||||||
|
# Module present among tests-related modules: | 1 | 1 |
|
||||||
|
# --------------------------------------------+---------+-----------+
|
||||||
|
# Module not present at all: | 0 | 0 |
|
||||||
|
# --------------------------------------------+---------+-----------+
|
||||||
|
AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS],
|
||||||
|
[
|
||||||
|
AC_DEFINE([GNULIB_TEST_]m4_translit([[$1]],
|
||||||
|
[abcdefghijklmnopqrstuvwxyz./-],
|
||||||
|
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1],
|
||||||
|
[Define to 1 when the gnulib module $1 should be tested.])
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_ASSERT_NO_GNULIB_POSIXCHECK
|
||||||
|
# asserts that there will never be a need to #define GNULIB_POSIXCHECK.
|
||||||
|
# and thereby enables an optimization of configure and config.h.
|
||||||
|
# Used by Emacs.
|
||||||
|
AC_DEFUN([gl_ASSERT_NO_GNULIB_POSIXCHECK],
|
||||||
|
[
|
||||||
|
dnl Override gl_WARN_ON_USE_PREPARE.
|
||||||
|
dnl But hide this definition from 'aclocal'.
|
||||||
|
AC_DEFUN([gl_W][ARN_ON_USE_PREPARE], [])
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_ASSERT_NO_GNULIB_TESTS
|
||||||
|
# asserts that there will be no gnulib tests in the scope of the configure.ac
|
||||||
|
# and thereby enables an optimization of config.h.
|
||||||
|
# Used by Emacs.
|
||||||
|
AC_DEFUN([gl_ASSERT_NO_GNULIB_TESTS],
|
||||||
|
[
|
||||||
|
dnl Override gl_MODULE_INDICATOR_FOR_TESTS.
|
||||||
|
AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], [])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Test whether <features.h> exists.
|
||||||
|
# Set HAVE_FEATURES_H.
|
||||||
|
AC_DEFUN([gl_FEATURES_H],
|
||||||
|
[
|
||||||
|
AC_CHECK_HEADERS_ONCE([features.h])
|
||||||
|
if test $ac_cv_header_features_h = yes; then
|
||||||
|
HAVE_FEATURES_H=1
|
||||||
|
else
|
||||||
|
HAVE_FEATURES_H=0
|
||||||
|
fi
|
||||||
|
AC_SUBST([HAVE_FEATURES_H])
|
||||||
|
])
|
||||||
|
|
||||||
|
# m4_foreach_w
|
||||||
|
# is a backport of autoconf-2.59c's m4_foreach_w.
|
||||||
|
# Remove this macro when we can assume autoconf >= 2.60.
|
||||||
|
m4_ifndef([m4_foreach_w],
|
||||||
|
[m4_define([m4_foreach_w],
|
||||||
|
[m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3])])])
|
||||||
|
|
||||||
|
# AS_VAR_IF(VAR, VALUE, [IF-MATCH], [IF-NOT-MATCH])
|
||||||
|
# ----------------------------------------------------
|
||||||
|
# Backport of autoconf-2.63b's macro.
|
||||||
|
# Remove this macro when we can assume autoconf >= 2.64.
|
||||||
|
m4_ifndef([AS_VAR_IF],
|
||||||
|
[m4_define([AS_VAR_IF],
|
||||||
|
[AS_IF([test x"AS_VAR_GET([$1])" = x""$2], [$3], [$4])])])
|
||||||
|
|
||||||
|
# gl_PROG_CC_C99
|
||||||
|
# Modifies the value of the shell variable CC in an attempt to make $CC
|
||||||
|
# understand ISO C99 source code.
|
||||||
|
# This is like AC_PROG_CC_C99, except that
|
||||||
|
# - AC_PROG_CC_C99 did not exist in Autoconf versions < 2.60,
|
||||||
|
# - AC_PROG_CC_C99 does not mix well with AC_PROG_CC_STDC
|
||||||
|
# <http://lists.gnu.org/archive/html/bug-gnulib/2011-09/msg00367.html>,
|
||||||
|
# but many more packages use AC_PROG_CC_STDC than AC_PROG_CC_C99
|
||||||
|
# <http://lists.gnu.org/archive/html/bug-gnulib/2011-09/msg00441.html>.
|
||||||
|
# Remaining problems:
|
||||||
|
# - When AC_PROG_CC_STDC is invoked twice, it adds the C99 enabling options
|
||||||
|
# to CC twice
|
||||||
|
# <http://lists.gnu.org/archive/html/bug-gnulib/2011-09/msg00431.html>.
|
||||||
|
# - AC_PROG_CC_STDC is likely to change now that C11 is an ISO standard.
|
||||||
|
AC_DEFUN([gl_PROG_CC_C99],
|
||||||
|
[
|
||||||
|
dnl Change that version number to the minimum Autoconf version that supports
|
||||||
|
dnl mixing AC_PROG_CC_C99 calls with AC_PROG_CC_STDC calls.
|
||||||
|
m4_version_prereq([9.0],
|
||||||
|
[AC_REQUIRE([AC_PROG_CC_C99])],
|
||||||
|
[AC_REQUIRE([AC_PROG_CC_STDC])])
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_PROG_AR_RANLIB
|
||||||
|
# Determines the values for AR, ARFLAGS, RANLIB that fit with the compiler.
|
||||||
|
# The user can set the variables AR, ARFLAGS, RANLIB if he wants to override
|
||||||
|
# the values.
|
||||||
|
AC_DEFUN([gl_PROG_AR_RANLIB],
|
||||||
|
[
|
||||||
|
dnl Minix 3 comes with two toolchains: The Amsterdam Compiler Kit compiler
|
||||||
|
dnl as "cc", and GCC as "gcc". They have different object file formats and
|
||||||
|
dnl library formats. In particular, the GNU binutils programs ar, ranlib
|
||||||
|
dnl produce libraries that work only with gcc, not with cc.
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_CACHE_CHECK([for Minix Amsterdam compiler], [gl_cv_c_amsterdam_compiler],
|
||||||
|
[
|
||||||
|
AC_EGREP_CPP([Amsterdam],
|
||||||
|
[
|
||||||
|
#ifdef __ACK__
|
||||||
|
Amsterdam
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
[gl_cv_c_amsterdam_compiler=yes],
|
||||||
|
[gl_cv_c_amsterdam_compiler=no])
|
||||||
|
])
|
||||||
|
if test -z "$AR"; then
|
||||||
|
if test $gl_cv_c_amsterdam_compiler = yes; then
|
||||||
|
AR='cc -c.a'
|
||||||
|
if test -z "$ARFLAGS"; then
|
||||||
|
ARFLAGS='-o'
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
dnl Use the Automake-documented default values for AR and ARFLAGS,
|
||||||
|
dnl but prefer ${host}-ar over ar (useful for cross-compiling).
|
||||||
|
AC_CHECK_TOOL([AR], [ar], [ar])
|
||||||
|
if test -z "$ARFLAGS"; then
|
||||||
|
ARFLAGS='cru'
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if test -z "$ARFLAGS"; then
|
||||||
|
ARFLAGS='cru'
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AC_SUBST([AR])
|
||||||
|
AC_SUBST([ARFLAGS])
|
||||||
|
if test -z "$RANLIB"; then
|
||||||
|
if test $gl_cv_c_amsterdam_compiler = yes; then
|
||||||
|
RANLIB=':'
|
||||||
|
else
|
||||||
|
dnl Use the ranlib program if it is available.
|
||||||
|
AC_PROG_RANLIB
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AC_SUBST([RANLIB])
|
||||||
|
])
|
||||||
|
|
||||||
|
# AC_PROG_MKDIR_P
|
||||||
|
# is a backport of autoconf-2.60's AC_PROG_MKDIR_P, with a fix
|
||||||
|
# for interoperability with automake-1.9.6 from autoconf-2.62.
|
||||||
|
# Remove this macro when we can assume autoconf >= 2.62 or
|
||||||
|
# autoconf >= 2.60 && automake >= 1.10.
|
||||||
|
m4_ifdef([AC_PROG_MKDIR_P], [
|
||||||
|
dnl For automake-1.9.6 && autoconf < 2.62: Ensure MKDIR_P is AC_SUBSTed.
|
||||||
|
m4_define([AC_PROG_MKDIR_P],
|
||||||
|
m4_defn([AC_PROG_MKDIR_P])[
|
||||||
|
AC_SUBST([MKDIR_P])])], [
|
||||||
|
dnl For autoconf < 2.60: Backport of AC_PROG_MKDIR_P.
|
||||||
|
AC_DEFUN_ONCE([AC_PROG_MKDIR_P],
|
||||||
|
[AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
|
||||||
|
MKDIR_P='$(mkdir_p)'
|
||||||
|
AC_SUBST([MKDIR_P])])])
|
||||||
|
|
||||||
|
# AC_C_RESTRICT
|
||||||
|
# This definition overrides the AC_C_RESTRICT macro from autoconf 2.60..2.61,
|
||||||
|
# so that mixed use of GNU C and GNU C++ and mixed use of Sun C and Sun C++
|
||||||
|
# works.
|
||||||
|
# This definition can be removed once autoconf >= 2.62 can be assumed.
|
||||||
|
m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.62]),[-1],[
|
||||||
|
AC_DEFUN([AC_C_RESTRICT],
|
||||||
|
[AC_CACHE_CHECK([for C/C++ restrict keyword], [ac_cv_c_restrict],
|
||||||
|
[ac_cv_c_restrict=no
|
||||||
|
# The order here caters to the fact that C++ does not require restrict.
|
||||||
|
for ac_kw in __restrict __restrict__ _Restrict restrict; do
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
|
||||||
|
[[typedef int * int_ptr;
|
||||||
|
int foo (int_ptr $ac_kw ip) {
|
||||||
|
return ip[0];
|
||||||
|
}]],
|
||||||
|
[[int s[1];
|
||||||
|
int * $ac_kw t = s;
|
||||||
|
t[0] = 0;
|
||||||
|
return foo(t)]])],
|
||||||
|
[ac_cv_c_restrict=$ac_kw])
|
||||||
|
test "$ac_cv_c_restrict" != no && break
|
||||||
|
done
|
||||||
|
])
|
||||||
|
AH_VERBATIM([restrict],
|
||||||
|
[/* Define to the equivalent of the C99 'restrict' keyword, or to
|
||||||
|
nothing if this is not supported. Do not define if restrict is
|
||||||
|
supported directly. */
|
||||||
|
#undef restrict
|
||||||
|
/* Work around a bug in Sun C++: it does not support _Restrict, even
|
||||||
|
though the corresponding Sun C compiler does, which causes
|
||||||
|
"#define restrict _Restrict" in the previous line. Perhaps some future
|
||||||
|
version of Sun C++ will work with _Restrict; if so, it'll probably
|
||||||
|
define __RESTRICT, just as Sun C does. */
|
||||||
|
#if defined __SUNPRO_CC && !defined __RESTRICT
|
||||||
|
# define _Restrict
|
||||||
|
#endif])
|
||||||
|
case $ac_cv_c_restrict in
|
||||||
|
restrict) ;;
|
||||||
|
no) AC_DEFINE([restrict], []) ;;
|
||||||
|
*) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_BIGENDIAN
|
||||||
|
# is like AC_C_BIGENDIAN, except that it can be AC_REQUIREd.
|
||||||
|
# Note that AC_REQUIRE([AC_C_BIGENDIAN]) does not work reliably because some
|
||||||
|
# macros invoke AC_C_BIGENDIAN with arguments.
|
||||||
|
AC_DEFUN([gl_BIGENDIAN],
|
||||||
|
[
|
||||||
|
AC_C_BIGENDIAN
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_CACHE_VAL_SILENT(cache-id, command-to-set-it)
|
||||||
|
# is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not
|
||||||
|
# output a spurious "(cached)" mark in the midst of other configure output.
|
||||||
|
# This macro should be used instead of AC_CACHE_VAL when it is not surrounded
|
||||||
|
# by an AC_MSG_CHECKING/AC_MSG_RESULT pair.
|
||||||
|
AC_DEFUN([gl_CACHE_VAL_SILENT],
|
||||||
|
[
|
||||||
|
saved_as_echo_n="$as_echo_n"
|
||||||
|
as_echo_n=':'
|
||||||
|
AC_CACHE_VAL([$1], [$2])
|
||||||
|
as_echo_n="$saved_as_echo_n"
|
||||||
|
])
|
||||||
504
m4/gnulib-comp.m4
Normal file
504
m4/gnulib-comp.m4
Normal file
|
|
@ -0,0 +1,504 @@
|
||||||
|
# DO NOT EDIT! GENERATED AUTOMATICALLY!
|
||||||
|
# Copyright (C) 2002-2012 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This file 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 file. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception to the GNU General Public License,
|
||||||
|
# this file may be distributed as part of a program that
|
||||||
|
# contains a configuration script generated by Autoconf, under
|
||||||
|
# the same distribution terms as the rest of that program.
|
||||||
|
#
|
||||||
|
# Generated by gnulib-tool.
|
||||||
|
#
|
||||||
|
# This file represents the compiled summary of the specification in
|
||||||
|
# gnulib-cache.m4. It lists the computed macro invocations that need
|
||||||
|
# to be invoked from configure.ac.
|
||||||
|
# In projects that use version control, this file can be treated like
|
||||||
|
# other built files.
|
||||||
|
|
||||||
|
|
||||||
|
# This macro should be invoked from ./configure.ac, in the section
|
||||||
|
# "Checks for programs", right after AC_PROG_CC, and certainly before
|
||||||
|
# any checks for libraries, header files, types and library functions.
|
||||||
|
AC_DEFUN([gl_EARLY],
|
||||||
|
[
|
||||||
|
m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace
|
||||||
|
m4_pattern_allow([^gl_ES$])dnl a valid locale name
|
||||||
|
m4_pattern_allow([^gl_LIBOBJS$])dnl a variable
|
||||||
|
m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable
|
||||||
|
AC_REQUIRE([gl_PROG_AR_RANLIB])
|
||||||
|
# Code from module alloca:
|
||||||
|
# Code from module alloca-opt:
|
||||||
|
# Code from module argp:
|
||||||
|
# Code from module dirname-lgpl:
|
||||||
|
# Code from module dosname:
|
||||||
|
# Code from module double-slash-root:
|
||||||
|
# Code from module errno:
|
||||||
|
# Code from module extensions:
|
||||||
|
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
||||||
|
# Code from module float:
|
||||||
|
# Code from module getopt-gnu:
|
||||||
|
# Code from module getopt-posix:
|
||||||
|
# Code from module gettext-h:
|
||||||
|
# Code from module include_next:
|
||||||
|
# Code from module intprops:
|
||||||
|
# Code from module malloc-gnu:
|
||||||
|
# Code from module malloc-posix:
|
||||||
|
# Code from module memchr:
|
||||||
|
# Code from module mempcpy:
|
||||||
|
# Code from module multiarch:
|
||||||
|
# Code from module nocrash:
|
||||||
|
# Code from module rawmemchr:
|
||||||
|
# Code from module size_max:
|
||||||
|
# Code from module sleep:
|
||||||
|
# Code from module snippet/_Noreturn:
|
||||||
|
# Code from module snippet/arg-nonnull:
|
||||||
|
# Code from module snippet/c++defs:
|
||||||
|
# Code from module snippet/warn-on-use:
|
||||||
|
# Code from module ssize_t:
|
||||||
|
# Code from module stdalign:
|
||||||
|
# Code from module stdbool:
|
||||||
|
# Code from module stddef:
|
||||||
|
# Code from module stdint:
|
||||||
|
# Code from module stdio:
|
||||||
|
# Code from module stdlib:
|
||||||
|
# Code from module strcase:
|
||||||
|
# Code from module strchrnul:
|
||||||
|
# Code from module strerror:
|
||||||
|
# Code from module strerror-override:
|
||||||
|
# Code from module string:
|
||||||
|
# Code from module strings:
|
||||||
|
# Code from module strndup:
|
||||||
|
# Code from module strnlen:
|
||||||
|
# Code from module sys_types:
|
||||||
|
# Code from module sysexits:
|
||||||
|
# Code from module unistd:
|
||||||
|
# Code from module vasnprintf:
|
||||||
|
# Code from module verify:
|
||||||
|
# Code from module vsnprintf:
|
||||||
|
# Code from module wchar:
|
||||||
|
# Code from module xsize:
|
||||||
|
])
|
||||||
|
|
||||||
|
# This macro should be invoked from ./configure.ac, in the section
|
||||||
|
# "Check for header files, types and library functions".
|
||||||
|
AC_DEFUN([gl_INIT],
|
||||||
|
[
|
||||||
|
AM_CONDITIONAL([GL_COND_LIBTOOL], [false])
|
||||||
|
gl_cond_libtool=false
|
||||||
|
gl_libdeps=
|
||||||
|
gl_ltlibdeps=
|
||||||
|
gl_m4_base='m4'
|
||||||
|
m4_pushdef([AC_LIBOBJ], m4_defn([gl_LIBOBJ]))
|
||||||
|
m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl_REPLACE_FUNCS]))
|
||||||
|
m4_pushdef([AC_LIBSOURCES], m4_defn([gl_LIBSOURCES]))
|
||||||
|
m4_pushdef([gl_LIBSOURCES_LIST], [])
|
||||||
|
m4_pushdef([gl_LIBSOURCES_DIR], [])
|
||||||
|
gl_COMMON
|
||||||
|
gl_source_base='lib'
|
||||||
|
gl_FUNC_ALLOCA
|
||||||
|
gl_ARGP
|
||||||
|
m4_ifdef([AM_XGETTEXT_OPTION],
|
||||||
|
[AM_][XGETTEXT_OPTION([--flag=argp_error:2:c-format])
|
||||||
|
AM_][XGETTEXT_OPTION([--flag=argp_failure:4:c-format])])
|
||||||
|
gl_DIRNAME_LGPL
|
||||||
|
gl_DOUBLE_SLASH_ROOT
|
||||||
|
gl_HEADER_ERRNO_H
|
||||||
|
gl_FLOAT_H
|
||||||
|
if test $REPLACE_FLOAT_LDBL = 1; then
|
||||||
|
AC_LIBOBJ([float])
|
||||||
|
fi
|
||||||
|
if test $REPLACE_ITOLD = 1; then
|
||||||
|
AC_LIBOBJ([itold])
|
||||||
|
fi
|
||||||
|
gl_FUNC_GETOPT_GNU
|
||||||
|
if test $REPLACE_GETOPT = 1; then
|
||||||
|
AC_LIBOBJ([getopt])
|
||||||
|
AC_LIBOBJ([getopt1])
|
||||||
|
gl_PREREQ_GETOPT
|
||||||
|
dnl Arrange for unistd.h to include getopt.h.
|
||||||
|
GNULIB_GL_UNISTD_H_GETOPT=1
|
||||||
|
fi
|
||||||
|
AC_SUBST([GNULIB_GL_UNISTD_H_GETOPT])
|
||||||
|
gl_MODULE_INDICATOR_FOR_TESTS([getopt-gnu])
|
||||||
|
gl_FUNC_GETOPT_POSIX
|
||||||
|
if test $REPLACE_GETOPT = 1; then
|
||||||
|
AC_LIBOBJ([getopt])
|
||||||
|
AC_LIBOBJ([getopt1])
|
||||||
|
gl_PREREQ_GETOPT
|
||||||
|
dnl Arrange for unistd.h to include getopt.h.
|
||||||
|
GNULIB_GL_UNISTD_H_GETOPT=1
|
||||||
|
fi
|
||||||
|
AC_SUBST([GNULIB_GL_UNISTD_H_GETOPT])
|
||||||
|
AC_SUBST([LIBINTL])
|
||||||
|
AC_SUBST([LTLIBINTL])
|
||||||
|
gl_FUNC_MALLOC_GNU
|
||||||
|
if test $REPLACE_MALLOC = 1; then
|
||||||
|
AC_LIBOBJ([malloc])
|
||||||
|
fi
|
||||||
|
gl_MODULE_INDICATOR([malloc-gnu])
|
||||||
|
gl_FUNC_MALLOC_POSIX
|
||||||
|
if test $REPLACE_MALLOC = 1; then
|
||||||
|
AC_LIBOBJ([malloc])
|
||||||
|
fi
|
||||||
|
gl_STDLIB_MODULE_INDICATOR([malloc-posix])
|
||||||
|
gl_FUNC_MEMCHR
|
||||||
|
if test $HAVE_MEMCHR = 0 || test $REPLACE_MEMCHR = 1; then
|
||||||
|
AC_LIBOBJ([memchr])
|
||||||
|
gl_PREREQ_MEMCHR
|
||||||
|
fi
|
||||||
|
gl_STRING_MODULE_INDICATOR([memchr])
|
||||||
|
gl_FUNC_MEMPCPY
|
||||||
|
if test $HAVE_MEMPCPY = 0; then
|
||||||
|
AC_LIBOBJ([mempcpy])
|
||||||
|
gl_PREREQ_MEMPCPY
|
||||||
|
fi
|
||||||
|
gl_STRING_MODULE_INDICATOR([mempcpy])
|
||||||
|
gl_MULTIARCH
|
||||||
|
gl_FUNC_RAWMEMCHR
|
||||||
|
if test $HAVE_RAWMEMCHR = 0; then
|
||||||
|
AC_LIBOBJ([rawmemchr])
|
||||||
|
gl_PREREQ_RAWMEMCHR
|
||||||
|
fi
|
||||||
|
gl_STRING_MODULE_INDICATOR([rawmemchr])
|
||||||
|
gl_SIZE_MAX
|
||||||
|
gl_FUNC_SLEEP
|
||||||
|
if test $HAVE_SLEEP = 0 || test $REPLACE_SLEEP = 1; then
|
||||||
|
AC_LIBOBJ([sleep])
|
||||||
|
fi
|
||||||
|
gl_UNISTD_MODULE_INDICATOR([sleep])
|
||||||
|
gt_TYPE_SSIZE_T
|
||||||
|
gl_STDALIGN_H
|
||||||
|
AM_STDBOOL_H
|
||||||
|
gl_STDDEF_H
|
||||||
|
gl_STDINT_H
|
||||||
|
gl_STDIO_H
|
||||||
|
gl_STDLIB_H
|
||||||
|
gl_STRCASE
|
||||||
|
if test $HAVE_STRCASECMP = 0; then
|
||||||
|
AC_LIBOBJ([strcasecmp])
|
||||||
|
gl_PREREQ_STRCASECMP
|
||||||
|
fi
|
||||||
|
if test $HAVE_STRNCASECMP = 0; then
|
||||||
|
AC_LIBOBJ([strncasecmp])
|
||||||
|
gl_PREREQ_STRNCASECMP
|
||||||
|
fi
|
||||||
|
gl_FUNC_STRCHRNUL
|
||||||
|
if test $HAVE_STRCHRNUL = 0 || test $REPLACE_STRCHRNUL = 1; then
|
||||||
|
AC_LIBOBJ([strchrnul])
|
||||||
|
gl_PREREQ_STRCHRNUL
|
||||||
|
fi
|
||||||
|
gl_STRING_MODULE_INDICATOR([strchrnul])
|
||||||
|
gl_FUNC_STRERROR
|
||||||
|
if test $REPLACE_STRERROR = 1; then
|
||||||
|
AC_LIBOBJ([strerror])
|
||||||
|
fi
|
||||||
|
gl_MODULE_INDICATOR([strerror])
|
||||||
|
gl_STRING_MODULE_INDICATOR([strerror])
|
||||||
|
AC_REQUIRE([gl_HEADER_ERRNO_H])
|
||||||
|
AC_REQUIRE([gl_FUNC_STRERROR_0])
|
||||||
|
if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then
|
||||||
|
AC_LIBOBJ([strerror-override])
|
||||||
|
gl_PREREQ_SYS_H_WINSOCK2
|
||||||
|
fi
|
||||||
|
gl_HEADER_STRING_H
|
||||||
|
gl_HEADER_STRINGS_H
|
||||||
|
gl_FUNC_STRNDUP
|
||||||
|
if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then
|
||||||
|
AC_LIBOBJ([strndup])
|
||||||
|
fi
|
||||||
|
gl_STRING_MODULE_INDICATOR([strndup])
|
||||||
|
gl_FUNC_STRNLEN
|
||||||
|
if test $HAVE_DECL_STRNLEN = 0 || test $REPLACE_STRNLEN = 1; then
|
||||||
|
AC_LIBOBJ([strnlen])
|
||||||
|
gl_PREREQ_STRNLEN
|
||||||
|
fi
|
||||||
|
gl_STRING_MODULE_INDICATOR([strnlen])
|
||||||
|
gl_SYS_TYPES_H
|
||||||
|
AC_PROG_MKDIR_P
|
||||||
|
gl_SYSEXITS
|
||||||
|
gl_UNISTD_H
|
||||||
|
gl_FUNC_VASNPRINTF
|
||||||
|
gl_FUNC_VSNPRINTF
|
||||||
|
gl_STDIO_MODULE_INDICATOR([vsnprintf])
|
||||||
|
gl_WCHAR_H
|
||||||
|
gl_XSIZE
|
||||||
|
# End of code from modules
|
||||||
|
m4_ifval(gl_LIBSOURCES_LIST, [
|
||||||
|
m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ ||
|
||||||
|
for gl_file in ]gl_LIBSOURCES_LIST[ ; do
|
||||||
|
if test ! -r ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file ; then
|
||||||
|
echo "missing file ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done])dnl
|
||||||
|
m4_if(m4_sysval, [0], [],
|
||||||
|
[AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])
|
||||||
|
])
|
||||||
|
m4_popdef([gl_LIBSOURCES_DIR])
|
||||||
|
m4_popdef([gl_LIBSOURCES_LIST])
|
||||||
|
m4_popdef([AC_LIBSOURCES])
|
||||||
|
m4_popdef([AC_REPLACE_FUNCS])
|
||||||
|
m4_popdef([AC_LIBOBJ])
|
||||||
|
AC_CONFIG_COMMANDS_PRE([
|
||||||
|
gl_libobjs=
|
||||||
|
gl_ltlibobjs=
|
||||||
|
if test -n "$gl_LIBOBJS"; then
|
||||||
|
# Remove the extension.
|
||||||
|
sed_drop_objext='s/\.o$//;s/\.obj$//'
|
||||||
|
for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
|
||||||
|
gl_libobjs="$gl_libobjs $i.$ac_objext"
|
||||||
|
gl_ltlibobjs="$gl_ltlibobjs $i.lo"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
AC_SUBST([gl_LIBOBJS], [$gl_libobjs])
|
||||||
|
AC_SUBST([gl_LTLIBOBJS], [$gl_ltlibobjs])
|
||||||
|
])
|
||||||
|
gltests_libdeps=
|
||||||
|
gltests_ltlibdeps=
|
||||||
|
m4_pushdef([AC_LIBOBJ], m4_defn([gltests_LIBOBJ]))
|
||||||
|
m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gltests_REPLACE_FUNCS]))
|
||||||
|
m4_pushdef([AC_LIBSOURCES], m4_defn([gltests_LIBSOURCES]))
|
||||||
|
m4_pushdef([gltests_LIBSOURCES_LIST], [])
|
||||||
|
m4_pushdef([gltests_LIBSOURCES_DIR], [])
|
||||||
|
gl_COMMON
|
||||||
|
gl_source_base='tests'
|
||||||
|
changequote(,)dnl
|
||||||
|
gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS
|
||||||
|
changequote([, ])dnl
|
||||||
|
AC_SUBST([gltests_WITNESS])
|
||||||
|
gl_module_indicator_condition=$gltests_WITNESS
|
||||||
|
m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [$gl_module_indicator_condition])
|
||||||
|
m4_popdef([gl_MODULE_INDICATOR_CONDITION])
|
||||||
|
m4_ifval(gltests_LIBSOURCES_LIST, [
|
||||||
|
m4_syscmd([test ! -d ]m4_defn([gltests_LIBSOURCES_DIR])[ ||
|
||||||
|
for gl_file in ]gltests_LIBSOURCES_LIST[ ; do
|
||||||
|
if test ! -r ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file ; then
|
||||||
|
echo "missing file ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done])dnl
|
||||||
|
m4_if(m4_sysval, [0], [],
|
||||||
|
[AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])
|
||||||
|
])
|
||||||
|
m4_popdef([gltests_LIBSOURCES_DIR])
|
||||||
|
m4_popdef([gltests_LIBSOURCES_LIST])
|
||||||
|
m4_popdef([AC_LIBSOURCES])
|
||||||
|
m4_popdef([AC_REPLACE_FUNCS])
|
||||||
|
m4_popdef([AC_LIBOBJ])
|
||||||
|
AC_CONFIG_COMMANDS_PRE([
|
||||||
|
gltests_libobjs=
|
||||||
|
gltests_ltlibobjs=
|
||||||
|
if test -n "$gltests_LIBOBJS"; then
|
||||||
|
# Remove the extension.
|
||||||
|
sed_drop_objext='s/\.o$//;s/\.obj$//'
|
||||||
|
for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
|
||||||
|
gltests_libobjs="$gltests_libobjs $i.$ac_objext"
|
||||||
|
gltests_ltlibobjs="$gltests_ltlibobjs $i.lo"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
AC_SUBST([gltests_LIBOBJS], [$gltests_libobjs])
|
||||||
|
AC_SUBST([gltests_LTLIBOBJS], [$gltests_ltlibobjs])
|
||||||
|
])
|
||||||
|
LIBGNU_LIBDEPS="$gl_libdeps"
|
||||||
|
AC_SUBST([LIBGNU_LIBDEPS])
|
||||||
|
LIBGNU_LTLIBDEPS="$gl_ltlibdeps"
|
||||||
|
AC_SUBST([LIBGNU_LTLIBDEPS])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Like AC_LIBOBJ, except that the module name goes
|
||||||
|
# into gl_LIBOBJS instead of into LIBOBJS.
|
||||||
|
AC_DEFUN([gl_LIBOBJ], [
|
||||||
|
AS_LITERAL_IF([$1], [gl_LIBSOURCES([$1.c])])dnl
|
||||||
|
gl_LIBOBJS="$gl_LIBOBJS $1.$ac_objext"
|
||||||
|
])
|
||||||
|
|
||||||
|
# Like AC_REPLACE_FUNCS, except that the module name goes
|
||||||
|
# into gl_LIBOBJS instead of into LIBOBJS.
|
||||||
|
AC_DEFUN([gl_REPLACE_FUNCS], [
|
||||||
|
m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl
|
||||||
|
AC_CHECK_FUNCS([$1], , [gl_LIBOBJ($ac_func)])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Like AC_LIBSOURCES, except the directory where the source file is
|
||||||
|
# expected is derived from the gnulib-tool parameterization,
|
||||||
|
# and alloca is special cased (for the alloca-opt module).
|
||||||
|
# We could also entirely rely on EXTRA_lib..._SOURCES.
|
||||||
|
AC_DEFUN([gl_LIBSOURCES], [
|
||||||
|
m4_foreach([_gl_NAME], [$1], [
|
||||||
|
m4_if(_gl_NAME, [alloca.c], [], [
|
||||||
|
m4_define([gl_LIBSOURCES_DIR], [lib])
|
||||||
|
m4_append([gl_LIBSOURCES_LIST], _gl_NAME, [ ])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Like AC_LIBOBJ, except that the module name goes
|
||||||
|
# into gltests_LIBOBJS instead of into LIBOBJS.
|
||||||
|
AC_DEFUN([gltests_LIBOBJ], [
|
||||||
|
AS_LITERAL_IF([$1], [gltests_LIBSOURCES([$1.c])])dnl
|
||||||
|
gltests_LIBOBJS="$gltests_LIBOBJS $1.$ac_objext"
|
||||||
|
])
|
||||||
|
|
||||||
|
# Like AC_REPLACE_FUNCS, except that the module name goes
|
||||||
|
# into gltests_LIBOBJS instead of into LIBOBJS.
|
||||||
|
AC_DEFUN([gltests_REPLACE_FUNCS], [
|
||||||
|
m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl
|
||||||
|
AC_CHECK_FUNCS([$1], , [gltests_LIBOBJ($ac_func)])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Like AC_LIBSOURCES, except the directory where the source file is
|
||||||
|
# expected is derived from the gnulib-tool parameterization,
|
||||||
|
# and alloca is special cased (for the alloca-opt module).
|
||||||
|
# We could also entirely rely on EXTRA_lib..._SOURCES.
|
||||||
|
AC_DEFUN([gltests_LIBSOURCES], [
|
||||||
|
m4_foreach([_gl_NAME], [$1], [
|
||||||
|
m4_if(_gl_NAME, [alloca.c], [], [
|
||||||
|
m4_define([gltests_LIBSOURCES_DIR], [tests])
|
||||||
|
m4_append([gltests_LIBSOURCES_LIST], _gl_NAME, [ ])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
# This macro records the list of files which have been installed by
|
||||||
|
# gnulib-tool and may be removed by future gnulib-tool invocations.
|
||||||
|
AC_DEFUN([gl_FILE_LIST], [
|
||||||
|
build-aux/snippet/_Noreturn.h
|
||||||
|
build-aux/snippet/arg-nonnull.h
|
||||||
|
build-aux/snippet/c++defs.h
|
||||||
|
build-aux/snippet/warn-on-use.h
|
||||||
|
lib/alloca.c
|
||||||
|
lib/alloca.in.h
|
||||||
|
lib/argp-ba.c
|
||||||
|
lib/argp-eexst.c
|
||||||
|
lib/argp-fmtstream.c
|
||||||
|
lib/argp-fmtstream.h
|
||||||
|
lib/argp-fs-xinl.c
|
||||||
|
lib/argp-help.c
|
||||||
|
lib/argp-namefrob.h
|
||||||
|
lib/argp-parse.c
|
||||||
|
lib/argp-pin.c
|
||||||
|
lib/argp-pv.c
|
||||||
|
lib/argp-pvh.c
|
||||||
|
lib/argp-xinl.c
|
||||||
|
lib/argp.h
|
||||||
|
lib/asnprintf.c
|
||||||
|
lib/basename-lgpl.c
|
||||||
|
lib/dirname-lgpl.c
|
||||||
|
lib/dirname.h
|
||||||
|
lib/dosname.h
|
||||||
|
lib/errno.in.h
|
||||||
|
lib/float+.h
|
||||||
|
lib/float.c
|
||||||
|
lib/float.in.h
|
||||||
|
lib/getopt.c
|
||||||
|
lib/getopt.in.h
|
||||||
|
lib/getopt1.c
|
||||||
|
lib/getopt_int.h
|
||||||
|
lib/gettext.h
|
||||||
|
lib/intprops.h
|
||||||
|
lib/itold.c
|
||||||
|
lib/malloc.c
|
||||||
|
lib/memchr.c
|
||||||
|
lib/memchr.valgrind
|
||||||
|
lib/mempcpy.c
|
||||||
|
lib/printf-args.c
|
||||||
|
lib/printf-args.h
|
||||||
|
lib/printf-parse.c
|
||||||
|
lib/printf-parse.h
|
||||||
|
lib/rawmemchr.c
|
||||||
|
lib/rawmemchr.valgrind
|
||||||
|
lib/size_max.h
|
||||||
|
lib/sleep.c
|
||||||
|
lib/stdalign.in.h
|
||||||
|
lib/stdbool.in.h
|
||||||
|
lib/stddef.in.h
|
||||||
|
lib/stdint.in.h
|
||||||
|
lib/stdio.in.h
|
||||||
|
lib/stdlib.in.h
|
||||||
|
lib/strcasecmp.c
|
||||||
|
lib/strchrnul.c
|
||||||
|
lib/strchrnul.valgrind
|
||||||
|
lib/strerror-override.c
|
||||||
|
lib/strerror-override.h
|
||||||
|
lib/strerror.c
|
||||||
|
lib/string.in.h
|
||||||
|
lib/strings.in.h
|
||||||
|
lib/stripslash.c
|
||||||
|
lib/strncasecmp.c
|
||||||
|
lib/strndup.c
|
||||||
|
lib/strnlen.c
|
||||||
|
lib/sys_types.in.h
|
||||||
|
lib/sysexits.in.h
|
||||||
|
lib/unistd.in.h
|
||||||
|
lib/vasnprintf.c
|
||||||
|
lib/vasnprintf.h
|
||||||
|
lib/verify.h
|
||||||
|
lib/vsnprintf.c
|
||||||
|
lib/wchar.in.h
|
||||||
|
lib/xsize.h
|
||||||
|
m4/00gnulib.m4
|
||||||
|
m4/alloca.m4
|
||||||
|
m4/argp.m4
|
||||||
|
m4/dirname.m4
|
||||||
|
m4/double-slash-root.m4
|
||||||
|
m4/errno_h.m4
|
||||||
|
m4/exponentd.m4
|
||||||
|
m4/extensions.m4
|
||||||
|
m4/float_h.m4
|
||||||
|
m4/getopt.m4
|
||||||
|
m4/gnulib-common.m4
|
||||||
|
m4/include_next.m4
|
||||||
|
m4/intmax_t.m4
|
||||||
|
m4/inttypes_h.m4
|
||||||
|
m4/longlong.m4
|
||||||
|
m4/malloc.m4
|
||||||
|
m4/math_h.m4
|
||||||
|
m4/memchr.m4
|
||||||
|
m4/mempcpy.m4
|
||||||
|
m4/mmap-anon.m4
|
||||||
|
m4/multiarch.m4
|
||||||
|
m4/nocrash.m4
|
||||||
|
m4/off_t.m4
|
||||||
|
m4/printf.m4
|
||||||
|
m4/rawmemchr.m4
|
||||||
|
m4/size_max.m4
|
||||||
|
m4/sleep.m4
|
||||||
|
m4/ssize_t.m4
|
||||||
|
m4/stdalign.m4
|
||||||
|
m4/stdbool.m4
|
||||||
|
m4/stddef_h.m4
|
||||||
|
m4/stdint.m4
|
||||||
|
m4/stdint_h.m4
|
||||||
|
m4/stdio_h.m4
|
||||||
|
m4/stdlib_h.m4
|
||||||
|
m4/strcase.m4
|
||||||
|
m4/strchrnul.m4
|
||||||
|
m4/strerror.m4
|
||||||
|
m4/string_h.m4
|
||||||
|
m4/strings_h.m4
|
||||||
|
m4/strndup.m4
|
||||||
|
m4/strnlen.m4
|
||||||
|
m4/sys_socket_h.m4
|
||||||
|
m4/sys_types_h.m4
|
||||||
|
m4/sysexits.m4
|
||||||
|
m4/unistd_h.m4
|
||||||
|
m4/vasnprintf.m4
|
||||||
|
m4/vsnprintf.m4
|
||||||
|
m4/warn-on-use.m4
|
||||||
|
m4/wchar_h.m4
|
||||||
|
m4/wchar_t.m4
|
||||||
|
m4/wint_t.m4
|
||||||
|
m4/xsize.m4
|
||||||
|
])
|
||||||
57
m4/gnulib-tool.m4
Normal file
57
m4/gnulib-tool.m4
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
# gnulib-tool.m4 serial 2
|
||||||
|
dnl Copyright (C) 2004-2005, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
dnl The following macros need not be invoked explicitly.
|
||||||
|
dnl Invoking them does nothing except to declare default arguments
|
||||||
|
dnl for "gnulib-tool --import".
|
||||||
|
|
||||||
|
dnl Usage: gl_LOCAL_DIR([DIR])
|
||||||
|
AC_DEFUN([gl_LOCAL_DIR], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_MODULES([module1 module2 ...])
|
||||||
|
AC_DEFUN([gl_MODULES], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_AVOID([module1 module2 ...])
|
||||||
|
AC_DEFUN([gl_AVOID], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_SOURCE_BASE([DIR])
|
||||||
|
AC_DEFUN([gl_SOURCE_BASE], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_M4_BASE([DIR])
|
||||||
|
AC_DEFUN([gl_M4_BASE], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_PO_BASE([DIR])
|
||||||
|
AC_DEFUN([gl_PO_BASE], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_DOC_BASE([DIR])
|
||||||
|
AC_DEFUN([gl_DOC_BASE], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_TESTS_BASE([DIR])
|
||||||
|
AC_DEFUN([gl_TESTS_BASE], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_WITH_TESTS
|
||||||
|
AC_DEFUN([gl_WITH_TESTS], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_LIB([LIBNAME])
|
||||||
|
AC_DEFUN([gl_LIB], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_LGPL or gl_LGPL([VERSION])
|
||||||
|
AC_DEFUN([gl_LGPL], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_MAKEFILE_NAME([FILENAME])
|
||||||
|
AC_DEFUN([gl_MAKEFILE_NAME], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_LIBTOOL
|
||||||
|
AC_DEFUN([gl_LIBTOOL], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_MACRO_PREFIX([PREFIX])
|
||||||
|
AC_DEFUN([gl_MACRO_PREFIX], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_PO_DOMAIN([DOMAIN])
|
||||||
|
AC_DEFUN([gl_PO_DOMAIN], [])
|
||||||
|
|
||||||
|
dnl Usage: gl_VC_FILES([BOOLEAN])
|
||||||
|
AC_DEFUN([gl_VC_FILES], [])
|
||||||
270
m4/include_next.m4
Normal file
270
m4/include_next.m4
Normal file
|
|
@ -0,0 +1,270 @@
|
||||||
|
# include_next.m4 serial 23
|
||||||
|
dnl Copyright (C) 2006-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
dnl From Paul Eggert and Derek Price.
|
||||||
|
|
||||||
|
dnl Sets INCLUDE_NEXT and PRAGMA_SYSTEM_HEADER.
|
||||||
|
dnl
|
||||||
|
dnl INCLUDE_NEXT expands to 'include_next' if the compiler supports it, or to
|
||||||
|
dnl 'include' otherwise.
|
||||||
|
dnl
|
||||||
|
dnl INCLUDE_NEXT_AS_FIRST_DIRECTIVE expands to 'include_next' if the compiler
|
||||||
|
dnl supports it in the special case that it is the first include directive in
|
||||||
|
dnl the given file, or to 'include' otherwise.
|
||||||
|
dnl
|
||||||
|
dnl PRAGMA_SYSTEM_HEADER can be used in files that contain #include_next,
|
||||||
|
dnl so as to avoid GCC warnings when the gcc option -pedantic is used.
|
||||||
|
dnl '#pragma GCC system_header' has the same effect as if the file was found
|
||||||
|
dnl through the include search path specified with '-isystem' options (as
|
||||||
|
dnl opposed to the search path specified with '-I' options). Namely, gcc
|
||||||
|
dnl does not warn about some things, and on some systems (Solaris and Interix)
|
||||||
|
dnl __STDC__ evaluates to 0 instead of to 1. The latter is an undesired side
|
||||||
|
dnl effect; we are therefore careful to use 'defined __STDC__' or '1' instead
|
||||||
|
dnl of plain '__STDC__'.
|
||||||
|
dnl
|
||||||
|
dnl PRAGMA_COLUMNS can be used in files that override system header files, so
|
||||||
|
dnl as to avoid compilation errors on HP NonStop systems when the gnulib file
|
||||||
|
dnl is included by a system header file that does a "#pragma COLUMNS 80" (which
|
||||||
|
dnl has the effect of truncating the lines of that file and all files that it
|
||||||
|
dnl includes to 80 columns) and the gnulib file has lines longer than 80
|
||||||
|
dnl columns.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_INCLUDE_NEXT],
|
||||||
|
[
|
||||||
|
AC_LANG_PREPROC_REQUIRE()
|
||||||
|
AC_CACHE_CHECK([whether the preprocessor supports include_next],
|
||||||
|
[gl_cv_have_include_next],
|
||||||
|
[rm -rf conftestd1a conftestd1b conftestd2
|
||||||
|
mkdir conftestd1a conftestd1b conftestd2
|
||||||
|
dnl IBM C 9.0, 10.1 (original versions, prior to the 2009-01 updates) on
|
||||||
|
dnl AIX 6.1 support include_next when used as first preprocessor directive
|
||||||
|
dnl in a file, but not when preceded by another include directive. Check
|
||||||
|
dnl for this bug by including <stdio.h>.
|
||||||
|
dnl Additionally, with this same compiler, include_next is a no-op when
|
||||||
|
dnl used in a header file that was included by specifying its absolute
|
||||||
|
dnl file name. Despite these two bugs, include_next is used in the
|
||||||
|
dnl compiler's <math.h>. By virtue of the second bug, we need to use
|
||||||
|
dnl include_next as well in this case.
|
||||||
|
cat <<EOF > conftestd1a/conftest.h
|
||||||
|
#define DEFINED_IN_CONFTESTD1
|
||||||
|
#include_next <conftest.h>
|
||||||
|
#ifdef DEFINED_IN_CONFTESTD2
|
||||||
|
int foo;
|
||||||
|
#else
|
||||||
|
#error "include_next doesn't work"
|
||||||
|
#endif
|
||||||
|
EOF
|
||||||
|
cat <<EOF > conftestd1b/conftest.h
|
||||||
|
#define DEFINED_IN_CONFTESTD1
|
||||||
|
#include <stdio.h>
|
||||||
|
#include_next <conftest.h>
|
||||||
|
#ifdef DEFINED_IN_CONFTESTD2
|
||||||
|
int foo;
|
||||||
|
#else
|
||||||
|
#error "include_next doesn't work"
|
||||||
|
#endif
|
||||||
|
EOF
|
||||||
|
cat <<EOF > conftestd2/conftest.h
|
||||||
|
#ifndef DEFINED_IN_CONFTESTD1
|
||||||
|
#error "include_next test doesn't work"
|
||||||
|
#endif
|
||||||
|
#define DEFINED_IN_CONFTESTD2
|
||||||
|
EOF
|
||||||
|
gl_save_CPPFLAGS="$CPPFLAGS"
|
||||||
|
CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2"
|
||||||
|
dnl We intentionally avoid using AC_LANG_SOURCE here.
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include <conftest.h>]],
|
||||||
|
[gl_cv_have_include_next=yes],
|
||||||
|
[CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2"
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include <conftest.h>]],
|
||||||
|
[gl_cv_have_include_next=buggy],
|
||||||
|
[gl_cv_have_include_next=no])
|
||||||
|
])
|
||||||
|
CPPFLAGS="$gl_save_CPPFLAGS"
|
||||||
|
rm -rf conftestd1a conftestd1b conftestd2
|
||||||
|
])
|
||||||
|
PRAGMA_SYSTEM_HEADER=
|
||||||
|
if test $gl_cv_have_include_next = yes; then
|
||||||
|
INCLUDE_NEXT=include_next
|
||||||
|
INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
|
||||||
|
if test -n "$GCC"; then
|
||||||
|
PRAGMA_SYSTEM_HEADER='#pragma GCC system_header'
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if test $gl_cv_have_include_next = buggy; then
|
||||||
|
INCLUDE_NEXT=include
|
||||||
|
INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
|
||||||
|
else
|
||||||
|
INCLUDE_NEXT=include
|
||||||
|
INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AC_SUBST([INCLUDE_NEXT])
|
||||||
|
AC_SUBST([INCLUDE_NEXT_AS_FIRST_DIRECTIVE])
|
||||||
|
AC_SUBST([PRAGMA_SYSTEM_HEADER])
|
||||||
|
AC_CACHE_CHECK([whether system header files limit the line length],
|
||||||
|
[gl_cv_pragma_columns],
|
||||||
|
[dnl HP NonStop systems, which define __TANDEM, have this misfeature.
|
||||||
|
AC_EGREP_CPP([choke me],
|
||||||
|
[
|
||||||
|
#ifdef __TANDEM
|
||||||
|
choke me
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
[gl_cv_pragma_columns=yes],
|
||||||
|
[gl_cv_pragma_columns=no])
|
||||||
|
])
|
||||||
|
if test $gl_cv_pragma_columns = yes; then
|
||||||
|
PRAGMA_COLUMNS="#pragma COLUMNS 10000"
|
||||||
|
else
|
||||||
|
PRAGMA_COLUMNS=
|
||||||
|
fi
|
||||||
|
AC_SUBST([PRAGMA_COLUMNS])
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_CHECK_NEXT_HEADERS(HEADER1 HEADER2 ...)
|
||||||
|
# ------------------------------------------
|
||||||
|
# For each arg foo.h, if #include_next works, define NEXT_FOO_H to be
|
||||||
|
# '<foo.h>'; otherwise define it to be
|
||||||
|
# '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
|
||||||
|
# Also, if #include_next works as first preprocessing directive in a file,
|
||||||
|
# define NEXT_AS_FIRST_DIRECTIVE_FOO_H to be '<foo.h>'; otherwise define it to
|
||||||
|
# be
|
||||||
|
# '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
|
||||||
|
# That way, a header file with the following line:
|
||||||
|
# #@INCLUDE_NEXT@ @NEXT_FOO_H@
|
||||||
|
# or
|
||||||
|
# #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_FOO_H@
|
||||||
|
# behaves (after sed substitution) as if it contained
|
||||||
|
# #include_next <foo.h>
|
||||||
|
# even if the compiler does not support include_next.
|
||||||
|
# The three "///" are to pacify Sun C 5.8, which otherwise would say
|
||||||
|
# "warning: #include of /usr/include/... may be non-portable".
|
||||||
|
# Use '""', not '<>', so that the /// cannot be confused with a C99 comment.
|
||||||
|
# Note: This macro assumes that the header file is not empty after
|
||||||
|
# preprocessing, i.e. it does not only define preprocessor macros but also
|
||||||
|
# provides some type/enum definitions or function/variable declarations.
|
||||||
|
#
|
||||||
|
# This macro also checks whether each header exists, by invoking
|
||||||
|
# AC_CHECK_HEADERS_ONCE or AC_CHECK_HEADERS on each argument.
|
||||||
|
AC_DEFUN([gl_CHECK_NEXT_HEADERS],
|
||||||
|
[
|
||||||
|
gl_NEXT_HEADERS_INTERNAL([$1], [check])
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_NEXT_HEADERS(HEADER1 HEADER2 ...)
|
||||||
|
# ------------------------------------
|
||||||
|
# Like gl_CHECK_NEXT_HEADERS, except do not check whether the headers exist.
|
||||||
|
# This is suitable for headers like <stddef.h> that are standardized by C89
|
||||||
|
# and therefore can be assumed to exist.
|
||||||
|
AC_DEFUN([gl_NEXT_HEADERS],
|
||||||
|
[
|
||||||
|
gl_NEXT_HEADERS_INTERNAL([$1], [assume])
|
||||||
|
])
|
||||||
|
|
||||||
|
# The guts of gl_CHECK_NEXT_HEADERS and gl_NEXT_HEADERS.
|
||||||
|
AC_DEFUN([gl_NEXT_HEADERS_INTERNAL],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_INCLUDE_NEXT])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
|
|
||||||
|
m4_if([$2], [check],
|
||||||
|
[AC_CHECK_HEADERS_ONCE([$1])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl FIXME: gl_next_header and gl_header_exists must be used unquoted
|
||||||
|
dnl until we can assume autoconf 2.64 or newer.
|
||||||
|
m4_foreach_w([gl_HEADER_NAME], [$1],
|
||||||
|
[AS_VAR_PUSHDEF([gl_next_header],
|
||||||
|
[gl_cv_next_]m4_defn([gl_HEADER_NAME]))
|
||||||
|
if test $gl_cv_have_include_next = yes; then
|
||||||
|
AS_VAR_SET(gl_next_header, ['<'gl_HEADER_NAME'>'])
|
||||||
|
else
|
||||||
|
AC_CACHE_CHECK(
|
||||||
|
[absolute name of <]m4_defn([gl_HEADER_NAME])[>],
|
||||||
|
m4_defn([gl_next_header]),
|
||||||
|
[m4_if([$2], [check],
|
||||||
|
[AS_VAR_PUSHDEF([gl_header_exists],
|
||||||
|
[ac_cv_header_]m4_defn([gl_HEADER_NAME]))
|
||||||
|
if test AS_VAR_GET(gl_header_exists) = yes; then
|
||||||
|
AS_VAR_POPDEF([gl_header_exists])
|
||||||
|
])
|
||||||
|
AC_LANG_CONFTEST(
|
||||||
|
[AC_LANG_SOURCE(
|
||||||
|
[[#include <]]m4_dquote(m4_defn([gl_HEADER_NAME]))[[>]]
|
||||||
|
)])
|
||||||
|
dnl AIX "xlc -E" and "cc -E" omit #line directives for header
|
||||||
|
dnl files that contain only a #include of other header files and
|
||||||
|
dnl no non-comment tokens of their own. This leads to a failure
|
||||||
|
dnl to detect the absolute name of <dirent.h>, <signal.h>,
|
||||||
|
dnl <poll.h> and others. The workaround is to force preservation
|
||||||
|
dnl of comments through option -C. This ensures all necessary
|
||||||
|
dnl #line directives are present. GCC supports option -C as well.
|
||||||
|
case "$host_os" in
|
||||||
|
aix*) gl_absname_cpp="$ac_cpp -C" ;;
|
||||||
|
*) gl_absname_cpp="$ac_cpp" ;;
|
||||||
|
esac
|
||||||
|
changequote(,)
|
||||||
|
case "$host_os" in
|
||||||
|
mingw*)
|
||||||
|
dnl For the sake of native Windows compilers (excluding gcc),
|
||||||
|
dnl treat backslash as a directory separator, like /.
|
||||||
|
dnl Actually, these compilers use a double-backslash as
|
||||||
|
dnl directory separator, inside the
|
||||||
|
dnl # line "filename"
|
||||||
|
dnl directives.
|
||||||
|
gl_dirsep_regex='[/\\]'
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
gl_dirsep_regex='\/'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
dnl A sed expression that turns a string into a basic regular
|
||||||
|
dnl expression, for use within "/.../".
|
||||||
|
gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
|
||||||
|
changequote([,])
|
||||||
|
gl_header_literal_regex=`echo ']m4_defn([gl_HEADER_NAME])[' \
|
||||||
|
| sed -e "$gl_make_literal_regex_sed"`
|
||||||
|
gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
|
||||||
|
s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
|
||||||
|
changequote(,)dnl
|
||||||
|
s|^/[^/]|//&|
|
||||||
|
changequote([,])dnl
|
||||||
|
p
|
||||||
|
q
|
||||||
|
}'
|
||||||
|
dnl eval is necessary to expand gl_absname_cpp.
|
||||||
|
dnl Ultrix and Pyramid sh refuse to redirect output of eval,
|
||||||
|
dnl so use subshell.
|
||||||
|
AS_VAR_SET(gl_next_header,
|
||||||
|
['"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
|
||||||
|
sed -n "$gl_absolute_header_sed"`'"'])
|
||||||
|
m4_if([$2], [check],
|
||||||
|
[else
|
||||||
|
AS_VAR_SET(gl_next_header, ['<'gl_HEADER_NAME'>'])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
AC_SUBST(
|
||||||
|
AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])),
|
||||||
|
[AS_VAR_GET(gl_next_header)])
|
||||||
|
if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
|
||||||
|
# INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
|
||||||
|
gl_next_as_first_directive='<'gl_HEADER_NAME'>'
|
||||||
|
else
|
||||||
|
# INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
|
||||||
|
gl_next_as_first_directive=AS_VAR_GET(gl_next_header)
|
||||||
|
fi
|
||||||
|
AC_SUBST(
|
||||||
|
AS_TR_CPP([NEXT_AS_FIRST_DIRECTIVE_]m4_defn([gl_HEADER_NAME])),
|
||||||
|
[$gl_next_as_first_directive])
|
||||||
|
AS_VAR_POPDEF([gl_next_header])])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Autoconf 2.68 added warnings for our use of AC_COMPILE_IFELSE;
|
||||||
|
# this fallback is safe for all earlier autoconf versions.
|
||||||
|
m4_define_default([AC_LANG_DEFINES_PROVIDED])
|
||||||
67
m4/intmax_t.m4
Normal file
67
m4/intmax_t.m4
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
# intmax_t.m4 serial 8
|
||||||
|
dnl Copyright (C) 1997-2004, 2006-2007, 2009-2012 Free Software Foundation,
|
||||||
|
dnl Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
dnl From Paul Eggert.
|
||||||
|
|
||||||
|
AC_PREREQ([2.53])
|
||||||
|
|
||||||
|
# Define intmax_t to 'long' or 'long long'
|
||||||
|
# if it is not already defined in <stdint.h> or <inttypes.h>.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_AC_TYPE_INTMAX_T],
|
||||||
|
[
|
||||||
|
dnl For simplicity, we assume that a header file defines 'intmax_t' if and
|
||||||
|
dnl only if it defines 'uintmax_t'.
|
||||||
|
AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
|
||||||
|
AC_REQUIRE([gl_AC_HEADER_STDINT_H])
|
||||||
|
if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
|
||||||
|
AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
|
||||||
|
test $ac_cv_type_long_long_int = yes \
|
||||||
|
&& ac_type='long long' \
|
||||||
|
|| ac_type='long'
|
||||||
|
AC_DEFINE_UNQUOTED([intmax_t], [$ac_type],
|
||||||
|
[Define to long or long long if <inttypes.h> and <stdint.h> don't define.])
|
||||||
|
else
|
||||||
|
AC_DEFINE([HAVE_INTMAX_T], [1],
|
||||||
|
[Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl An alternative would be to explicitly test for 'intmax_t'.
|
||||||
|
|
||||||
|
AC_DEFUN([gt_AC_TYPE_INTMAX_T],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
|
||||||
|
AC_REQUIRE([gl_AC_HEADER_STDINT_H])
|
||||||
|
AC_CACHE_CHECK([for intmax_t], [gt_cv_c_intmax_t],
|
||||||
|
[AC_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#if HAVE_STDINT_H_WITH_UINTMAX
|
||||||
|
#include <stdint.h>
|
||||||
|
#endif
|
||||||
|
#if HAVE_INTTYPES_H_WITH_UINTMAX
|
||||||
|
#include <inttypes.h>
|
||||||
|
#endif
|
||||||
|
]],
|
||||||
|
[[intmax_t x = -1; return !x;]])],
|
||||||
|
[gt_cv_c_intmax_t=yes],
|
||||||
|
[gt_cv_c_intmax_t=no])])
|
||||||
|
if test $gt_cv_c_intmax_t = yes; then
|
||||||
|
AC_DEFINE([HAVE_INTMAX_T], [1],
|
||||||
|
[Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
|
||||||
|
else
|
||||||
|
AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
|
||||||
|
test $ac_cv_type_long_long_int = yes \
|
||||||
|
&& ac_type='long long' \
|
||||||
|
|| ac_type='long'
|
||||||
|
AC_DEFINE_UNQUOTED([intmax_t], [$ac_type],
|
||||||
|
[Define to long or long long if <stdint.h> and <inttypes.h> don't define.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
29
m4/inttypes_h.m4
Normal file
29
m4/inttypes_h.m4
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
# inttypes_h.m4 serial 10
|
||||||
|
dnl Copyright (C) 1997-2004, 2006, 2008-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
dnl From Paul Eggert.
|
||||||
|
|
||||||
|
# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
|
||||||
|
# doesn't clash with <sys/types.h>, and declares uintmax_t.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_AC_HEADER_INTTYPES_H],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([for inttypes.h], [gl_cv_header_inttypes_h],
|
||||||
|
[AC_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
]],
|
||||||
|
[[uintmax_t i = (uintmax_t) -1; return !i;]])],
|
||||||
|
[gl_cv_header_inttypes_h=yes],
|
||||||
|
[gl_cv_header_inttypes_h=no])])
|
||||||
|
if test $gl_cv_header_inttypes_h = yes; then
|
||||||
|
AC_DEFINE_UNQUOTED([HAVE_INTTYPES_H_WITH_UINTMAX], [1],
|
||||||
|
[Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
|
||||||
|
and declares uintmax_t. ])
|
||||||
|
fi
|
||||||
|
])
|
||||||
113
m4/longlong.m4
Normal file
113
m4/longlong.m4
Normal file
|
|
@ -0,0 +1,113 @@
|
||||||
|
# longlong.m4 serial 17
|
||||||
|
dnl Copyright (C) 1999-2007, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
dnl From Paul Eggert.
|
||||||
|
|
||||||
|
# Define HAVE_LONG_LONG_INT if 'long long int' works.
|
||||||
|
# This fixes a bug in Autoconf 2.61, and can be faster
|
||||||
|
# than what's in Autoconf 2.62 through 2.68.
|
||||||
|
|
||||||
|
# Note: If the type 'long long int' exists but is only 32 bits large
|
||||||
|
# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
|
||||||
|
# defined. In this case you can treat 'long long int' like 'long int'.
|
||||||
|
|
||||||
|
AC_DEFUN([AC_TYPE_LONG_LONG_INT],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
|
||||||
|
AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
|
||||||
|
[ac_cv_type_long_long_int=yes
|
||||||
|
if test "x${ac_cv_prog_cc_c99-no}" = xno; then
|
||||||
|
ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
|
||||||
|
if test $ac_cv_type_long_long_int = yes; then
|
||||||
|
dnl Catch a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
|
||||||
|
dnl If cross compiling, assume the bug is not important, since
|
||||||
|
dnl nobody cross compiles for this platform as far as we know.
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[@%:@include <limits.h>
|
||||||
|
@%:@ifndef LLONG_MAX
|
||||||
|
@%:@ define HALF \
|
||||||
|
(1LL << (sizeof (long long int) * CHAR_BIT - 2))
|
||||||
|
@%:@ define LLONG_MAX (HALF - 1 + HALF)
|
||||||
|
@%:@endif]],
|
||||||
|
[[long long int n = 1;
|
||||||
|
int i;
|
||||||
|
for (i = 0; ; i++)
|
||||||
|
{
|
||||||
|
long long int m = n << i;
|
||||||
|
if (m >> i != n)
|
||||||
|
return 1;
|
||||||
|
if (LLONG_MAX / 2 < m)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;]])],
|
||||||
|
[],
|
||||||
|
[ac_cv_type_long_long_int=no],
|
||||||
|
[:])
|
||||||
|
fi
|
||||||
|
fi])
|
||||||
|
if test $ac_cv_type_long_long_int = yes; then
|
||||||
|
AC_DEFINE([HAVE_LONG_LONG_INT], [1],
|
||||||
|
[Define to 1 if the system has the type 'long long int'.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
|
||||||
|
# This fixes a bug in Autoconf 2.61, and can be faster
|
||||||
|
# than what's in Autoconf 2.62 through 2.68.
|
||||||
|
|
||||||
|
# Note: If the type 'unsigned long long int' exists but is only 32 bits
|
||||||
|
# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
|
||||||
|
# will not be defined. In this case you can treat 'unsigned long long int'
|
||||||
|
# like 'unsigned long int'.
|
||||||
|
|
||||||
|
AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([for unsigned long long int],
|
||||||
|
[ac_cv_type_unsigned_long_long_int],
|
||||||
|
[ac_cv_type_unsigned_long_long_int=yes
|
||||||
|
if test "x${ac_cv_prog_cc_c99-no}" = xno; then
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[_AC_TYPE_LONG_LONG_SNIPPET],
|
||||||
|
[],
|
||||||
|
[ac_cv_type_unsigned_long_long_int=no])
|
||||||
|
fi])
|
||||||
|
if test $ac_cv_type_unsigned_long_long_int = yes; then
|
||||||
|
AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
|
||||||
|
[Define to 1 if the system has the type 'unsigned long long int'.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# Expands to a C program that can be used to test for simultaneous support
|
||||||
|
# of 'long long' and 'unsigned long long'. We don't want to say that
|
||||||
|
# 'long long' is available if 'unsigned long long' is not, or vice versa,
|
||||||
|
# because too many programs rely on the symmetry between signed and unsigned
|
||||||
|
# integer types (excluding 'bool').
|
||||||
|
AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
|
||||||
|
[
|
||||||
|
AC_LANG_PROGRAM(
|
||||||
|
[[/* For now, do not test the preprocessor; as of 2007 there are too many
|
||||||
|
implementations with broken preprocessors. Perhaps this can
|
||||||
|
be revisited in 2012. In the meantime, code should not expect
|
||||||
|
#if to work with literals wider than 32 bits. */
|
||||||
|
/* Test literals. */
|
||||||
|
long long int ll = 9223372036854775807ll;
|
||||||
|
long long int nll = -9223372036854775807LL;
|
||||||
|
unsigned long long int ull = 18446744073709551615ULL;
|
||||||
|
/* Test constant expressions. */
|
||||||
|
typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
|
||||||
|
? 1 : -1)];
|
||||||
|
typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
|
||||||
|
? 1 : -1)];
|
||||||
|
int i = 63;]],
|
||||||
|
[[/* Test availability of runtime routines for shift and division. */
|
||||||
|
long long int llmax = 9223372036854775807ll;
|
||||||
|
unsigned long long int ullmax = 18446744073709551615ull;
|
||||||
|
return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
|
||||||
|
| (llmax / ll) | (llmax % ll)
|
||||||
|
| (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
|
||||||
|
| (ullmax / ull) | (ullmax % ull));]])
|
||||||
|
])
|
||||||
98
m4/malloc.m4
Normal file
98
m4/malloc.m4
Normal file
|
|
@ -0,0 +1,98 @@
|
||||||
|
# malloc.m4 serial 14
|
||||||
|
dnl Copyright (C) 2007, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
m4_version_prereq([2.70], [] ,[
|
||||||
|
|
||||||
|
# This is taken from the following Autoconf patch:
|
||||||
|
# http://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=7fbb553727ed7e0e689a17594b58559ecf3ea6e9
|
||||||
|
AC_DEFUN([_AC_FUNC_MALLOC_IF],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_HEADER_STDC])dnl
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles
|
||||||
|
AC_CHECK_HEADERS([stdlib.h])
|
||||||
|
AC_CACHE_CHECK([for GNU libc compatible malloc],
|
||||||
|
[ac_cv_func_malloc_0_nonnull],
|
||||||
|
[AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#if defined STDC_HEADERS || defined HAVE_STDLIB_H
|
||||||
|
# include <stdlib.h>
|
||||||
|
#else
|
||||||
|
char *malloc ();
|
||||||
|
#endif
|
||||||
|
]],
|
||||||
|
[[return ! malloc (0);]])
|
||||||
|
],
|
||||||
|
[ac_cv_func_malloc_0_nonnull=yes],
|
||||||
|
[ac_cv_func_malloc_0_nonnull=no],
|
||||||
|
[case "$host_os" in
|
||||||
|
# Guess yes on platforms where we know the result.
|
||||||
|
*-gnu* | freebsd* | netbsd* | openbsd* \
|
||||||
|
| hpux* | solaris* | cygwin* | mingw*)
|
||||||
|
ac_cv_func_malloc_0_nonnull=yes ;;
|
||||||
|
# If we don't know, assume the worst.
|
||||||
|
*) ac_cv_func_malloc_0_nonnull=no ;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
])
|
||||||
|
AS_IF([test $ac_cv_func_malloc_0_nonnull = yes], [$1], [$2])
|
||||||
|
])# _AC_FUNC_MALLOC_IF
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_FUNC_MALLOC_GNU
|
||||||
|
# ------------------
|
||||||
|
# Test whether 'malloc (0)' is handled like in GNU libc, and replace malloc if
|
||||||
|
# it is not.
|
||||||
|
AC_DEFUN([gl_FUNC_MALLOC_GNU],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
|
||||||
|
dnl _AC_FUNC_MALLOC_IF is defined in Autoconf.
|
||||||
|
_AC_FUNC_MALLOC_IF(
|
||||||
|
[AC_DEFINE([HAVE_MALLOC_GNU], [1],
|
||||||
|
[Define to 1 if your system has a GNU libc compatible 'malloc'
|
||||||
|
function, and to 0 otherwise.])],
|
||||||
|
[AC_DEFINE([HAVE_MALLOC_GNU], [0])
|
||||||
|
REPLACE_MALLOC=1
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_FUNC_MALLOC_POSIX
|
||||||
|
# --------------------
|
||||||
|
# Test whether 'malloc' is POSIX compliant (sets errno to ENOMEM when it
|
||||||
|
# fails), and replace malloc if it is not.
|
||||||
|
AC_DEFUN([gl_FUNC_MALLOC_POSIX],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
|
||||||
|
AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
|
||||||
|
if test $gl_cv_func_malloc_posix = yes; then
|
||||||
|
AC_DEFINE([HAVE_MALLOC_POSIX], [1],
|
||||||
|
[Define if the 'malloc' function is POSIX compliant.])
|
||||||
|
else
|
||||||
|
REPLACE_MALLOC=1
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# Test whether malloc, realloc, calloc are POSIX compliant,
|
||||||
|
# Set gl_cv_func_malloc_posix to yes or no accordingly.
|
||||||
|
AC_DEFUN([gl_CHECK_MALLOC_POSIX],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([whether malloc, realloc, calloc are POSIX compliant],
|
||||||
|
[gl_cv_func_malloc_posix],
|
||||||
|
[
|
||||||
|
dnl It is too dangerous to try to allocate a large amount of memory:
|
||||||
|
dnl some systems go to their knees when you do that. So assume that
|
||||||
|
dnl all Unix implementations of the function are POSIX compliant.
|
||||||
|
AC_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[]],
|
||||||
|
[[#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||||
|
choke me
|
||||||
|
#endif
|
||||||
|
]])],
|
||||||
|
[gl_cv_func_malloc_posix=yes],
|
||||||
|
[gl_cv_func_malloc_posix=no])
|
||||||
|
])
|
||||||
|
])
|
||||||
354
m4/math_h.m4
Normal file
354
m4/math_h.m4
Normal file
|
|
@ -0,0 +1,354 @@
|
||||||
|
# math_h.m4 serial 113
|
||||||
|
dnl Copyright (C) 2007-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_MATH_H],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_MATH_H_DEFAULTS])
|
||||||
|
gl_CHECK_NEXT_HEADERS([math.h])
|
||||||
|
AC_REQUIRE([AC_C_INLINE])
|
||||||
|
|
||||||
|
AC_CACHE_CHECK([whether NAN macro works], [gl_cv_header_math_nan_works],
|
||||||
|
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h>]],
|
||||||
|
[[/* Solaris 10 has a broken definition of NAN. Other platforms
|
||||||
|
fail to provide NAN, or provide it only in C99 mode; this
|
||||||
|
test only needs to fail when NAN is provided but wrong. */
|
||||||
|
float f = 1.0f;
|
||||||
|
#ifdef NAN
|
||||||
|
f = NAN;
|
||||||
|
#endif
|
||||||
|
return f == 0;]])],
|
||||||
|
[gl_cv_header_math_nan_works=yes],
|
||||||
|
[gl_cv_header_math_nan_works=no])])
|
||||||
|
if test $gl_cv_header_math_nan_works = no; then
|
||||||
|
REPLACE_NAN=1
|
||||||
|
fi
|
||||||
|
AC_CACHE_CHECK([whether HUGE_VAL works], [gl_cv_header_math_huge_val_works],
|
||||||
|
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h>]],
|
||||||
|
[[/* Solaris 10 has a broken definition of HUGE_VAL. */
|
||||||
|
double d = HUGE_VAL;
|
||||||
|
return d == 0;]])],
|
||||||
|
[gl_cv_header_math_huge_val_works=yes],
|
||||||
|
[gl_cv_header_math_huge_val_works=no])])
|
||||||
|
if test $gl_cv_header_math_huge_val_works = no; then
|
||||||
|
REPLACE_HUGE_VAL=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Check for declarations of anything we want to poison if the
|
||||||
|
dnl corresponding gnulib module is not in use.
|
||||||
|
gl_WARN_ON_USE_PREPARE([[#include <math.h>]],
|
||||||
|
[acosf acosl asinf asinl atanf atanl
|
||||||
|
cbrt cbrtf cbrtl ceilf ceill copysign copysignf copysignl cosf cosl coshf
|
||||||
|
expf expl exp2 exp2f exp2l expm1 expm1f expm1l
|
||||||
|
fabsf fabsl floorf floorl fma fmaf fmal
|
||||||
|
fmod fmodf fmodl frexpf frexpl hypotf hypotl
|
||||||
|
ilogb ilogbf ilogbl
|
||||||
|
ldexpf ldexpl
|
||||||
|
log logf logl log10 log10f log10l log1p log1pf log1pl log2 log2f log2l
|
||||||
|
logb logbf logbl
|
||||||
|
modf modff modfl powf
|
||||||
|
remainder remainderf remainderl
|
||||||
|
rint rintf rintl round roundf roundl sinf sinl sinhf sqrtf sqrtl
|
||||||
|
tanf tanl tanhf trunc truncf truncl])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_MATH_MODULE_INDICATOR],
|
||||||
|
[
|
||||||
|
dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
|
||||||
|
AC_REQUIRE([gl_MATH_H_DEFAULTS])
|
||||||
|
gl_MODULE_INDICATOR_SET_VARIABLE([$1])
|
||||||
|
dnl Define it also as a C macro, for the benefit of the unit tests.
|
||||||
|
gl_MODULE_INDICATOR_FOR_TESTS([$1])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_MATH_H_DEFAULTS],
|
||||||
|
[
|
||||||
|
GNULIB_ACOSF=0; AC_SUBST([GNULIB_ACOSF])
|
||||||
|
GNULIB_ACOSL=0; AC_SUBST([GNULIB_ACOSL])
|
||||||
|
GNULIB_ASINF=0; AC_SUBST([GNULIB_ASINF])
|
||||||
|
GNULIB_ASINL=0; AC_SUBST([GNULIB_ASINL])
|
||||||
|
GNULIB_ATANF=0; AC_SUBST([GNULIB_ATANF])
|
||||||
|
GNULIB_ATANL=0; AC_SUBST([GNULIB_ATANL])
|
||||||
|
GNULIB_ATAN2F=0; AC_SUBST([GNULIB_ATAN2F])
|
||||||
|
GNULIB_CBRT=0; AC_SUBST([GNULIB_CBRT])
|
||||||
|
GNULIB_CBRTF=0; AC_SUBST([GNULIB_CBRTF])
|
||||||
|
GNULIB_CBRTL=0; AC_SUBST([GNULIB_CBRTL])
|
||||||
|
GNULIB_CEIL=0; AC_SUBST([GNULIB_CEIL])
|
||||||
|
GNULIB_CEILF=0; AC_SUBST([GNULIB_CEILF])
|
||||||
|
GNULIB_CEILL=0; AC_SUBST([GNULIB_CEILL])
|
||||||
|
GNULIB_COPYSIGN=0; AC_SUBST([GNULIB_COPYSIGN])
|
||||||
|
GNULIB_COPYSIGNF=0; AC_SUBST([GNULIB_COPYSIGNF])
|
||||||
|
GNULIB_COPYSIGNL=0; AC_SUBST([GNULIB_COPYSIGNL])
|
||||||
|
GNULIB_COSF=0; AC_SUBST([GNULIB_COSF])
|
||||||
|
GNULIB_COSL=0; AC_SUBST([GNULIB_COSL])
|
||||||
|
GNULIB_COSHF=0; AC_SUBST([GNULIB_COSHF])
|
||||||
|
GNULIB_EXPF=0; AC_SUBST([GNULIB_EXPF])
|
||||||
|
GNULIB_EXPL=0; AC_SUBST([GNULIB_EXPL])
|
||||||
|
GNULIB_EXP2=0; AC_SUBST([GNULIB_EXP2])
|
||||||
|
GNULIB_EXP2F=0; AC_SUBST([GNULIB_EXP2F])
|
||||||
|
GNULIB_EXP2L=0; AC_SUBST([GNULIB_EXP2L])
|
||||||
|
GNULIB_EXPM1=0; AC_SUBST([GNULIB_EXPM1])
|
||||||
|
GNULIB_EXPM1F=0; AC_SUBST([GNULIB_EXPM1F])
|
||||||
|
GNULIB_EXPM1L=0; AC_SUBST([GNULIB_EXPM1L])
|
||||||
|
GNULIB_FABSF=0; AC_SUBST([GNULIB_FABSF])
|
||||||
|
GNULIB_FABSL=0; AC_SUBST([GNULIB_FABSL])
|
||||||
|
GNULIB_FLOOR=0; AC_SUBST([GNULIB_FLOOR])
|
||||||
|
GNULIB_FLOORF=0; AC_SUBST([GNULIB_FLOORF])
|
||||||
|
GNULIB_FLOORL=0; AC_SUBST([GNULIB_FLOORL])
|
||||||
|
GNULIB_FMA=0; AC_SUBST([GNULIB_FMA])
|
||||||
|
GNULIB_FMAF=0; AC_SUBST([GNULIB_FMAF])
|
||||||
|
GNULIB_FMAL=0; AC_SUBST([GNULIB_FMAL])
|
||||||
|
GNULIB_FMOD=0; AC_SUBST([GNULIB_FMOD])
|
||||||
|
GNULIB_FMODF=0; AC_SUBST([GNULIB_FMODF])
|
||||||
|
GNULIB_FMODL=0; AC_SUBST([GNULIB_FMODL])
|
||||||
|
GNULIB_FREXPF=0; AC_SUBST([GNULIB_FREXPF])
|
||||||
|
GNULIB_FREXP=0; AC_SUBST([GNULIB_FREXP])
|
||||||
|
GNULIB_FREXPL=0; AC_SUBST([GNULIB_FREXPL])
|
||||||
|
GNULIB_HYPOT=0; AC_SUBST([GNULIB_HYPOT])
|
||||||
|
GNULIB_HYPOTF=0; AC_SUBST([GNULIB_HYPOTF])
|
||||||
|
GNULIB_HYPOTL=0; AC_SUBST([GNULIB_HYPOTL])
|
||||||
|
GNULIB_ILOGB=0; AC_SUBST([GNULIB_ILOGB])
|
||||||
|
GNULIB_ILOGBF=0; AC_SUBST([GNULIB_ILOGBF])
|
||||||
|
GNULIB_ILOGBL=0; AC_SUBST([GNULIB_ILOGBL])
|
||||||
|
GNULIB_ISFINITE=0; AC_SUBST([GNULIB_ISFINITE])
|
||||||
|
GNULIB_ISINF=0; AC_SUBST([GNULIB_ISINF])
|
||||||
|
GNULIB_ISNAN=0; AC_SUBST([GNULIB_ISNAN])
|
||||||
|
GNULIB_ISNANF=0; AC_SUBST([GNULIB_ISNANF])
|
||||||
|
GNULIB_ISNAND=0; AC_SUBST([GNULIB_ISNAND])
|
||||||
|
GNULIB_ISNANL=0; AC_SUBST([GNULIB_ISNANL])
|
||||||
|
GNULIB_LDEXPF=0; AC_SUBST([GNULIB_LDEXPF])
|
||||||
|
GNULIB_LDEXPL=0; AC_SUBST([GNULIB_LDEXPL])
|
||||||
|
GNULIB_LOG=0; AC_SUBST([GNULIB_LOG])
|
||||||
|
GNULIB_LOGF=0; AC_SUBST([GNULIB_LOGF])
|
||||||
|
GNULIB_LOGL=0; AC_SUBST([GNULIB_LOGL])
|
||||||
|
GNULIB_LOG10=0; AC_SUBST([GNULIB_LOG10])
|
||||||
|
GNULIB_LOG10F=0; AC_SUBST([GNULIB_LOG10F])
|
||||||
|
GNULIB_LOG10L=0; AC_SUBST([GNULIB_LOG10L])
|
||||||
|
GNULIB_LOG1P=0; AC_SUBST([GNULIB_LOG1P])
|
||||||
|
GNULIB_LOG1PF=0; AC_SUBST([GNULIB_LOG1PF])
|
||||||
|
GNULIB_LOG1PL=0; AC_SUBST([GNULIB_LOG1PL])
|
||||||
|
GNULIB_LOG2=0; AC_SUBST([GNULIB_LOG2])
|
||||||
|
GNULIB_LOG2F=0; AC_SUBST([GNULIB_LOG2F])
|
||||||
|
GNULIB_LOG2L=0; AC_SUBST([GNULIB_LOG2L])
|
||||||
|
GNULIB_LOGB=0; AC_SUBST([GNULIB_LOGB])
|
||||||
|
GNULIB_LOGBF=0; AC_SUBST([GNULIB_LOGBF])
|
||||||
|
GNULIB_LOGBL=0; AC_SUBST([GNULIB_LOGBL])
|
||||||
|
GNULIB_MODF=0; AC_SUBST([GNULIB_MODF])
|
||||||
|
GNULIB_MODFF=0; AC_SUBST([GNULIB_MODFF])
|
||||||
|
GNULIB_MODFL=0; AC_SUBST([GNULIB_MODFL])
|
||||||
|
GNULIB_POWF=0; AC_SUBST([GNULIB_POWF])
|
||||||
|
GNULIB_REMAINDER=0; AC_SUBST([GNULIB_REMAINDER])
|
||||||
|
GNULIB_REMAINDERF=0; AC_SUBST([GNULIB_REMAINDERF])
|
||||||
|
GNULIB_REMAINDERL=0; AC_SUBST([GNULIB_REMAINDERL])
|
||||||
|
GNULIB_RINT=0; AC_SUBST([GNULIB_RINT])
|
||||||
|
GNULIB_RINTF=0; AC_SUBST([GNULIB_RINTF])
|
||||||
|
GNULIB_RINTL=0; AC_SUBST([GNULIB_RINTL])
|
||||||
|
GNULIB_ROUND=0; AC_SUBST([GNULIB_ROUND])
|
||||||
|
GNULIB_ROUNDF=0; AC_SUBST([GNULIB_ROUNDF])
|
||||||
|
GNULIB_ROUNDL=0; AC_SUBST([GNULIB_ROUNDL])
|
||||||
|
GNULIB_SIGNBIT=0; AC_SUBST([GNULIB_SIGNBIT])
|
||||||
|
GNULIB_SINF=0; AC_SUBST([GNULIB_SINF])
|
||||||
|
GNULIB_SINL=0; AC_SUBST([GNULIB_SINL])
|
||||||
|
GNULIB_SINHF=0; AC_SUBST([GNULIB_SINHF])
|
||||||
|
GNULIB_SQRTF=0; AC_SUBST([GNULIB_SQRTF])
|
||||||
|
GNULIB_SQRTL=0; AC_SUBST([GNULIB_SQRTL])
|
||||||
|
GNULIB_TANF=0; AC_SUBST([GNULIB_TANF])
|
||||||
|
GNULIB_TANL=0; AC_SUBST([GNULIB_TANL])
|
||||||
|
GNULIB_TANHF=0; AC_SUBST([GNULIB_TANHF])
|
||||||
|
GNULIB_TRUNC=0; AC_SUBST([GNULIB_TRUNC])
|
||||||
|
GNULIB_TRUNCF=0; AC_SUBST([GNULIB_TRUNCF])
|
||||||
|
GNULIB_TRUNCL=0; AC_SUBST([GNULIB_TRUNCL])
|
||||||
|
dnl Assume proper GNU behavior unless another module says otherwise.
|
||||||
|
HAVE_ACOSF=1; AC_SUBST([HAVE_ACOSF])
|
||||||
|
HAVE_ACOSL=1; AC_SUBST([HAVE_ACOSL])
|
||||||
|
HAVE_ASINF=1; AC_SUBST([HAVE_ASINF])
|
||||||
|
HAVE_ASINL=1; AC_SUBST([HAVE_ASINL])
|
||||||
|
HAVE_ATANF=1; AC_SUBST([HAVE_ATANF])
|
||||||
|
HAVE_ATANL=1; AC_SUBST([HAVE_ATANL])
|
||||||
|
HAVE_ATAN2F=1; AC_SUBST([HAVE_ATAN2F])
|
||||||
|
HAVE_CBRT=1; AC_SUBST([HAVE_CBRT])
|
||||||
|
HAVE_CBRTF=1; AC_SUBST([HAVE_CBRTF])
|
||||||
|
HAVE_CBRTL=1; AC_SUBST([HAVE_CBRTL])
|
||||||
|
HAVE_COPYSIGN=1; AC_SUBST([HAVE_COPYSIGN])
|
||||||
|
HAVE_COPYSIGNL=1; AC_SUBST([HAVE_COPYSIGNL])
|
||||||
|
HAVE_COSF=1; AC_SUBST([HAVE_COSF])
|
||||||
|
HAVE_COSL=1; AC_SUBST([HAVE_COSL])
|
||||||
|
HAVE_COSHF=1; AC_SUBST([HAVE_COSHF])
|
||||||
|
HAVE_EXPF=1; AC_SUBST([HAVE_EXPF])
|
||||||
|
HAVE_EXPL=1; AC_SUBST([HAVE_EXPL])
|
||||||
|
HAVE_EXPM1=1; AC_SUBST([HAVE_EXPM1])
|
||||||
|
HAVE_EXPM1F=1; AC_SUBST([HAVE_EXPM1F])
|
||||||
|
HAVE_FABSF=1; AC_SUBST([HAVE_FABSF])
|
||||||
|
HAVE_FABSL=1; AC_SUBST([HAVE_FABSL])
|
||||||
|
HAVE_FMA=1; AC_SUBST([HAVE_FMA])
|
||||||
|
HAVE_FMAF=1; AC_SUBST([HAVE_FMAF])
|
||||||
|
HAVE_FMAL=1; AC_SUBST([HAVE_FMAL])
|
||||||
|
HAVE_FMODF=1; AC_SUBST([HAVE_FMODF])
|
||||||
|
HAVE_FMODL=1; AC_SUBST([HAVE_FMODL])
|
||||||
|
HAVE_FREXPF=1; AC_SUBST([HAVE_FREXPF])
|
||||||
|
HAVE_HYPOTF=1; AC_SUBST([HAVE_HYPOTF])
|
||||||
|
HAVE_HYPOTL=1; AC_SUBST([HAVE_HYPOTL])
|
||||||
|
HAVE_ILOGB=1; AC_SUBST([HAVE_ILOGB])
|
||||||
|
HAVE_ILOGBF=1; AC_SUBST([HAVE_ILOGBF])
|
||||||
|
HAVE_ILOGBL=1; AC_SUBST([HAVE_ILOGBL])
|
||||||
|
HAVE_ISNANF=1; AC_SUBST([HAVE_ISNANF])
|
||||||
|
HAVE_ISNAND=1; AC_SUBST([HAVE_ISNAND])
|
||||||
|
HAVE_ISNANL=1; AC_SUBST([HAVE_ISNANL])
|
||||||
|
HAVE_LDEXPF=1; AC_SUBST([HAVE_LDEXPF])
|
||||||
|
HAVE_LOGF=1; AC_SUBST([HAVE_LOGF])
|
||||||
|
HAVE_LOGL=1; AC_SUBST([HAVE_LOGL])
|
||||||
|
HAVE_LOG10F=1; AC_SUBST([HAVE_LOG10F])
|
||||||
|
HAVE_LOG10L=1; AC_SUBST([HAVE_LOG10L])
|
||||||
|
HAVE_LOG1P=1; AC_SUBST([HAVE_LOG1P])
|
||||||
|
HAVE_LOG1PF=1; AC_SUBST([HAVE_LOG1PF])
|
||||||
|
HAVE_LOG1PL=1; AC_SUBST([HAVE_LOG1PL])
|
||||||
|
HAVE_LOGBF=1; AC_SUBST([HAVE_LOGBF])
|
||||||
|
HAVE_LOGBL=1; AC_SUBST([HAVE_LOGBL])
|
||||||
|
HAVE_MODFF=1; AC_SUBST([HAVE_MODFF])
|
||||||
|
HAVE_MODFL=1; AC_SUBST([HAVE_MODFL])
|
||||||
|
HAVE_POWF=1; AC_SUBST([HAVE_POWF])
|
||||||
|
HAVE_REMAINDER=1; AC_SUBST([HAVE_REMAINDER])
|
||||||
|
HAVE_REMAINDERF=1; AC_SUBST([HAVE_REMAINDERF])
|
||||||
|
HAVE_RINT=1; AC_SUBST([HAVE_RINT])
|
||||||
|
HAVE_RINTL=1; AC_SUBST([HAVE_RINTL])
|
||||||
|
HAVE_SINF=1; AC_SUBST([HAVE_SINF])
|
||||||
|
HAVE_SINL=1; AC_SUBST([HAVE_SINL])
|
||||||
|
HAVE_SINHF=1; AC_SUBST([HAVE_SINHF])
|
||||||
|
HAVE_SQRTF=1; AC_SUBST([HAVE_SQRTF])
|
||||||
|
HAVE_SQRTL=1; AC_SUBST([HAVE_SQRTL])
|
||||||
|
HAVE_TANF=1; AC_SUBST([HAVE_TANF])
|
||||||
|
HAVE_TANL=1; AC_SUBST([HAVE_TANL])
|
||||||
|
HAVE_TANHF=1; AC_SUBST([HAVE_TANHF])
|
||||||
|
HAVE_DECL_ACOSL=1; AC_SUBST([HAVE_DECL_ACOSL])
|
||||||
|
HAVE_DECL_ASINL=1; AC_SUBST([HAVE_DECL_ASINL])
|
||||||
|
HAVE_DECL_ATANL=1; AC_SUBST([HAVE_DECL_ATANL])
|
||||||
|
HAVE_DECL_CBRTF=1; AC_SUBST([HAVE_DECL_CBRTF])
|
||||||
|
HAVE_DECL_CBRTL=1; AC_SUBST([HAVE_DECL_CBRTL])
|
||||||
|
HAVE_DECL_CEILF=1; AC_SUBST([HAVE_DECL_CEILF])
|
||||||
|
HAVE_DECL_CEILL=1; AC_SUBST([HAVE_DECL_CEILL])
|
||||||
|
HAVE_DECL_COPYSIGNF=1; AC_SUBST([HAVE_DECL_COPYSIGNF])
|
||||||
|
HAVE_DECL_COSL=1; AC_SUBST([HAVE_DECL_COSL])
|
||||||
|
HAVE_DECL_EXPL=1; AC_SUBST([HAVE_DECL_EXPL])
|
||||||
|
HAVE_DECL_EXP2=1; AC_SUBST([HAVE_DECL_EXP2])
|
||||||
|
HAVE_DECL_EXP2F=1; AC_SUBST([HAVE_DECL_EXP2F])
|
||||||
|
HAVE_DECL_EXP2L=1; AC_SUBST([HAVE_DECL_EXP2L])
|
||||||
|
HAVE_DECL_EXPM1L=1; AC_SUBST([HAVE_DECL_EXPM1L])
|
||||||
|
HAVE_DECL_FLOORF=1; AC_SUBST([HAVE_DECL_FLOORF])
|
||||||
|
HAVE_DECL_FLOORL=1; AC_SUBST([HAVE_DECL_FLOORL])
|
||||||
|
HAVE_DECL_FREXPL=1; AC_SUBST([HAVE_DECL_FREXPL])
|
||||||
|
HAVE_DECL_LDEXPL=1; AC_SUBST([HAVE_DECL_LDEXPL])
|
||||||
|
HAVE_DECL_LOGL=1; AC_SUBST([HAVE_DECL_LOGL])
|
||||||
|
HAVE_DECL_LOG10L=1; AC_SUBST([HAVE_DECL_LOG10L])
|
||||||
|
HAVE_DECL_LOG2=1; AC_SUBST([HAVE_DECL_LOG2])
|
||||||
|
HAVE_DECL_LOG2F=1; AC_SUBST([HAVE_DECL_LOG2F])
|
||||||
|
HAVE_DECL_LOG2L=1; AC_SUBST([HAVE_DECL_LOG2L])
|
||||||
|
HAVE_DECL_LOGB=1; AC_SUBST([HAVE_DECL_LOGB])
|
||||||
|
HAVE_DECL_REMAINDER=1; AC_SUBST([HAVE_DECL_REMAINDER])
|
||||||
|
HAVE_DECL_REMAINDERL=1; AC_SUBST([HAVE_DECL_REMAINDERL])
|
||||||
|
HAVE_DECL_RINTF=1; AC_SUBST([HAVE_DECL_RINTF])
|
||||||
|
HAVE_DECL_ROUND=1; AC_SUBST([HAVE_DECL_ROUND])
|
||||||
|
HAVE_DECL_ROUNDF=1; AC_SUBST([HAVE_DECL_ROUNDF])
|
||||||
|
HAVE_DECL_ROUNDL=1; AC_SUBST([HAVE_DECL_ROUNDL])
|
||||||
|
HAVE_DECL_SINL=1; AC_SUBST([HAVE_DECL_SINL])
|
||||||
|
HAVE_DECL_SQRTL=1; AC_SUBST([HAVE_DECL_SQRTL])
|
||||||
|
HAVE_DECL_TANL=1; AC_SUBST([HAVE_DECL_TANL])
|
||||||
|
HAVE_DECL_TRUNC=1; AC_SUBST([HAVE_DECL_TRUNC])
|
||||||
|
HAVE_DECL_TRUNCF=1; AC_SUBST([HAVE_DECL_TRUNCF])
|
||||||
|
HAVE_DECL_TRUNCL=1; AC_SUBST([HAVE_DECL_TRUNCL])
|
||||||
|
REPLACE_CBRTF=0; AC_SUBST([REPLACE_CBRTF])
|
||||||
|
REPLACE_CBRTL=0; AC_SUBST([REPLACE_CBRTL])
|
||||||
|
REPLACE_CEIL=0; AC_SUBST([REPLACE_CEIL])
|
||||||
|
REPLACE_CEILF=0; AC_SUBST([REPLACE_CEILF])
|
||||||
|
REPLACE_CEILL=0; AC_SUBST([REPLACE_CEILL])
|
||||||
|
REPLACE_EXPM1=0; AC_SUBST([REPLACE_EXPM1])
|
||||||
|
REPLACE_EXPM1F=0; AC_SUBST([REPLACE_EXPM1F])
|
||||||
|
REPLACE_EXP2=0; AC_SUBST([REPLACE_EXP2])
|
||||||
|
REPLACE_EXP2L=0; AC_SUBST([REPLACE_EXP2L])
|
||||||
|
REPLACE_FABSL=0; AC_SUBST([REPLACE_FABSL])
|
||||||
|
REPLACE_FLOOR=0; AC_SUBST([REPLACE_FLOOR])
|
||||||
|
REPLACE_FLOORF=0; AC_SUBST([REPLACE_FLOORF])
|
||||||
|
REPLACE_FLOORL=0; AC_SUBST([REPLACE_FLOORL])
|
||||||
|
REPLACE_FMA=0; AC_SUBST([REPLACE_FMA])
|
||||||
|
REPLACE_FMAF=0; AC_SUBST([REPLACE_FMAF])
|
||||||
|
REPLACE_FMAL=0; AC_SUBST([REPLACE_FMAL])
|
||||||
|
REPLACE_FMOD=0; AC_SUBST([REPLACE_FMOD])
|
||||||
|
REPLACE_FMODF=0; AC_SUBST([REPLACE_FMODF])
|
||||||
|
REPLACE_FMODL=0; AC_SUBST([REPLACE_FMODL])
|
||||||
|
REPLACE_FREXPF=0; AC_SUBST([REPLACE_FREXPF])
|
||||||
|
REPLACE_FREXP=0; AC_SUBST([REPLACE_FREXP])
|
||||||
|
REPLACE_FREXPL=0; AC_SUBST([REPLACE_FREXPL])
|
||||||
|
REPLACE_HUGE_VAL=0; AC_SUBST([REPLACE_HUGE_VAL])
|
||||||
|
REPLACE_HYPOT=0; AC_SUBST([REPLACE_HYPOT])
|
||||||
|
REPLACE_HYPOTF=0; AC_SUBST([REPLACE_HYPOTF])
|
||||||
|
REPLACE_HYPOTL=0; AC_SUBST([REPLACE_HYPOTL])
|
||||||
|
REPLACE_ILOGB=0; AC_SUBST([REPLACE_ILOGB])
|
||||||
|
REPLACE_ILOGBF=0; AC_SUBST([REPLACE_ILOGBF])
|
||||||
|
REPLACE_ISFINITE=0; AC_SUBST([REPLACE_ISFINITE])
|
||||||
|
REPLACE_ISINF=0; AC_SUBST([REPLACE_ISINF])
|
||||||
|
REPLACE_ISNAN=0; AC_SUBST([REPLACE_ISNAN])
|
||||||
|
REPLACE_LDEXPL=0; AC_SUBST([REPLACE_LDEXPL])
|
||||||
|
REPLACE_LOG=0; AC_SUBST([REPLACE_LOG])
|
||||||
|
REPLACE_LOGF=0; AC_SUBST([REPLACE_LOGF])
|
||||||
|
REPLACE_LOGL=0; AC_SUBST([REPLACE_LOGL])
|
||||||
|
REPLACE_LOG10=0; AC_SUBST([REPLACE_LOG10])
|
||||||
|
REPLACE_LOG10F=0; AC_SUBST([REPLACE_LOG10F])
|
||||||
|
REPLACE_LOG10L=0; AC_SUBST([REPLACE_LOG10L])
|
||||||
|
REPLACE_LOG1P=0; AC_SUBST([REPLACE_LOG1P])
|
||||||
|
REPLACE_LOG1PF=0; AC_SUBST([REPLACE_LOG1PF])
|
||||||
|
REPLACE_LOG1PL=0; AC_SUBST([REPLACE_LOG1PL])
|
||||||
|
REPLACE_LOG2=0; AC_SUBST([REPLACE_LOG2])
|
||||||
|
REPLACE_LOG2F=0; AC_SUBST([REPLACE_LOG2F])
|
||||||
|
REPLACE_LOG2L=0; AC_SUBST([REPLACE_LOG2L])
|
||||||
|
REPLACE_LOGB=0; AC_SUBST([REPLACE_LOGB])
|
||||||
|
REPLACE_LOGBF=0; AC_SUBST([REPLACE_LOGBF])
|
||||||
|
REPLACE_LOGBL=0; AC_SUBST([REPLACE_LOGBL])
|
||||||
|
REPLACE_MODF=0; AC_SUBST([REPLACE_MODF])
|
||||||
|
REPLACE_MODFF=0; AC_SUBST([REPLACE_MODFF])
|
||||||
|
REPLACE_MODFL=0; AC_SUBST([REPLACE_MODFL])
|
||||||
|
REPLACE_NAN=0; AC_SUBST([REPLACE_NAN])
|
||||||
|
REPLACE_REMAINDER=0; AC_SUBST([REPLACE_REMAINDER])
|
||||||
|
REPLACE_REMAINDERF=0; AC_SUBST([REPLACE_REMAINDERF])
|
||||||
|
REPLACE_REMAINDERL=0; AC_SUBST([REPLACE_REMAINDERL])
|
||||||
|
REPLACE_ROUND=0; AC_SUBST([REPLACE_ROUND])
|
||||||
|
REPLACE_ROUNDF=0; AC_SUBST([REPLACE_ROUNDF])
|
||||||
|
REPLACE_ROUNDL=0; AC_SUBST([REPLACE_ROUNDL])
|
||||||
|
REPLACE_SIGNBIT=0; AC_SUBST([REPLACE_SIGNBIT])
|
||||||
|
REPLACE_SIGNBIT_USING_GCC=0; AC_SUBST([REPLACE_SIGNBIT_USING_GCC])
|
||||||
|
REPLACE_SQRTL=0; AC_SUBST([REPLACE_SQRTL])
|
||||||
|
REPLACE_TRUNC=0; AC_SUBST([REPLACE_TRUNC])
|
||||||
|
REPLACE_TRUNCF=0; AC_SUBST([REPLACE_TRUNCF])
|
||||||
|
REPLACE_TRUNCL=0; AC_SUBST([REPLACE_TRUNCL])
|
||||||
|
])
|
||||||
|
|
||||||
|
# gl_LONG_DOUBLE_VS_DOUBLE
|
||||||
|
# determines whether 'long double' and 'double' have the same representation.
|
||||||
|
# Sets variable HAVE_SAME_LONG_DOUBLE_AS_DOUBLE to 0 or 1, and defines
|
||||||
|
# HAVE_SAME_LONG_DOUBLE_AS_DOUBLE accordingly.
|
||||||
|
# The currently known platforms where this is the case are:
|
||||||
|
# Linux/HPPA, Minix 3.1.8, AIX 5, AIX 6 and 7 with xlc, MSVC 9.
|
||||||
|
AC_DEFUN([gl_LONG_DOUBLE_VS_DOUBLE],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([whether long double and double are the same],
|
||||||
|
[gl_cv_long_double_equals_double],
|
||||||
|
[AC_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([[#include <float.h>]],
|
||||||
|
[[typedef int check[sizeof (long double) == sizeof (double)
|
||||||
|
&& LDBL_MANT_DIG == DBL_MANT_DIG
|
||||||
|
&& LDBL_MAX_EXP == DBL_MAX_EXP
|
||||||
|
&& LDBL_MIN_EXP == DBL_MIN_EXP
|
||||||
|
? 1 : -1];
|
||||||
|
]])],
|
||||||
|
[gl_cv_long_double_equals_double=yes],
|
||||||
|
[gl_cv_long_double_equals_double=no])
|
||||||
|
])
|
||||||
|
if test $gl_cv_long_double_equals_double = yes; then
|
||||||
|
AC_DEFINE([HAVE_SAME_LONG_DOUBLE_AS_DOUBLE], [1],
|
||||||
|
[Define to 1 if 'long double' and 'double' have the same representation.])
|
||||||
|
HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=1
|
||||||
|
else
|
||||||
|
HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=0
|
||||||
|
fi
|
||||||
|
AC_SUBST([HAVE_SAME_LONG_DOUBLE_AS_DOUBLE])
|
||||||
|
])
|
||||||
88
m4/memchr.m4
Normal file
88
m4/memchr.m4
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
# memchr.m4 serial 12
|
||||||
|
dnl Copyright (C) 2002-2004, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
AC_DEFUN_ONCE([gl_FUNC_MEMCHR],
|
||||||
|
[
|
||||||
|
dnl Check for prerequisites for memory fence checks.
|
||||||
|
gl_FUNC_MMAP_ANON
|
||||||
|
AC_CHECK_HEADERS_ONCE([sys/mman.h])
|
||||||
|
AC_CHECK_FUNCS_ONCE([mprotect])
|
||||||
|
|
||||||
|
AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
|
||||||
|
m4_ifdef([gl_FUNC_MEMCHR_OBSOLETE], [
|
||||||
|
dnl These days, we assume memchr is present. But if support for old
|
||||||
|
dnl platforms is desired:
|
||||||
|
AC_CHECK_FUNCS_ONCE([memchr])
|
||||||
|
if test $ac_cv_func_memchr = no; then
|
||||||
|
HAVE_MEMCHR=0
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
if test $HAVE_MEMCHR = 1; then
|
||||||
|
# Detect platform-specific bugs in some versions of glibc:
|
||||||
|
# memchr should not dereference anything with length 0
|
||||||
|
# http://bugzilla.redhat.com/499689
|
||||||
|
# memchr should not dereference overestimated length after a match
|
||||||
|
# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737
|
||||||
|
# http://sourceware.org/bugzilla/show_bug.cgi?id=10162
|
||||||
|
# Assume that memchr works on platforms that lack mprotect.
|
||||||
|
AC_CACHE_CHECK([whether memchr works], [gl_cv_func_memchr_works],
|
||||||
|
[AC_RUN_IFELSE([AC_LANG_PROGRAM([[
|
||||||
|
#include <string.h>
|
||||||
|
#if HAVE_SYS_MMAN_H
|
||||||
|
# include <fcntl.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <sys/mman.h>
|
||||||
|
# ifndef MAP_FILE
|
||||||
|
# define MAP_FILE 0
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
]], [[
|
||||||
|
int result = 0;
|
||||||
|
char *fence = NULL;
|
||||||
|
#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
|
||||||
|
# if HAVE_MAP_ANONYMOUS
|
||||||
|
const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
|
||||||
|
const int fd = -1;
|
||||||
|
# else /* !HAVE_MAP_ANONYMOUS */
|
||||||
|
const int flags = MAP_FILE | MAP_PRIVATE;
|
||||||
|
int fd = open ("/dev/zero", O_RDONLY, 0666);
|
||||||
|
if (fd >= 0)
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
int pagesize = getpagesize ();
|
||||||
|
char *two_pages =
|
||||||
|
(char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
|
||||||
|
flags, fd, 0);
|
||||||
|
if (two_pages != (char *)(-1)
|
||||||
|
&& mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
|
||||||
|
fence = two_pages + pagesize;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (fence)
|
||||||
|
{
|
||||||
|
if (memchr (fence, 0, 0))
|
||||||
|
result |= 1;
|
||||||
|
strcpy (fence - 9, "12345678");
|
||||||
|
if (memchr (fence - 9, 0, 79) != fence - 1)
|
||||||
|
result |= 2;
|
||||||
|
if (memchr (fence - 1, 0, 3) != fence - 1)
|
||||||
|
result |= 4;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
]])], [gl_cv_func_memchr_works=yes], [gl_cv_func_memchr_works=no],
|
||||||
|
[dnl Be pessimistic for now.
|
||||||
|
gl_cv_func_memchr_works="guessing no"])])
|
||||||
|
if test "$gl_cv_func_memchr_works" != yes; then
|
||||||
|
REPLACE_MEMCHR=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# Prerequisites of lib/memchr.c.
|
||||||
|
AC_DEFUN([gl_PREREQ_MEMCHR], [
|
||||||
|
AC_CHECK_HEADERS([bp-sym.h])
|
||||||
|
])
|
||||||
26
m4/mempcpy.m4
Normal file
26
m4/mempcpy.m4
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
# mempcpy.m4 serial 11
|
||||||
|
dnl Copyright (C) 2003-2004, 2006-2007, 2009-2012 Free Software Foundation,
|
||||||
|
dnl Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FUNC_MEMPCPY],
|
||||||
|
[
|
||||||
|
dnl Persuade glibc <string.h> to declare mempcpy().
|
||||||
|
AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
|
||||||
|
|
||||||
|
dnl The mempcpy() declaration in lib/string.in.h uses 'restrict'.
|
||||||
|
AC_REQUIRE([AC_C_RESTRICT])
|
||||||
|
|
||||||
|
AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
|
||||||
|
AC_CHECK_FUNCS([mempcpy])
|
||||||
|
if test $ac_cv_func_mempcpy = no; then
|
||||||
|
HAVE_MEMPCPY=0
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# Prerequisites of lib/mempcpy.c.
|
||||||
|
AC_DEFUN([gl_PREREQ_MEMPCPY], [
|
||||||
|
:
|
||||||
|
])
|
||||||
55
m4/mmap-anon.m4
Normal file
55
m4/mmap-anon.m4
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
# mmap-anon.m4 serial 10
|
||||||
|
dnl Copyright (C) 2005, 2007, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# Detect how mmap can be used to create anonymous (not file-backed) memory
|
||||||
|
# mappings.
|
||||||
|
# - On Linux, AIX, OSF/1, Solaris, Cygwin, Interix, Haiku, both MAP_ANONYMOUS
|
||||||
|
# and MAP_ANON exist and have the same value.
|
||||||
|
# - On HP-UX, only MAP_ANONYMOUS exists.
|
||||||
|
# - On Mac OS X, FreeBSD, NetBSD, OpenBSD, only MAP_ANON exists.
|
||||||
|
# - On IRIX, neither exists, and a file descriptor opened to /dev/zero must be
|
||||||
|
# used.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FUNC_MMAP_ANON],
|
||||||
|
[
|
||||||
|
dnl Persuade glibc <sys/mman.h> to define MAP_ANONYMOUS.
|
||||||
|
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
||||||
|
|
||||||
|
# Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it
|
||||||
|
# fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is
|
||||||
|
# irrelevant for anonymous mappings.
|
||||||
|
AC_CHECK_FUNC([mmap], [gl_have_mmap=yes], [gl_have_mmap=no])
|
||||||
|
|
||||||
|
# Try to allow MAP_ANONYMOUS.
|
||||||
|
gl_have_mmap_anonymous=no
|
||||||
|
if test $gl_have_mmap = yes; then
|
||||||
|
AC_MSG_CHECKING([for MAP_ANONYMOUS])
|
||||||
|
AC_EGREP_CPP([I cannot identify this map], [
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#ifdef MAP_ANONYMOUS
|
||||||
|
I cannot identify this map
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
[gl_have_mmap_anonymous=yes])
|
||||||
|
if test $gl_have_mmap_anonymous != yes; then
|
||||||
|
AC_EGREP_CPP([I cannot identify this map], [
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#ifdef MAP_ANON
|
||||||
|
I cannot identify this map
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
[AC_DEFINE([MAP_ANONYMOUS], [MAP_ANON],
|
||||||
|
[Define to a substitute value for mmap()'s MAP_ANONYMOUS flag.])
|
||||||
|
gl_have_mmap_anonymous=yes])
|
||||||
|
fi
|
||||||
|
AC_MSG_RESULT([$gl_have_mmap_anonymous])
|
||||||
|
if test $gl_have_mmap_anonymous = yes; then
|
||||||
|
AC_DEFINE([HAVE_MAP_ANONYMOUS], [1],
|
||||||
|
[Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including
|
||||||
|
config.h and <sys/mman.h>.])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
62
m4/multiarch.m4
Normal file
62
m4/multiarch.m4
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
# multiarch.m4 serial 7
|
||||||
|
dnl Copyright (C) 2008-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# Determine whether the compiler is or may be producing universal binaries.
|
||||||
|
#
|
||||||
|
# On Mac OS X 10.5 and later systems, the user can create libraries and
|
||||||
|
# executables that work on multiple system types--known as "fat" or
|
||||||
|
# "universal" binaries--by specifying multiple '-arch' options to the
|
||||||
|
# compiler but only a single '-arch' option to the preprocessor. Like
|
||||||
|
# this:
|
||||||
|
#
|
||||||
|
# ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
# CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
# CPP="gcc -E" CXXCPP="g++ -E"
|
||||||
|
#
|
||||||
|
# Detect this situation and set APPLE_UNIVERSAL_BUILD accordingly.
|
||||||
|
|
||||||
|
AC_DEFUN_ONCE([gl_MULTIARCH],
|
||||||
|
[
|
||||||
|
dnl Code similar to autoconf-2.63 AC_C_BIGENDIAN.
|
||||||
|
gl_cv_c_multiarch=no
|
||||||
|
AC_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_SOURCE(
|
||||||
|
[[#ifndef __APPLE_CC__
|
||||||
|
not a universal capable compiler
|
||||||
|
#endif
|
||||||
|
typedef int dummy;
|
||||||
|
]])],
|
||||||
|
[
|
||||||
|
dnl Check for potential -arch flags. It is not universal unless
|
||||||
|
dnl there are at least two -arch flags with different values.
|
||||||
|
arch=
|
||||||
|
prev=
|
||||||
|
for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
|
||||||
|
if test -n "$prev"; then
|
||||||
|
case $word in
|
||||||
|
i?86 | x86_64 | ppc | ppc64)
|
||||||
|
if test -z "$arch" || test "$arch" = "$word"; then
|
||||||
|
arch="$word"
|
||||||
|
else
|
||||||
|
gl_cv_c_multiarch=yes
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
prev=
|
||||||
|
else
|
||||||
|
if test "x$word" = "x-arch"; then
|
||||||
|
prev=arch
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
])
|
||||||
|
if test $gl_cv_c_multiarch = yes; then
|
||||||
|
APPLE_UNIVERSAL_BUILD=1
|
||||||
|
else
|
||||||
|
APPLE_UNIVERSAL_BUILD=0
|
||||||
|
fi
|
||||||
|
AC_SUBST([APPLE_UNIVERSAL_BUILD])
|
||||||
|
])
|
||||||
130
m4/nocrash.m4
Normal file
130
m4/nocrash.m4
Normal file
|
|
@ -0,0 +1,130 @@
|
||||||
|
# nocrash.m4 serial 4
|
||||||
|
dnl Copyright (C) 2005, 2009-2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
dnl Based on libsigsegv, from Bruno Haible and Paolo Bonzini.
|
||||||
|
|
||||||
|
AC_PREREQ([2.13])
|
||||||
|
|
||||||
|
dnl Expands to some code for use in .c programs that will cause the configure
|
||||||
|
dnl test to exit instead of crashing. This is useful to avoid triggering
|
||||||
|
dnl action from a background debugger and to avoid core dumps.
|
||||||
|
dnl Usage: ...
|
||||||
|
dnl ]GL_NOCRASH[
|
||||||
|
dnl ...
|
||||||
|
dnl int main() { nocrash_init(); ... }
|
||||||
|
AC_DEFUN([GL_NOCRASH],[[
|
||||||
|
#include <stdlib.h>
|
||||||
|
#if defined __MACH__ && defined __APPLE__
|
||||||
|
/* Avoid a crash on Mac OS X. */
|
||||||
|
#include <mach/mach.h>
|
||||||
|
#include <mach/mach_error.h>
|
||||||
|
#include <mach/thread_status.h>
|
||||||
|
#include <mach/exception.h>
|
||||||
|
#include <mach/task.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
/* The exception port on which our thread listens. */
|
||||||
|
static mach_port_t our_exception_port;
|
||||||
|
/* The main function of the thread listening for exceptions of type
|
||||||
|
EXC_BAD_ACCESS. */
|
||||||
|
static void *
|
||||||
|
mach_exception_thread (void *arg)
|
||||||
|
{
|
||||||
|
/* Buffer for a message to be received. */
|
||||||
|
struct {
|
||||||
|
mach_msg_header_t head;
|
||||||
|
mach_msg_body_t msgh_body;
|
||||||
|
char data[1024];
|
||||||
|
} msg;
|
||||||
|
mach_msg_return_t retval;
|
||||||
|
/* Wait for a message on the exception port. */
|
||||||
|
retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
|
||||||
|
our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
|
||||||
|
if (retval != MACH_MSG_SUCCESS)
|
||||||
|
abort ();
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
static void
|
||||||
|
nocrash_init (void)
|
||||||
|
{
|
||||||
|
mach_port_t self = mach_task_self ();
|
||||||
|
/* Allocate a port on which the thread shall listen for exceptions. */
|
||||||
|
if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
|
||||||
|
== KERN_SUCCESS) {
|
||||||
|
/* See http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */
|
||||||
|
if (mach_port_insert_right (self, our_exception_port, our_exception_port,
|
||||||
|
MACH_MSG_TYPE_MAKE_SEND)
|
||||||
|
== KERN_SUCCESS) {
|
||||||
|
/* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting
|
||||||
|
for us. */
|
||||||
|
exception_mask_t mask = EXC_MASK_BAD_ACCESS;
|
||||||
|
/* Create the thread listening on the exception port. */
|
||||||
|
pthread_attr_t attr;
|
||||||
|
pthread_t thread;
|
||||||
|
if (pthread_attr_init (&attr) == 0
|
||||||
|
&& pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
|
||||||
|
&& pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
|
||||||
|
pthread_attr_destroy (&attr);
|
||||||
|
/* Replace the exception port info for these exceptions with our own.
|
||||||
|
Note that we replace the exception port for the entire task, not only
|
||||||
|
for a particular thread. This has the effect that when our exception
|
||||||
|
port gets the message, the thread specific exception port has already
|
||||||
|
been asked, and we don't need to bother about it.
|
||||||
|
See http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */
|
||||||
|
task_set_exception_ports (self, mask, our_exception_port,
|
||||||
|
EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||||
|
/* Avoid a crash on native Windows. */
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winerror.h>
|
||||||
|
static LONG WINAPI
|
||||||
|
exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
|
||||||
|
{
|
||||||
|
switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
|
||||||
|
{
|
||||||
|
case EXCEPTION_ACCESS_VIOLATION:
|
||||||
|
case EXCEPTION_IN_PAGE_ERROR:
|
||||||
|
case EXCEPTION_STACK_OVERFLOW:
|
||||||
|
case EXCEPTION_GUARD_PAGE:
|
||||||
|
case EXCEPTION_PRIV_INSTRUCTION:
|
||||||
|
case EXCEPTION_ILLEGAL_INSTRUCTION:
|
||||||
|
case EXCEPTION_DATATYPE_MISALIGNMENT:
|
||||||
|
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
|
||||||
|
case EXCEPTION_NONCONTINUABLE_EXCEPTION:
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
return EXCEPTION_CONTINUE_SEARCH;
|
||||||
|
}
|
||||||
|
static void
|
||||||
|
nocrash_init (void)
|
||||||
|
{
|
||||||
|
SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* Avoid a crash on POSIX systems. */
|
||||||
|
#include <signal.h>
|
||||||
|
/* A POSIX signal handler. */
|
||||||
|
static void
|
||||||
|
exception_handler (int sig)
|
||||||
|
{
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
static void
|
||||||
|
nocrash_init (void)
|
||||||
|
{
|
||||||
|
#ifdef SIGSEGV
|
||||||
|
signal (SIGSEGV, exception_handler);
|
||||||
|
#endif
|
||||||
|
#ifdef SIGBUS
|
||||||
|
signal (SIGBUS, exception_handler);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
]])
|
||||||
18
m4/off_t.m4
Normal file
18
m4/off_t.m4
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
# off_t.m4 serial 1
|
||||||
|
dnl Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
dnl Check whether to override the 'off_t' type.
|
||||||
|
dnl Set WINDOWS_64_BIT_OFF_T.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_TYPE_OFF_T],
|
||||||
|
[
|
||||||
|
m4_ifdef([gl_LARGEFILE], [
|
||||||
|
AC_REQUIRE([gl_LARGEFILE])
|
||||||
|
], [
|
||||||
|
WINDOWS_64_BIT_OFF_T=0
|
||||||
|
])
|
||||||
|
AC_SUBST([WINDOWS_64_BIT_OFF_T])
|
||||||
|
])
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue