Make LTL2BA compile on Windows.
This commit is contained in:
parent
92bed4de11
commit
c17d2bbc13
|
@ -1,12 +1,14 @@
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
AM_CPPFLAGS = -DNXT
|
AM_CPPFLAGS = -DNXT -I$(top_builddir)/lib -I$(top_srcdir)/lib
|
||||||
|
|
||||||
|
SUBDIRS = lib
|
||||||
|
|
||||||
bin_PROGRAMS = ltl2ba
|
bin_PROGRAMS = ltl2ba
|
||||||
noinst_LTLIBRARIES = libltl2ba.la
|
noinst_LTLIBRARIES = libltl2ba.la
|
||||||
|
|
||||||
ltl2ba_SOURCES = main.c
|
ltl2ba_SOURCES = main.c
|
||||||
ltl2ba_SOURCES += ltl2ba.h
|
ltl2ba_SOURCES += ltl2ba.h
|
||||||
ltl2ba_LDADD = libltl2ba.la
|
ltl2ba_LDADD = libltl2ba.la $(top_builddir)/lib/libgnu.la
|
||||||
|
|
||||||
libltl2ba_la_SOURCES = parse.c
|
libltl2ba_la_SOURCES = parse.c
|
||||||
libltl2ba_la_SOURCES += lex.c
|
libltl2ba_la_SOURCES += lex.c
|
||||||
|
@ -20,6 +22,9 @@ libltl2ba_la_SOURCES += alternating.c
|
||||||
libltl2ba_la_SOURCES += generalized.c
|
libltl2ba_la_SOURCES += generalized.c
|
||||||
libltl2ba_la_SOURCES += util.c
|
libltl2ba_la_SOURCES += util.c
|
||||||
libltl2ba_la_SOURCES += ltl2ba.h
|
libltl2ba_la_SOURCES += ltl2ba.h
|
||||||
|
libltl2ba_la_LIBADD = $(top_builddir)/lib/libgnu.la
|
||||||
|
|
||||||
|
EXTRA_DIST = m4/gnulib-cache.m4
|
||||||
|
|
||||||
# make
|
# make
|
||||||
.DELETE_ON_ERROR:
|
.DELETE_ON_ERROR:
|
||||||
|
|
|
@ -143,7 +143,7 @@ int get_sym_id(char *s) /* finds the id of a predicate, or attributes one */
|
||||||
return sym_id++;
|
return sym_id++;
|
||||||
}
|
}
|
||||||
|
|
||||||
ATrans *boolean(Node *p) /* computes the transitions to boolean nodes -> next & init */
|
ATrans *_boolean(Node *p) /* computes the transitions to boolean nodes -> next & init */
|
||||||
{
|
{
|
||||||
ATrans *t1, *t2, *lft, *rgt, *result = (ATrans *)0;
|
ATrans *t1, *t2, *lft, *rgt, *result = (ATrans *)0;
|
||||||
switch(p->ntyp) {
|
switch(p->ntyp) {
|
||||||
|
@ -155,8 +155,8 @@ ATrans *boolean(Node *p) /* computes the transitions to boolean nodes -> next &
|
||||||
case FALSE:
|
case FALSE:
|
||||||
break;
|
break;
|
||||||
case AND:
|
case AND:
|
||||||
lft = boolean(p->lft);
|
lft = _boolean(p->lft);
|
||||||
rgt = boolean(p->rgt);
|
rgt = _boolean(p->rgt);
|
||||||
for(t1 = lft; t1; t1 = t1->nxt) {
|
for(t1 = lft; t1; t1 = t1->nxt) {
|
||||||
for(t2 = rgt; t2; t2 = t2->nxt) {
|
for(t2 = rgt; t2; t2 = t2->nxt) {
|
||||||
ATrans *tmp = merge_trans(t1, t2);
|
ATrans *tmp = merge_trans(t1, t2);
|
||||||
|
@ -170,14 +170,14 @@ ATrans *boolean(Node *p) /* computes the transitions to boolean nodes -> next &
|
||||||
free_atrans(rgt, 1);
|
free_atrans(rgt, 1);
|
||||||
break;
|
break;
|
||||||
case OR:
|
case OR:
|
||||||
lft = boolean(p->lft);
|
lft = _boolean(p->lft);
|
||||||
for(t1 = lft; t1; t1 = t1->nxt) {
|
for(t1 = lft; t1; t1 = t1->nxt) {
|
||||||
ATrans *tmp = dup_trans(t1);
|
ATrans *tmp = dup_trans(t1);
|
||||||
tmp->nxt = result;
|
tmp->nxt = result;
|
||||||
result = tmp;
|
result = tmp;
|
||||||
}
|
}
|
||||||
free_atrans(lft, 1);
|
free_atrans(lft, 1);
|
||||||
rgt = boolean(p->rgt);
|
rgt = _boolean(p->rgt);
|
||||||
for(t1 = rgt; t1; t1 = t1->nxt) {
|
for(t1 = rgt; t1; t1 = t1->nxt) {
|
||||||
ATrans *tmp = dup_trans(t1);
|
ATrans *tmp = dup_trans(t1);
|
||||||
tmp->nxt = result;
|
tmp->nxt = result;
|
||||||
|
@ -230,7 +230,7 @@ ATrans *build_alternating(Node *p) /* builds an alternating automaton for p */
|
||||||
|
|
||||||
#ifdef NXT
|
#ifdef NXT
|
||||||
case NEXT:
|
case NEXT:
|
||||||
t = boolean(p->lft);
|
t = _boolean(p->lft);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -414,7 +414,7 @@ void mk_alternating(Node *p) /* generates an alternating automaton for p */
|
||||||
sym_size = n_sym / (8 * sizeof(int)) + 1;
|
sym_size = n_sym / (8 * sizeof(int)) + 1;
|
||||||
|
|
||||||
final_set = make_set(-1, 0);
|
final_set = make_set(-1, 0);
|
||||||
transition[0] = boolean(p); /* generates the alternating automaton */
|
transition[0] = _boolean(p); /* generates the alternating automaton */
|
||||||
|
|
||||||
if(tl_verbose) {
|
if(tl_verbose) {
|
||||||
fprintf(tl_out, "\nAlternating automaton before simplification\n");
|
fprintf(tl_out, "\nAlternating automaton before simplification\n");
|
||||||
|
|
24
buchi.c
24
buchi.c
|
@ -45,7 +45,7 @@ BState *bstack, *bstates, *bremoved;
|
||||||
BScc *scc_stack;
|
BScc *scc_stack;
|
||||||
int bstate_count = 0, btrans_count = 0, rank;
|
int bstate_count = 0, btrans_count = 0, rank;
|
||||||
|
|
||||||
static int accept;
|
static int _accept;
|
||||||
|
|
||||||
/********************************************************************\
|
/********************************************************************\
|
||||||
|* Simplification of the generalized Buchi automaton *|
|
|* Simplification of the generalized Buchi automaton *|
|
||||||
|
@ -172,8 +172,8 @@ void retarget_all_btrans()
|
||||||
int all_btrans_match(BState *a, BState *b) /* decides if the states are equivalent */
|
int all_btrans_match(BState *a, BState *b) /* decides if the states are equivalent */
|
||||||
{
|
{
|
||||||
BTrans *s, *t;
|
BTrans *s, *t;
|
||||||
if (((a->final == accept) || (b->final == accept)) &&
|
if (((a->final == _accept) || (b->final == _accept)) &&
|
||||||
(a->final + b->final != 2 * accept) &&
|
(a->final + b->final != 2 * _accept) &&
|
||||||
a->incoming >=0 && b->incoming >=0)
|
a->incoming >=0 && b->incoming >=0)
|
||||||
return 0; /* the states have to be both final or both non final */
|
return 0; /* the states have to be both final or both non final */
|
||||||
|
|
||||||
|
@ -334,7 +334,7 @@ BState *find_bstate(GState **state, int final, BState *s)
|
||||||
|
|
||||||
int next_final(int *set, int fin) /* computes the 'final' value */
|
int next_final(int *set, int fin) /* computes the 'final' value */
|
||||||
{
|
{
|
||||||
if((fin != accept) && in_set(set, final[fin + 1]))
|
if((fin != _accept) && in_set(set, final[fin + 1]))
|
||||||
return next_final(set, fin + 1);
|
return next_final(set, fin + 1);
|
||||||
return fin;
|
return fin;
|
||||||
}
|
}
|
||||||
|
@ -347,7 +347,7 @@ void make_btrans(BState *s) /* creates all the transitions from a state */
|
||||||
BState *s1;
|
BState *s1;
|
||||||
if(s->gstate->trans)
|
if(s->gstate->trans)
|
||||||
for(t = s->gstate->trans->nxt; t != s->gstate->trans; t = t->nxt) {
|
for(t = s->gstate->trans->nxt; t != s->gstate->trans; t = t->nxt) {
|
||||||
int fin = next_final(t->final, (s->final == accept) ? 0 : s->final);
|
int fin = next_final(t->final, (s->final == _accept) ? 0 : s->final);
|
||||||
BState *to = find_bstate(&t->to, fin, s);
|
BState *to = find_bstate(&t->to, fin, s);
|
||||||
|
|
||||||
for(t1 = s->trans->nxt; t1 != s->trans;) {
|
for(t1 = s->trans->nxt; t1 != s->trans;) {
|
||||||
|
@ -426,7 +426,7 @@ void make_btrans(BState *s) /* creates all the transitions from a state */
|
||||||
|* Export of the Buchi automaton *|
|
|* Export of the Buchi automaton *|
|
||||||
\********************************************************************/
|
\********************************************************************/
|
||||||
BState* buchi_bstates() { return bstates; }
|
BState* buchi_bstates() { return bstates; }
|
||||||
int buchi_accept() { return accept; }
|
int buchi_accept() { return _accept; }
|
||||||
|
|
||||||
/********************************************************************\
|
/********************************************************************\
|
||||||
|* Display of the Buchi automaton *|
|
|* Display of the Buchi automaton *|
|
||||||
|
@ -443,7 +443,7 @@ void print_buchi(BState *s) /* dumps the Buchi automaton */
|
||||||
if(s->id == -1)
|
if(s->id == -1)
|
||||||
fprintf(tl_out, "init");
|
fprintf(tl_out, "init");
|
||||||
else {
|
else {
|
||||||
if(s->final == accept)
|
if(s->final == _accept)
|
||||||
fprintf(tl_out, "accept");
|
fprintf(tl_out, "accept");
|
||||||
else
|
else
|
||||||
fprintf(tl_out, "T%i", s->final);
|
fprintf(tl_out, "T%i", s->final);
|
||||||
|
@ -460,7 +460,7 @@ void print_buchi(BState *s) /* dumps the Buchi automaton */
|
||||||
if(t->to->id == -1)
|
if(t->to->id == -1)
|
||||||
fprintf(tl_out, "init\n");
|
fprintf(tl_out, "init\n");
|
||||||
else {
|
else {
|
||||||
if(t->to->final == accept)
|
if(t->to->final == _accept)
|
||||||
fprintf(tl_out, "accept");
|
fprintf(tl_out, "accept");
|
||||||
else
|
else
|
||||||
fprintf(tl_out, "T%i", t->to->final);
|
fprintf(tl_out, "T%i", t->to->final);
|
||||||
|
@ -478,7 +478,7 @@ print_dot_buchi_1(BState *s)
|
||||||
print_dot_buchi_1(s->nxt); /* begins with the last state */
|
print_dot_buchi_1(s->nxt); /* begins with the last state */
|
||||||
|
|
||||||
fprintf(tl_out, "%i[label=\"%i\"%s];\n", s->id, s->id,
|
fprintf(tl_out, "%i[label=\"%i\"%s];\n", s->id, s->id,
|
||||||
s->final == accept ? ",shape=doublecircle" : "");
|
s->final == _accept ? ",shape=doublecircle" : "");
|
||||||
|
|
||||||
for(t = s->trans->nxt; t != s->trans; t = t->nxt) {
|
for(t = s->trans->nxt; t != s->trans; t = t->nxt) {
|
||||||
fprintf(tl_out, "%d -> %d [label=\"", s->id, t->to->id);
|
fprintf(tl_out, "%d -> %d [label=\"", s->id, t->to->id);
|
||||||
|
@ -546,7 +546,7 @@ void print_spin_buchi() {
|
||||||
accept_all = 1;
|
accept_all = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(s->final == accept)
|
if(s->final == _accept)
|
||||||
fprintf(tl_out, "accept_");
|
fprintf(tl_out, "accept_");
|
||||||
else fprintf(tl_out, "T%i_", s->final);
|
else fprintf(tl_out, "T%i_", s->final);
|
||||||
if(s->id == -1)
|
if(s->id == -1)
|
||||||
|
@ -570,7 +570,7 @@ void print_spin_buchi() {
|
||||||
}
|
}
|
||||||
else t1 = t1->nxt;
|
else t1 = t1->nxt;
|
||||||
fprintf(tl_out, ") -> goto ");
|
fprintf(tl_out, ") -> goto ");
|
||||||
if(t->to->final == accept)
|
if(t->to->final == _accept)
|
||||||
fprintf(tl_out, "accept_");
|
fprintf(tl_out, "accept_");
|
||||||
else fprintf(tl_out, "T%i_", t->to->final);
|
else fprintf(tl_out, "T%i_", t->to->final);
|
||||||
if(t->to->id == 0)
|
if(t->to->id == 0)
|
||||||
|
@ -598,7 +598,7 @@ void mk_buchi()
|
||||||
BState *s = (BState *)tl_emalloc(sizeof(BState));
|
BState *s = (BState *)tl_emalloc(sizeof(BState));
|
||||||
GTrans *t;
|
GTrans *t;
|
||||||
BTrans *t1;
|
BTrans *t1;
|
||||||
accept = final[0] - 1;
|
_accept = final[0] - 1;
|
||||||
|
|
||||||
if(tl_stats) getrusage(RUSAGE_SELF, &tr_debut);
|
if(tl_stats) getrusage(RUSAGE_SELF, &tr_debut);
|
||||||
|
|
||||||
|
|
17
configure.ac
17
configure.ac
|
@ -10,19 +10,24 @@ AC_CONFIG_HEADERS([config.h])
|
||||||
|
|
||||||
# Checks for programs.
|
# Checks for programs.
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
|
#
|
||||||
|
# for gnulib
|
||||||
|
gl_EARLY
|
||||||
|
|
||||||
AC_PROG_CXX
|
AC_PROG_CXX
|
||||||
AC_PROG_AWK
|
AC_PROG_AWK
|
||||||
AC_PROG_CPP
|
AC_PROG_CPP
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_LN_S
|
AC_PROG_LN_S
|
||||||
AC_PROG_MAKE_SET
|
AC_PROG_MAKE_SET
|
||||||
dnl Newer libtool allows this instead:
|
LT_PREREQ(2.2)
|
||||||
dnl LT_PREREQ(2.2)
|
LT_INIT([disable-shared win32-dll])
|
||||||
dnl LT_INIT([disable-shared])
|
|
||||||
AC_DISABLE_SHARED
|
|
||||||
AC_PROG_LIBTOOL
|
AC_PROG_LIBTOOL
|
||||||
AC_PROG_RANLIB
|
AC_PROG_RANLIB
|
||||||
|
|
||||||
|
# for gnulib
|
||||||
|
gl_INIT
|
||||||
|
|
||||||
AX_TRY_CFLAGS_IFELSE([-W -Wall])
|
AX_TRY_CFLAGS_IFELSE([-W -Wall])
|
||||||
AX_TRY_CFLAGS_IFELSE([-pipe])
|
AX_TRY_CFLAGS_IFELSE([-pipe])
|
||||||
AX_TRY_CFLAGS_IFELSE([-ansi])
|
AX_TRY_CFLAGS_IFELSE([-ansi])
|
||||||
|
@ -35,10 +40,10 @@ AC_CHECK_HEADERS([stdlib.h string.h sys/time.h])
|
||||||
# Checks for typedefs, structures, and compiler characteristics.
|
# Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
|
||||||
# Checks for library functions.
|
# Checks for library functions.
|
||||||
AC_FUNC_MALLOC
|
AC_CHECK_FUNCS([memset strlcat])
|
||||||
AC_CHECK_FUNCS([memset])
|
|
||||||
|
|
||||||
AC_CONFIG_FILES([
|
AC_CONFIG_FILES([
|
||||||
|
lib/Makefile
|
||||||
Makefile
|
Makefile
|
||||||
])
|
])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
1192
lib/Makefile.am
Normal file
1192
lib/Makefile.am
Normal file
File diff suppressed because it is too large
Load diff
65
lib/alloca.in.h
Normal file
65
lib/alloca.in.h
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
/* Memory allocation on the stack.
|
||||||
|
|
||||||
|
Copyright (C) 1995, 1999, 2001-2004, 2006-2018 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
|
||||||
|
<https://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
|
||||||
|
# elif defined __MVS__
|
||||||
|
# include <stdlib.h>
|
||||||
|
# else
|
||||||
|
# include <stddef.h>
|
||||||
|
# ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
# endif
|
||||||
|
void *alloca (size_t);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _GL_ALLOCA_H */
|
26
lib/arg-nonnull.h
Normal file
26
lib/arg-nonnull.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/* A C macro for declaring that specific arguments must not be NULL.
|
||||||
|
Copyright (C) 2009-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
|
||||||
|
that the values passed as arguments n, ..., m must be non-NULL pointers.
|
||||||
|
n = 1 stands for the first argument, n = 2 for the second argument etc. */
|
||||||
|
#ifndef _GL_ARG_NONNULL
|
||||||
|
# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
|
||||||
|
# define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
|
||||||
|
# else
|
||||||
|
# define _GL_ARG_NONNULL(params)
|
||||||
|
# endif
|
||||||
|
#endif
|
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-2018 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 <https://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;
|
||||||
|
}
|
316
lib/c++defs.h
Normal file
316
lib/c++defs.h
Normal file
|
@ -0,0 +1,316 @@
|
||||||
|
/* C++ compatible function declaration macros.
|
||||||
|
Copyright (C) 2010-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _GL_CXXDEFS_H
|
||||||
|
#define _GL_CXXDEFS_H
|
||||||
|
|
||||||
|
/* Begin/end the GNULIB_NAMESPACE namespace. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
|
||||||
|
# define _GL_END_NAMESPACE }
|
||||||
|
#else
|
||||||
|
# define _GL_BEGIN_NAMESPACE
|
||||||
|
# define _GL_END_NAMESPACE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The three most frequent use cases of these macros are:
|
||||||
|
|
||||||
|
* For providing a substitute for a function that is missing on some
|
||||||
|
platforms, but is declared and works fine on the platforms on which
|
||||||
|
it exists:
|
||||||
|
|
||||||
|
#if @GNULIB_FOO@
|
||||||
|
# if !@HAVE_FOO@
|
||||||
|
_GL_FUNCDECL_SYS (foo, ...);
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (foo, ...);
|
||||||
|
_GL_CXXALIASWARN (foo);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
...
|
||||||
|
#endif
|
||||||
|
|
||||||
|
* For providing a replacement for a function that exists on all platforms,
|
||||||
|
but is broken/insufficient and needs to be replaced on some platforms:
|
||||||
|
|
||||||
|
#if @GNULIB_FOO@
|
||||||
|
# if @REPLACE_FOO@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef foo
|
||||||
|
# define foo rpl_foo
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (foo, ...);
|
||||||
|
_GL_CXXALIAS_RPL (foo, ...);
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (foo, ...);
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (foo);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
...
|
||||||
|
#endif
|
||||||
|
|
||||||
|
* For providing a replacement for a function that exists on some platforms
|
||||||
|
but is broken/insufficient and needs to be replaced on some of them and
|
||||||
|
is additionally either missing or undeclared on some other platforms:
|
||||||
|
|
||||||
|
#if @GNULIB_FOO@
|
||||||
|
# if @REPLACE_FOO@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef foo
|
||||||
|
# define foo rpl_foo
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (foo, ...);
|
||||||
|
_GL_CXXALIAS_RPL (foo, ...);
|
||||||
|
# else
|
||||||
|
# if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@
|
||||||
|
_GL_FUNCDECL_SYS (foo, ...);
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (foo, ...);
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (foo);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
...
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* _GL_EXTERN_C declaration;
|
||||||
|
performs the declaration with C linkage. */
|
||||||
|
#if defined __cplusplus
|
||||||
|
# define _GL_EXTERN_C extern "C"
|
||||||
|
#else
|
||||||
|
# define _GL_EXTERN_C extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
|
||||||
|
declares a replacement function, named rpl_func, with the given prototype,
|
||||||
|
consisting of return type, parameters, and attributes.
|
||||||
|
Example:
|
||||||
|
_GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
*/
|
||||||
|
#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
|
||||||
|
#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_EXTERN_C rettype rpl_func parameters_and_attributes
|
||||||
|
|
||||||
|
/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
|
||||||
|
declares the system function, named func, with the given prototype,
|
||||||
|
consisting of return type, parameters, and attributes.
|
||||||
|
Example:
|
||||||
|
_GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
*/
|
||||||
|
#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_EXTERN_C rettype func parameters_and_attributes
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_RPL (func, rettype, parameters);
|
||||||
|
declares a C++ alias called GNULIB_NAMESPACE::func
|
||||||
|
that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
|
||||||
|
Example:
|
||||||
|
_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
|
||||||
|
|
||||||
|
Wrapping rpl_func in an object with an inline conversion operator
|
||||||
|
avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
|
||||||
|
actually used in the program. */
|
||||||
|
#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
|
||||||
|
_GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
static const struct _gl_ ## func ## _wrapper \
|
||||||
|
{ \
|
||||||
|
typedef rettype (*type) parameters; \
|
||||||
|
\
|
||||||
|
inline operator type () const \
|
||||||
|
{ \
|
||||||
|
return ::rpl_func; \
|
||||||
|
} \
|
||||||
|
} func = {}; \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
|
||||||
|
is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
|
||||||
|
except that the C function rpl_func may have a slightly different
|
||||||
|
declaration. A cast is used to silence the "invalid conversion" error
|
||||||
|
that would otherwise occur. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
static const struct _gl_ ## func ## _wrapper \
|
||||||
|
{ \
|
||||||
|
typedef rettype (*type) parameters; \
|
||||||
|
\
|
||||||
|
inline operator type () const \
|
||||||
|
{ \
|
||||||
|
return reinterpret_cast<type>(::rpl_func); \
|
||||||
|
} \
|
||||||
|
} func = {}; \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_SYS (func, rettype, parameters);
|
||||||
|
declares a C++ alias called GNULIB_NAMESPACE::func
|
||||||
|
that redirects to the system provided function func, if GNULIB_NAMESPACE
|
||||||
|
is defined.
|
||||||
|
Example:
|
||||||
|
_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
|
||||||
|
|
||||||
|
Wrapping func in an object with an inline conversion operator
|
||||||
|
avoids a reference to func unless GNULIB_NAMESPACE::func is
|
||||||
|
actually used in the program. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
static const struct _gl_ ## func ## _wrapper \
|
||||||
|
{ \
|
||||||
|
typedef rettype (*type) parameters; \
|
||||||
|
\
|
||||||
|
inline operator type () const \
|
||||||
|
{ \
|
||||||
|
return ::func; \
|
||||||
|
} \
|
||||||
|
} func = {}; \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
|
||||||
|
is like _GL_CXXALIAS_SYS (func, rettype, parameters);
|
||||||
|
except that the C function func may have a slightly different declaration.
|
||||||
|
A cast is used to silence the "invalid conversion" error that would
|
||||||
|
otherwise occur. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
static const struct _gl_ ## func ## _wrapper \
|
||||||
|
{ \
|
||||||
|
typedef rettype (*type) parameters; \
|
||||||
|
\
|
||||||
|
inline operator type () const \
|
||||||
|
{ \
|
||||||
|
return reinterpret_cast<type>(::func); \
|
||||||
|
} \
|
||||||
|
} func = {}; \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
|
||||||
|
is like _GL_CXXALIAS_SYS (func, rettype, parameters);
|
||||||
|
except that the C function is picked among a set of overloaded functions,
|
||||||
|
namely the one with rettype2 and parameters2. Two consecutive casts
|
||||||
|
are used to silence the "cannot find a match" and "invalid conversion"
|
||||||
|
errors that would otherwise occur. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
/* The outer cast must be a reinterpret_cast.
|
||||||
|
The inner cast: When the function is defined as a set of overloaded
|
||||||
|
functions, it works as a static_cast<>, choosing the designated variant.
|
||||||
|
When the function is defined as a single variant, it works as a
|
||||||
|
reinterpret_cast<>. The parenthesized cast syntax works both ways. */
|
||||||
|
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
|
||||||
|
namespace GNULIB_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
static const struct _gl_ ## func ## _wrapper \
|
||||||
|
{ \
|
||||||
|
typedef rettype (*type) parameters; \
|
||||||
|
\
|
||||||
|
inline operator type () const \
|
||||||
|
{ \
|
||||||
|
return reinterpret_cast<type>((rettype2 (*) parameters2)(::func)); \
|
||||||
|
} \
|
||||||
|
} func = {}; \
|
||||||
|
} \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIASWARN (func);
|
||||||
|
causes a warning to be emitted when ::func is used but not when
|
||||||
|
GNULIB_NAMESPACE::func is used. func must be defined without overloaded
|
||||||
|
variants. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIASWARN(func) \
|
||||||
|
_GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
|
||||||
|
# define _GL_CXXALIASWARN_1(func,namespace) \
|
||||||
|
_GL_CXXALIASWARN_2 (func, namespace)
|
||||||
|
/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
||||||
|
we enable the warning only when not optimizing. */
|
||||||
|
# if !__OPTIMIZE__
|
||||||
|
# define _GL_CXXALIASWARN_2(func,namespace) \
|
||||||
|
_GL_WARN_ON_USE (func, \
|
||||||
|
"The symbol ::" #func " refers to the system function. " \
|
||||||
|
"Use " #namespace "::" #func " instead.")
|
||||||
|
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||||
|
# define _GL_CXXALIASWARN_2(func,namespace) \
|
||||||
|
extern __typeof__ (func) func
|
||||||
|
# else
|
||||||
|
# define _GL_CXXALIASWARN_2(func,namespace) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIASWARN(func) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
|
||||||
|
causes a warning to be emitted when the given overloaded variant of ::func
|
||||||
|
is used but not when GNULIB_NAMESPACE::func is used. */
|
||||||
|
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
|
||||||
|
GNULIB_NAMESPACE)
|
||||||
|
# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
|
||||||
|
_GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
|
||||||
|
/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
||||||
|
we enable the warning only when not optimizing. */
|
||||||
|
# if !__OPTIMIZE__
|
||||||
|
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
||||||
|
_GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
|
||||||
|
"The symbol ::" #func " refers to the system function. " \
|
||||||
|
"Use " #namespace "::" #func " instead.")
|
||||||
|
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||||
|
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
||||||
|
extern __typeof__ (func) func
|
||||||
|
# else
|
||||||
|
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
|
||||||
|
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _GL_CXXDEFS_H */
|
279
lib/errno.in.h
Normal file
279
lib/errno.in.h
Normal file
|
@ -0,0 +1,279 @@
|
||||||
|
/* A POSIX-like <errno.h>.
|
||||||
|
|
||||||
|
Copyright (C) 2008-2018 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 <https://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 __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 __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
|
||||||
|
|
||||||
|
# ifndef EILSEQ
|
||||||
|
# define EILSEQ 2015
|
||||||
|
# define GNULIB_defined_EILSEQ 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-2018 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 <https://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-2018 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 <https://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-2018 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 <https://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
|
||||||
|
<https://lists.gnu.org/r/bug-gnulib/2008-07/msg00063.html>. */
|
||||||
|
#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
|
||||||
|
/* 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.362103143112093506262677817321752E-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 */
|
77
lib/fprintf.c
Normal file
77
lib/fprintf.c
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/* Formatted output to a stream.
|
||||||
|
Copyright (C) 2004, 2006-2018 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 <https://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 "fseterr.h"
|
||||||
|
#include "vasnprintf.h"
|
||||||
|
|
||||||
|
/* Print formatted output to the stream FP.
|
||||||
|
Return string length of formatted string. On error, return a negative
|
||||||
|
value. */
|
||||||
|
int
|
||||||
|
fprintf (FILE *fp, const char *format, ...)
|
||||||
|
{
|
||||||
|
char buf[2000];
|
||||||
|
char *output;
|
||||||
|
size_t len;
|
||||||
|
size_t lenbuf = sizeof (buf);
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
output = vasnprintf (buf, &lenbuf, format, args);
|
||||||
|
len = lenbuf;
|
||||||
|
va_end (args);
|
||||||
|
|
||||||
|
if (!output)
|
||||||
|
{
|
||||||
|
fseterr (fp);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fwrite (output, 1, len, fp) < len)
|
||||||
|
{
|
||||||
|
if (output != buf)
|
||||||
|
{
|
||||||
|
int saved_errno = errno;
|
||||||
|
free (output);
|
||||||
|
errno = saved_errno;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (output != buf)
|
||||||
|
free (output);
|
||||||
|
|
||||||
|
if (len > INT_MAX)
|
||||||
|
{
|
||||||
|
errno = EOVERFLOW;
|
||||||
|
fseterr (fp);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
108
lib/fpucw.h
Normal file
108
lib/fpucw.h
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
/* Manipulating the FPU control word. -*- coding: utf-8 -*-
|
||||||
|
Copyright (C) 2007-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _FPUCW_H
|
||||||
|
#define _FPUCW_H
|
||||||
|
|
||||||
|
/* The i386 floating point hardware (the 387 compatible FPU, not the modern
|
||||||
|
SSE/SSE2 hardware) has a controllable rounding precision. It is specified
|
||||||
|
through the 'PC' bits in the FPU control word ('fctrl' register). (See
|
||||||
|
the GNU libc i386 <fpu_control.h> header for details.)
|
||||||
|
|
||||||
|
On some platforms, such as Linux or Solaris, the default precision setting
|
||||||
|
is set to "extended precision". This means that 'long double' instructions
|
||||||
|
operate correctly, but 'double' computations often produce slightly
|
||||||
|
different results as on strictly IEEE 754 conforming systems.
|
||||||
|
|
||||||
|
On some platforms, such as NetBSD, the default precision is set to
|
||||||
|
"double precision". This means that 'long double' instructions will operate
|
||||||
|
only as 'double', i.e. lead to wrong results. Similarly on FreeBSD 6.4, at
|
||||||
|
least for the division of 'long double' numbers.
|
||||||
|
|
||||||
|
The FPU control word is under control of the application, i.e. it is
|
||||||
|
not required to be set either way by the ABI. (In fact, the i386 ABI
|
||||||
|
https://www.linux-mips.org/pub/linux/mips/doc/ABI/abi386-4.pdf page 3-12 = page 38
|
||||||
|
is not clear about it. But in any case, gcc treats the control word
|
||||||
|
like a "preserved" register: it emits code that assumes that the control
|
||||||
|
word is preserved across calls, and it restores the control word at the
|
||||||
|
end of functions that modify it.)
|
||||||
|
|
||||||
|
See Vincent Lefèvre's page https://www.vinc17.net/research/extended.en.html
|
||||||
|
for a good explanation.
|
||||||
|
See http://www.uwsg.iu.edu/hypermail/linux/kernel/0103.0/0453.html for
|
||||||
|
some argumentation which setting should be the default. */
|
||||||
|
|
||||||
|
/* This header file provides the following facilities:
|
||||||
|
fpucw_t integral type holding the value of 'fctrl'
|
||||||
|
FPU_PC_MASK bit mask denoting the precision control
|
||||||
|
FPU_PC_DOUBLE precision control for 53 bits mantissa
|
||||||
|
FPU_PC_EXTENDED precision control for 64 bits mantissa
|
||||||
|
GET_FPUCW () yields the current FPU control word
|
||||||
|
SET_FPUCW (word) sets the FPU control word
|
||||||
|
DECL_LONG_DOUBLE_ROUNDING variable declaration for
|
||||||
|
BEGIN/END_LONG_DOUBLE_ROUNDING
|
||||||
|
BEGIN_LONG_DOUBLE_ROUNDING () starts a sequence of instructions with
|
||||||
|
'long double' safe operation precision
|
||||||
|
END_LONG_DOUBLE_ROUNDING () ends a sequence of instructions with
|
||||||
|
'long double' safe operation precision
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Inline assembler like this works only with GNU C. */
|
||||||
|
#if (defined __i386__ || defined __x86_64__) && defined __GNUC__
|
||||||
|
|
||||||
|
typedef unsigned short fpucw_t; /* glibc calls this fpu_control_t */
|
||||||
|
|
||||||
|
# define FPU_PC_MASK 0x0300
|
||||||
|
# define FPU_PC_DOUBLE 0x200 /* glibc calls this _FPU_DOUBLE */
|
||||||
|
# define FPU_PC_EXTENDED 0x300 /* glibc calls this _FPU_EXTENDED */
|
||||||
|
|
||||||
|
# define GET_FPUCW() \
|
||||||
|
({ fpucw_t _cw; \
|
||||||
|
__asm__ __volatile__ ("fnstcw %0" : "=m" (*&_cw)); \
|
||||||
|
_cw; \
|
||||||
|
})
|
||||||
|
# define SET_FPUCW(word) \
|
||||||
|
(void)({ fpucw_t _ncw = (word); \
|
||||||
|
__asm__ __volatile__ ("fldcw %0" : : "m" (*&_ncw)); \
|
||||||
|
})
|
||||||
|
|
||||||
|
# define DECL_LONG_DOUBLE_ROUNDING \
|
||||||
|
fpucw_t oldcw;
|
||||||
|
# define BEGIN_LONG_DOUBLE_ROUNDING() \
|
||||||
|
(void)(oldcw = GET_FPUCW (), \
|
||||||
|
SET_FPUCW ((oldcw & ~FPU_PC_MASK) | FPU_PC_EXTENDED))
|
||||||
|
# define END_LONG_DOUBLE_ROUNDING() \
|
||||||
|
SET_FPUCW (oldcw)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
typedef unsigned int fpucw_t;
|
||||||
|
|
||||||
|
# define FPU_PC_MASK 0
|
||||||
|
# define FPU_PC_DOUBLE 0
|
||||||
|
# define FPU_PC_EXTENDED 0
|
||||||
|
|
||||||
|
# define GET_FPUCW() 0
|
||||||
|
# define SET_FPUCW(word) (void)(word)
|
||||||
|
|
||||||
|
# define DECL_LONG_DOUBLE_ROUNDING
|
||||||
|
# define BEGIN_LONG_DOUBLE_ROUNDING()
|
||||||
|
# define END_LONG_DOUBLE_ROUNDING()
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _FPUCW_H */
|
168
lib/frexp.c
Normal file
168
lib/frexp.c
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
/* Split a double into fraction and mantissa.
|
||||||
|
Copyright (C) 2007-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Paolo Bonzini <bonzini@gnu.org>, 2003, and
|
||||||
|
Bruno Haible <bruno@clisp.org>, 2007. */
|
||||||
|
|
||||||
|
#if ! defined USE_LONG_DOUBLE
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <float.h>
|
||||||
|
#ifdef USE_LONG_DOUBLE
|
||||||
|
# include "isnanl-nolibm.h"
|
||||||
|
# include "fpucw.h"
|
||||||
|
#else
|
||||||
|
# include "isnand-nolibm.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This file assumes FLT_RADIX = 2. If FLT_RADIX is a power of 2 greater
|
||||||
|
than 2, or not even a power of 2, some rounding errors can occur, so that
|
||||||
|
then the returned mantissa is only guaranteed to be <= 1.0, not < 1.0. */
|
||||||
|
|
||||||
|
#ifdef USE_LONG_DOUBLE
|
||||||
|
# define FUNC frexpl
|
||||||
|
# define DOUBLE long double
|
||||||
|
# define ISNAN isnanl
|
||||||
|
# define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING
|
||||||
|
# define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING ()
|
||||||
|
# define END_ROUNDING() END_LONG_DOUBLE_ROUNDING ()
|
||||||
|
# define L_(literal) literal##L
|
||||||
|
#else
|
||||||
|
# define FUNC frexp
|
||||||
|
# define DOUBLE double
|
||||||
|
# define ISNAN isnand
|
||||||
|
# define DECL_ROUNDING
|
||||||
|
# define BEGIN_ROUNDING()
|
||||||
|
# define END_ROUNDING()
|
||||||
|
# define L_(literal) literal
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DOUBLE
|
||||||
|
FUNC (DOUBLE x, int *expptr)
|
||||||
|
{
|
||||||
|
int sign;
|
||||||
|
int exponent;
|
||||||
|
DECL_ROUNDING
|
||||||
|
|
||||||
|
/* Test for NaN, infinity, and zero. */
|
||||||
|
if (ISNAN (x) || x + x == x)
|
||||||
|
{
|
||||||
|
*expptr = 0;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
sign = 0;
|
||||||
|
if (x < 0)
|
||||||
|
{
|
||||||
|
x = - x;
|
||||||
|
sign = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN_ROUNDING ();
|
||||||
|
|
||||||
|
{
|
||||||
|
/* Since the exponent is an 'int', it fits in 64 bits. Therefore the
|
||||||
|
loops are executed no more than 64 times. */
|
||||||
|
DOUBLE pow2[64]; /* pow2[i] = 2^2^i */
|
||||||
|
DOUBLE powh[64]; /* powh[i] = 2^-2^i */
|
||||||
|
int i;
|
||||||
|
|
||||||
|
exponent = 0;
|
||||||
|
if (x >= L_(1.0))
|
||||||
|
{
|
||||||
|
/* A positive exponent. */
|
||||||
|
DOUBLE pow2_i; /* = pow2[i] */
|
||||||
|
DOUBLE powh_i; /* = powh[i] */
|
||||||
|
|
||||||
|
/* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
|
||||||
|
x * 2^exponent = argument, x >= 1.0. */
|
||||||
|
for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
|
||||||
|
;
|
||||||
|
i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
|
||||||
|
{
|
||||||
|
if (x >= pow2_i)
|
||||||
|
{
|
||||||
|
exponent += (1 << i);
|
||||||
|
x *= powh_i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
|
||||||
|
pow2[i] = pow2_i;
|
||||||
|
powh[i] = powh_i;
|
||||||
|
}
|
||||||
|
/* Avoid making x too small, as it could become a denormalized
|
||||||
|
number and thus lose precision. */
|
||||||
|
while (i > 0 && x < pow2[i - 1])
|
||||||
|
{
|
||||||
|
i--;
|
||||||
|
powh_i = powh[i];
|
||||||
|
}
|
||||||
|
exponent += (1 << i);
|
||||||
|
x *= powh_i;
|
||||||
|
/* Here 2^-2^i <= x < 1.0. */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* A negative or zero exponent. */
|
||||||
|
DOUBLE pow2_i; /* = pow2[i] */
|
||||||
|
DOUBLE powh_i; /* = powh[i] */
|
||||||
|
|
||||||
|
/* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
|
||||||
|
x * 2^exponent = argument, x < 1.0. */
|
||||||
|
for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
|
||||||
|
;
|
||||||
|
i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
|
||||||
|
{
|
||||||
|
if (x < powh_i)
|
||||||
|
{
|
||||||
|
exponent -= (1 << i);
|
||||||
|
x *= pow2_i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
|
||||||
|
pow2[i] = pow2_i;
|
||||||
|
powh[i] = powh_i;
|
||||||
|
}
|
||||||
|
/* Here 2^-2^i <= x < 1.0. */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Invariants: x * 2^exponent = argument, and 2^-2^i <= x < 1.0. */
|
||||||
|
while (i > 0)
|
||||||
|
{
|
||||||
|
i--;
|
||||||
|
if (x < powh[i])
|
||||||
|
{
|
||||||
|
exponent -= (1 << i);
|
||||||
|
x *= pow2[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Here 0.5 <= x < 1.0. */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sign < 0)
|
||||||
|
x = - x;
|
||||||
|
|
||||||
|
END_ROUNDING ();
|
||||||
|
|
||||||
|
*expptr = exponent;
|
||||||
|
return x;
|
||||||
|
}
|
35
lib/frexpl.c
Normal file
35
lib/frexpl.c
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
/* Split a 'long double' into fraction and mantissa.
|
||||||
|
Copyright (C) 2007, 2009-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
# include <math.h>
|
||||||
|
|
||||||
|
long double
|
||||||
|
frexpl (long double x, int *expptr)
|
||||||
|
{
|
||||||
|
return frexp (x, expptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
# define USE_LONG_DOUBLE
|
||||||
|
# include "frexp.c"
|
||||||
|
|
||||||
|
#endif
|
84
lib/fseterr.c
Normal file
84
lib/fseterr.c
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
/* Set the error indicator of a stream.
|
||||||
|
Copyright (C) 2007-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "fseterr.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "stdio-impl.h"
|
||||||
|
|
||||||
|
/* This file is not used on systems that have the __fseterr function,
|
||||||
|
namely musl libc. */
|
||||||
|
|
||||||
|
void
|
||||||
|
fseterr (FILE *fp)
|
||||||
|
{
|
||||||
|
/* Most systems provide FILE as a struct and the necessary bitmask in
|
||||||
|
<stdio.h>, because they need it for implementing getc() and putc() as
|
||||||
|
fast macros. */
|
||||||
|
#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
|
||||||
|
/* GNU libc, BeOS, Haiku, Linux libc5 */
|
||||||
|
fp->_flags |= _IO_ERR_SEEN;
|
||||||
|
#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
|
||||||
|
/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
|
||||||
|
fp_->_flags |= __SERR;
|
||||||
|
#elif defined __EMX__ /* emx+gcc */
|
||||||
|
fp->_flags |= _IOERR;
|
||||||
|
#elif defined __minix /* Minix */
|
||||||
|
fp->_flags |= _IOERR;
|
||||||
|
#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel, OpenVMS */
|
||||||
|
fp_->_flag |= _IOERR;
|
||||||
|
#elif defined __UCLIBC__ /* uClibc */
|
||||||
|
fp->__modeflags |= __FLAG_ERROR;
|
||||||
|
#elif defined __QNX__ /* QNX */
|
||||||
|
fp->_Mode |= 0x200 /* _MERR */;
|
||||||
|
#elif defined __MINT__ /* Atari FreeMiNT */
|
||||||
|
fp->__error = 1;
|
||||||
|
#elif defined EPLAN9 /* Plan9 */
|
||||||
|
if (fp->state != 0 /* CLOSED */)
|
||||||
|
fp->state = 5 /* ERR */;
|
||||||
|
#elif 0 /* unknown */
|
||||||
|
/* Portable fallback, based on an idea by Rich Felker.
|
||||||
|
Wow! 6 system calls for something that is just a bit operation!
|
||||||
|
Not activated on any system, because there is no way to repair FP when
|
||||||
|
the sequence of system calls fails, and library code should not call
|
||||||
|
abort(). */
|
||||||
|
int saved_errno;
|
||||||
|
int fd;
|
||||||
|
int fd2;
|
||||||
|
|
||||||
|
saved_errno = errno;
|
||||||
|
fflush (fp);
|
||||||
|
fd = fileno (fp);
|
||||||
|
fd2 = dup (fd);
|
||||||
|
if (fd2 >= 0)
|
||||||
|
{
|
||||||
|
close (fd);
|
||||||
|
fputc ('\0', fp); /* This should set the error indicator. */
|
||||||
|
fflush (fp); /* Or this. */
|
||||||
|
if (dup2 (fd2, fd) < 0)
|
||||||
|
/* Whee... we botched the stream and now cannot restore it! */
|
||||||
|
abort ();
|
||||||
|
close (fd2);
|
||||||
|
}
|
||||||
|
errno = saved_errno;
|
||||||
|
#else
|
||||||
|
#error "Please port gnulib fseterr.c to your platform! Look at the definitions of ferror and clearerr on your system, then report this to bug-gnulib."
|
||||||
|
#endif
|
||||||
|
}
|
45
lib/fseterr.h
Normal file
45
lib/fseterr.h
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/* Set the error indicator of a stream.
|
||||||
|
Copyright (C) 2007, 2009-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _FSETERR_H
|
||||||
|
#define _FSETERR_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* Set the error indicator of the stream FP.
|
||||||
|
The "error indicator" is set when an I/O operation on the stream fails, and
|
||||||
|
is cleared (together with the "end-of-file" indicator) by clearerr (FP). */
|
||||||
|
|
||||||
|
#if HAVE___FSETERR /* musl libc */
|
||||||
|
|
||||||
|
# include <stdio_ext.h>
|
||||||
|
# define fseterr(fp) __fseterr (fp)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
# endif
|
||||||
|
|
||||||
|
extern void fseterr (FILE *fp);
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _FSETERR_H */
|
131
lib/getrusage.c
Normal file
131
lib/getrusage.c
Normal file
|
@ -0,0 +1,131 @@
|
||||||
|
/* getrusage replacement for systems which lack it.
|
||||||
|
|
||||||
|
Copyright (C) 2012-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Bruno Haible, 2012. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <sys/resource.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* Get uint64_t. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#if defined _WIN32 && ! defined __CYGWIN__
|
||||||
|
|
||||||
|
# define WIN32_LEAN_AND_MEAN
|
||||||
|
# include <windows.h>
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
# include <sys/times.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
getrusage (int who, struct rusage *usage_p)
|
||||||
|
{
|
||||||
|
if (who == RUSAGE_SELF || who == RUSAGE_CHILDREN)
|
||||||
|
{
|
||||||
|
/* Clear all unsupported members of 'struct rusage'. */
|
||||||
|
memset (usage_p, '\0', sizeof (struct rusage));
|
||||||
|
|
||||||
|
#if defined _WIN32 && ! defined __CYGWIN__
|
||||||
|
if (who == RUSAGE_SELF)
|
||||||
|
{
|
||||||
|
/* Fill in the ru_utime and ru_stime members. */
|
||||||
|
FILETIME creation_time;
|
||||||
|
FILETIME exit_time;
|
||||||
|
FILETIME kernel_time;
|
||||||
|
FILETIME user_time;
|
||||||
|
|
||||||
|
if (GetProcessTimes (GetCurrentProcess (),
|
||||||
|
&creation_time, &exit_time,
|
||||||
|
&kernel_time, &user_time))
|
||||||
|
{
|
||||||
|
/* Convert to microseconds, rounding. */
|
||||||
|
uint64_t kernel_usec =
|
||||||
|
((((uint64_t) kernel_time.dwHighDateTime << 32)
|
||||||
|
| (uint64_t) kernel_time.dwLowDateTime)
|
||||||
|
+ 5) / 10;
|
||||||
|
uint64_t user_usec =
|
||||||
|
((((uint64_t) user_time.dwHighDateTime << 32)
|
||||||
|
| (uint64_t) user_time.dwLowDateTime)
|
||||||
|
+ 5) / 10;
|
||||||
|
|
||||||
|
usage_p->ru_utime.tv_sec = user_usec / 1000000U;
|
||||||
|
usage_p->ru_utime.tv_usec = user_usec % 1000000U;
|
||||||
|
usage_p->ru_stime.tv_sec = kernel_usec / 1000000U;
|
||||||
|
usage_p->ru_stime.tv_usec = kernel_usec % 1000000U;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* Fill in the ru_utime and ru_stime members. */
|
||||||
|
{
|
||||||
|
struct tms time;
|
||||||
|
|
||||||
|
if (times (&time) != (clock_t) -1)
|
||||||
|
{
|
||||||
|
/* Number of clock ticks per second. */
|
||||||
|
unsigned int clocks_per_second = sysconf (_SC_CLK_TCK);
|
||||||
|
|
||||||
|
if (clocks_per_second > 0)
|
||||||
|
{
|
||||||
|
clock_t user_ticks;
|
||||||
|
clock_t system_ticks;
|
||||||
|
|
||||||
|
uint64_t user_usec;
|
||||||
|
uint64_t system_usec;
|
||||||
|
|
||||||
|
if (who == RUSAGE_CHILDREN)
|
||||||
|
{
|
||||||
|
user_ticks = time.tms_cutime;
|
||||||
|
system_ticks = time.tms_cstime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
user_ticks = time.tms_utime;
|
||||||
|
system_ticks = time.tms_stime;
|
||||||
|
}
|
||||||
|
|
||||||
|
user_usec =
|
||||||
|
(((uint64_t) user_ticks * (uint64_t) 1000000U)
|
||||||
|
+ clocks_per_second / 2) / clocks_per_second;
|
||||||
|
system_usec =
|
||||||
|
(((uint64_t) system_ticks * (uint64_t) 1000000U)
|
||||||
|
+ clocks_per_second / 2) / clocks_per_second;
|
||||||
|
|
||||||
|
usage_p->ru_utime.tv_sec = user_usec / 1000000U;
|
||||||
|
usage_p->ru_utime.tv_usec = user_usec % 1000000U;
|
||||||
|
usage_p->ru_stime.tv_sec = system_usec / 1000000U;
|
||||||
|
usage_p->ru_stime.tv_usec = system_usec % 1000000U;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
189
lib/isnan.c
Normal file
189
lib/isnan.c
Normal file
|
@ -0,0 +1,189 @@
|
||||||
|
/* Test for NaN that does not need libm.
|
||||||
|
Copyright (C) 2007-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#ifdef USE_LONG_DOUBLE
|
||||||
|
/* Specification found in math.h or isnanl-nolibm.h. */
|
||||||
|
extern int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST;
|
||||||
|
#elif ! defined USE_FLOAT
|
||||||
|
/* Specification found in math.h or isnand-nolibm.h. */
|
||||||
|
extern int rpl_isnand (double x);
|
||||||
|
#else /* defined USE_FLOAT */
|
||||||
|
/* Specification found in math.h or isnanf-nolibm.h. */
|
||||||
|
extern int rpl_isnanf (float x);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <float.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "float+.h"
|
||||||
|
|
||||||
|
#ifdef USE_LONG_DOUBLE
|
||||||
|
# define FUNC rpl_isnanl
|
||||||
|
# define DOUBLE long double
|
||||||
|
# define MAX_EXP LDBL_MAX_EXP
|
||||||
|
# define MIN_EXP LDBL_MIN_EXP
|
||||||
|
# if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
|
||||||
|
# define KNOWN_EXPBIT0_LOCATION
|
||||||
|
# define EXPBIT0_WORD LDBL_EXPBIT0_WORD
|
||||||
|
# define EXPBIT0_BIT LDBL_EXPBIT0_BIT
|
||||||
|
# endif
|
||||||
|
# define SIZE SIZEOF_LDBL
|
||||||
|
# define L_(literal) literal##L
|
||||||
|
#elif ! defined USE_FLOAT
|
||||||
|
# define FUNC rpl_isnand
|
||||||
|
# define DOUBLE double
|
||||||
|
# define MAX_EXP DBL_MAX_EXP
|
||||||
|
# define MIN_EXP DBL_MIN_EXP
|
||||||
|
# if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
|
||||||
|
# define KNOWN_EXPBIT0_LOCATION
|
||||||
|
# define EXPBIT0_WORD DBL_EXPBIT0_WORD
|
||||||
|
# define EXPBIT0_BIT DBL_EXPBIT0_BIT
|
||||||
|
# endif
|
||||||
|
# define SIZE SIZEOF_DBL
|
||||||
|
# define L_(literal) literal
|
||||||
|
#else /* defined USE_FLOAT */
|
||||||
|
# define FUNC rpl_isnanf
|
||||||
|
# define DOUBLE float
|
||||||
|
# define MAX_EXP FLT_MAX_EXP
|
||||||
|
# define MIN_EXP FLT_MIN_EXP
|
||||||
|
# if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
|
||||||
|
# define KNOWN_EXPBIT0_LOCATION
|
||||||
|
# define EXPBIT0_WORD FLT_EXPBIT0_WORD
|
||||||
|
# define EXPBIT0_BIT FLT_EXPBIT0_BIT
|
||||||
|
# endif
|
||||||
|
# define SIZE SIZEOF_FLT
|
||||||
|
# define L_(literal) literal##f
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define EXP_MASK ((MAX_EXP - MIN_EXP) | 7)
|
||||||
|
|
||||||
|
#define NWORDS \
|
||||||
|
((sizeof (DOUBLE) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
|
||||||
|
typedef union { DOUBLE value; unsigned int word[NWORDS]; } memory_double;
|
||||||
|
|
||||||
|
/* Most hosts nowadays use IEEE floating point, so they use IEC 60559
|
||||||
|
representations, have infinities and NaNs, and do not trap on
|
||||||
|
exceptions. Define IEEE_FLOATING_POINT if this host is one of the
|
||||||
|
typical ones. The C11 macro __STDC_IEC_559__ is close to what is
|
||||||
|
wanted here, but is not quite right because this file does not require
|
||||||
|
all the features of C11 Annex F (and does not require C11 at all,
|
||||||
|
for that matter). */
|
||||||
|
|
||||||
|
#define IEEE_FLOATING_POINT (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
|
||||||
|
&& FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
|
||||||
|
|
||||||
|
int
|
||||||
|
FUNC (DOUBLE x)
|
||||||
|
{
|
||||||
|
#if defined KNOWN_EXPBIT0_LOCATION && IEEE_FLOATING_POINT
|
||||||
|
# if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
|
||||||
|
/* Special CPU dependent code is needed to treat bit patterns outside the
|
||||||
|
IEEE 754 specification (such as Pseudo-NaNs, Pseudo-Infinities,
|
||||||
|
Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals) as NaNs.
|
||||||
|
These bit patterns are:
|
||||||
|
- exponent = 0x0001..0x7FFF, mantissa bit 63 = 0,
|
||||||
|
- exponent = 0x0000, mantissa bit 63 = 1.
|
||||||
|
The NaN bit pattern is:
|
||||||
|
- exponent = 0x7FFF, mantissa >= 0x8000000000000001. */
|
||||||
|
memory_double m;
|
||||||
|
unsigned int exponent;
|
||||||
|
|
||||||
|
m.value = x;
|
||||||
|
exponent = (m.word[EXPBIT0_WORD] >> EXPBIT0_BIT) & EXP_MASK;
|
||||||
|
# ifdef WORDS_BIGENDIAN
|
||||||
|
/* Big endian: EXPBIT0_WORD = 0, EXPBIT0_BIT = 16. */
|
||||||
|
if (exponent == 0)
|
||||||
|
return 1 & (m.word[0] >> 15);
|
||||||
|
else if (exponent == EXP_MASK)
|
||||||
|
return (((m.word[0] ^ 0x8000U) << 16) | m.word[1] | (m.word[2] >> 16)) != 0;
|
||||||
|
else
|
||||||
|
return 1 & ~(m.word[0] >> 15);
|
||||||
|
# else
|
||||||
|
/* Little endian: EXPBIT0_WORD = 2, EXPBIT0_BIT = 0. */
|
||||||
|
if (exponent == 0)
|
||||||
|
return (m.word[1] >> 31);
|
||||||
|
else if (exponent == EXP_MASK)
|
||||||
|
return ((m.word[1] ^ 0x80000000U) | m.word[0]) != 0;
|
||||||
|
else
|
||||||
|
return (m.word[1] >> 31) ^ 1;
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
/* Be careful to not do any floating-point operation on x, such as x == x,
|
||||||
|
because x may be a signaling NaN. */
|
||||||
|
# if defined __SUNPRO_C || defined __ICC || defined _MSC_VER \
|
||||||
|
|| defined __DECC || defined __TINYC__ \
|
||||||
|
|| (defined __sgi && !defined __GNUC__)
|
||||||
|
/* The Sun C 5.0, Intel ICC 10.0, Microsoft Visual C/C++ 9.0, Compaq (ex-DEC)
|
||||||
|
6.4, and TinyCC compilers don't recognize the initializers as constant
|
||||||
|
expressions. The Compaq compiler also fails when constant-folding
|
||||||
|
0.0 / 0.0 even when constant-folding is not required. The Microsoft
|
||||||
|
Visual C/C++ compiler also fails when constant-folding 1.0 / 0.0 even
|
||||||
|
when constant-folding is not required. The SGI MIPSpro C compiler
|
||||||
|
complains about "floating-point operation result is out of range". */
|
||||||
|
static DOUBLE zero = L_(0.0);
|
||||||
|
memory_double nan;
|
||||||
|
DOUBLE plus_inf = L_(1.0) / zero;
|
||||||
|
DOUBLE minus_inf = -L_(1.0) / zero;
|
||||||
|
nan.value = zero / zero;
|
||||||
|
# else
|
||||||
|
static memory_double nan = { L_(0.0) / L_(0.0) };
|
||||||
|
static DOUBLE plus_inf = L_(1.0) / L_(0.0);
|
||||||
|
static DOUBLE minus_inf = -L_(1.0) / L_(0.0);
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
memory_double m;
|
||||||
|
|
||||||
|
/* A NaN can be recognized through its exponent. But exclude +Infinity and
|
||||||
|
-Infinity, which have the same exponent. */
|
||||||
|
m.value = x;
|
||||||
|
if (((m.word[EXPBIT0_WORD] ^ nan.word[EXPBIT0_WORD])
|
||||||
|
& (EXP_MASK << EXPBIT0_BIT))
|
||||||
|
== 0)
|
||||||
|
return (memcmp (&m.value, &plus_inf, SIZE) != 0
|
||||||
|
&& memcmp (&m.value, &minus_inf, SIZE) != 0);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
/* The configuration did not find sufficient information, or does
|
||||||
|
not use IEEE floating point. Give up about the signaling NaNs;
|
||||||
|
handle only the quiet NaNs. */
|
||||||
|
if (x == x)
|
||||||
|
{
|
||||||
|
# if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
|
||||||
|
/* Detect any special bit patterns that pass ==; see comment above. */
|
||||||
|
memory_double m1;
|
||||||
|
memory_double m2;
|
||||||
|
|
||||||
|
memset (&m1.value, 0, SIZE);
|
||||||
|
memset (&m2.value, 0, SIZE);
|
||||||
|
m1.value = x;
|
||||||
|
m2.value = x + (x ? 0.0L : -0.0L);
|
||||||
|
if (memcmp (&m1.value, &m2.value, SIZE) != 0)
|
||||||
|
return 1;
|
||||||
|
# endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
|
}
|
33
lib/isnand-nolibm.h
Normal file
33
lib/isnand-nolibm.h
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/* Test for NaN that does not need libm.
|
||||||
|
Copyright (C) 2007-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#if HAVE_ISNAND_IN_LIBC
|
||||||
|
/* Get declaration of isnan macro. */
|
||||||
|
# include <math.h>
|
||||||
|
# if __GNUC__ >= 4
|
||||||
|
/* GCC 4.0 and newer provides three built-ins for isnan. */
|
||||||
|
# undef isnand
|
||||||
|
# define isnand(x) __builtin_isnan ((double)(x))
|
||||||
|
# else
|
||||||
|
# undef isnand
|
||||||
|
# define isnand(x) isnan ((double)(x))
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
/* Test whether X is a NaN. */
|
||||||
|
# undef isnand
|
||||||
|
# define isnand rpl_isnand
|
||||||
|
extern int isnand (double x);
|
||||||
|
#endif
|
19
lib/isnand.c
Normal file
19
lib/isnand.c
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/* Test for NaN that does not need libm.
|
||||||
|
Copyright (C) 2008-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
|
||||||
|
|
||||||
|
#include "isnan.c"
|
40
lib/isnanf-nolibm.h
Normal file
40
lib/isnanf-nolibm.h
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/* Test for NaN that does not need libm.
|
||||||
|
Copyright (C) 2007-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#if HAVE_ISNANF_IN_LIBC
|
||||||
|
/* Get declaration of isnan macro or (older) isnanf function. */
|
||||||
|
# include <math.h>
|
||||||
|
# if __GNUC__ >= 4
|
||||||
|
/* GCC 4.0 and newer provides three built-ins for isnan. */
|
||||||
|
# undef isnanf
|
||||||
|
# define isnanf(x) __builtin_isnanf ((float)(x))
|
||||||
|
# elif defined isnan
|
||||||
|
# undef isnanf
|
||||||
|
# define isnanf(x) isnan ((float)(x))
|
||||||
|
# else
|
||||||
|
/* Get declaration of isnanf(), if not declared in <math.h>. */
|
||||||
|
# if defined __sgi
|
||||||
|
/* We can't include <ieeefp.h>, because it conflicts with our definition of
|
||||||
|
isnand. Therefore declare isnanf separately. */
|
||||||
|
extern int isnanf (float x);
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
/* Test whether X is a NaN. */
|
||||||
|
# undef isnanf
|
||||||
|
# define isnanf rpl_isnanf
|
||||||
|
extern int isnanf (float x);
|
||||||
|
#endif
|
20
lib/isnanf.c
Normal file
20
lib/isnanf.c
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/* Test for NaN that does not need libm.
|
||||||
|
Copyright (C) 2007, 2009-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
|
||||||
|
|
||||||
|
#define USE_FLOAT
|
||||||
|
#include "isnan.c"
|
33
lib/isnanl-nolibm.h
Normal file
33
lib/isnanl-nolibm.h
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/* Test for NaN that does not need libm.
|
||||||
|
Copyright (C) 2007-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#if HAVE_ISNANL_IN_LIBC
|
||||||
|
/* Get declaration of isnan macro or (older) isnanl function. */
|
||||||
|
# include <math.h>
|
||||||
|
# if __GNUC__ >= 4
|
||||||
|
/* GCC 4.0 and newer provides three built-ins for isnan. */
|
||||||
|
# undef isnanl
|
||||||
|
# define isnanl(x) __builtin_isnanl ((long double)(x))
|
||||||
|
# elif defined isnan
|
||||||
|
# undef isnanl
|
||||||
|
# define isnanl(x) isnan ((long double)(x))
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
/* Test whether X is a NaN. */
|
||||||
|
# undef isnanl
|
||||||
|
# define isnanl rpl_isnanl
|
||||||
|
extern int isnanl (long double x);
|
||||||
|
#endif
|
20
lib/isnanl.c
Normal file
20
lib/isnanl.c
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/* Test for NaN that does not need libm.
|
||||||
|
Copyright (C) 2007, 2009-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
|
||||||
|
|
||||||
|
#define USE_LONG_DOUBLE
|
||||||
|
#include "isnan.c"
|
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-2018 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 <https://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;
|
||||||
|
}
|
74
lib/limits.in.h
Normal file
74
lib/limits.in.h
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
/* A GNU-like <limits.h>.
|
||||||
|
|
||||||
|
Copyright 2016-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_LIMITS_H
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
#@INCLUDE_NEXT@ @NEXT_LIMITS_H@
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_LIMITS_H
|
||||||
|
#define _@GUARD_PREFIX@_LIMITS_H
|
||||||
|
|
||||||
|
/* For HP-UX 11.31. */
|
||||||
|
#if defined LONG_LONG_MIN && !defined LLONG_MIN
|
||||||
|
# define LLONG_MIN LONG_LONG_MIN
|
||||||
|
#endif
|
||||||
|
#if defined LONG_LONG_MAX && !defined LLONG_MAX
|
||||||
|
# define LLONG_MAX LONG_LONG_MAX
|
||||||
|
#endif
|
||||||
|
#if defined ULONG_LONG_MAX && !defined ULLONG_MAX
|
||||||
|
# define ULLONG_MAX ULONG_LONG_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The number of usable bits in an unsigned or signed integer type
|
||||||
|
with minimum value MIN and maximum value MAX, as an int expression
|
||||||
|
suitable in #if. Cover all known practical hosts. This
|
||||||
|
implementation exploits the fact that MAX is 1 less than a power of
|
||||||
|
2, and merely counts the number of 1 bits in MAX; "COBn" means
|
||||||
|
"count the number of 1 bits in the low-order n bits"). */
|
||||||
|
#define _GL_INTEGER_WIDTH(min, max) (((min) < 0) + _GL_COB128 (max))
|
||||||
|
#define _GL_COB128(n) (_GL_COB64 ((n) >> 31 >> 31 >> 2) + _GL_COB64 (n))
|
||||||
|
#define _GL_COB64(n) (_GL_COB32 ((n) >> 31 >> 1) + _GL_COB32 (n))
|
||||||
|
#define _GL_COB32(n) (_GL_COB16 ((n) >> 16) + _GL_COB16 (n))
|
||||||
|
#define _GL_COB16(n) (_GL_COB8 ((n) >> 8) + _GL_COB8 (n))
|
||||||
|
#define _GL_COB8(n) (_GL_COB4 ((n) >> 4) + _GL_COB4 (n))
|
||||||
|
#define _GL_COB4(n) (!!((n) & 8) + !!((n) & 4) + !!((n) & 2) + !!((n) & 1))
|
||||||
|
|
||||||
|
/* Macros specified by ISO/IEC TS 18661-1:2014. */
|
||||||
|
|
||||||
|
#if (! defined ULLONG_WIDTH \
|
||||||
|
&& (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__))
|
||||||
|
# define CHAR_WIDTH _GL_INTEGER_WIDTH (CHAR_MIN, CHAR_MAX)
|
||||||
|
# define SCHAR_WIDTH _GL_INTEGER_WIDTH (SCHAR_MIN, SCHAR_MAX)
|
||||||
|
# define UCHAR_WIDTH _GL_INTEGER_WIDTH (0, UCHAR_MAX)
|
||||||
|
# define SHRT_WIDTH _GL_INTEGER_WIDTH (SHRT_MIN, SHRT_MAX)
|
||||||
|
# define USHRT_WIDTH _GL_INTEGER_WIDTH (0, USHRT_MAX)
|
||||||
|
# define INT_WIDTH _GL_INTEGER_WIDTH (INT_MIN, INT_MAX)
|
||||||
|
# define UINT_WIDTH _GL_INTEGER_WIDTH (0, UINT_MAX)
|
||||||
|
# define LONG_WIDTH _GL_INTEGER_WIDTH (LONG_MIN, LONG_MAX)
|
||||||
|
# define ULONG_WIDTH _GL_INTEGER_WIDTH (0, ULONG_MAX)
|
||||||
|
# define LLONG_WIDTH _GL_INTEGER_WIDTH (LLONG_MIN, LLONG_MAX)
|
||||||
|
# define ULLONG_WIDTH _GL_INTEGER_WIDTH (0, ULLONG_MAX)
|
||||||
|
#endif /* !ULLONG_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_LIMITS_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_LIMITS_H */
|
4
lib/math.c
Normal file
4
lib/math.c
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#include <config.h>
|
||||||
|
#define _GL_MATH_INLINE _GL_EXTERN_INLINE
|
||||||
|
#include "math.h"
|
||||||
|
typedef int dummy;
|
2417
lib/math.in.h
Normal file
2417
lib/math.in.h
Normal file
File diff suppressed because it is too large
Load diff
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-2018
|
||||||
|
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 <https://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
|
||||||
|
}
|
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-2018 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 <https://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-2018 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 <https://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 */
|
190
lib/printf-frexp.c
Normal file
190
lib/printf-frexp.c
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
/* Split a double into fraction and mantissa, for hexadecimal printf.
|
||||||
|
Copyright (C) 2007, 2009-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#if ! defined USE_LONG_DOUBLE
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#ifdef USE_LONG_DOUBLE
|
||||||
|
# include "printf-frexpl.h"
|
||||||
|
#else
|
||||||
|
# include "printf-frexp.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <float.h>
|
||||||
|
#include <math.h>
|
||||||
|
#ifdef USE_LONG_DOUBLE
|
||||||
|
# include "fpucw.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This file assumes FLT_RADIX = 2. If FLT_RADIX is a power of 2 greater
|
||||||
|
than 2, or not even a power of 2, some rounding errors can occur, so that
|
||||||
|
then the returned mantissa is only guaranteed to be <= 2.0, not < 2.0. */
|
||||||
|
|
||||||
|
#ifdef USE_LONG_DOUBLE
|
||||||
|
# define FUNC printf_frexpl
|
||||||
|
# define DOUBLE long double
|
||||||
|
# define MIN_EXP LDBL_MIN_EXP
|
||||||
|
# if HAVE_FREXPL_IN_LIBC && HAVE_LDEXPL_IN_LIBC
|
||||||
|
# define USE_FREXP_LDEXP
|
||||||
|
# define FREXP frexpl
|
||||||
|
# define LDEXP ldexpl
|
||||||
|
# endif
|
||||||
|
# define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING
|
||||||
|
# define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING ()
|
||||||
|
# define END_ROUNDING() END_LONG_DOUBLE_ROUNDING ()
|
||||||
|
# define L_(literal) literal##L
|
||||||
|
#else
|
||||||
|
# define FUNC printf_frexp
|
||||||
|
# define DOUBLE double
|
||||||
|
# define MIN_EXP DBL_MIN_EXP
|
||||||
|
# if HAVE_FREXP_IN_LIBC && HAVE_LDEXP_IN_LIBC
|
||||||
|
# define USE_FREXP_LDEXP
|
||||||
|
# define FREXP frexp
|
||||||
|
# define LDEXP ldexp
|
||||||
|
# endif
|
||||||
|
# define DECL_ROUNDING
|
||||||
|
# define BEGIN_ROUNDING()
|
||||||
|
# define END_ROUNDING()
|
||||||
|
# define L_(literal) literal
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DOUBLE
|
||||||
|
FUNC (DOUBLE x, int *expptr)
|
||||||
|
{
|
||||||
|
int exponent;
|
||||||
|
DECL_ROUNDING
|
||||||
|
|
||||||
|
BEGIN_ROUNDING ();
|
||||||
|
|
||||||
|
#ifdef USE_FREXP_LDEXP
|
||||||
|
/* frexp and ldexp are usually faster than the loop below. */
|
||||||
|
x = FREXP (x, &exponent);
|
||||||
|
|
||||||
|
x = x + x;
|
||||||
|
exponent -= 1;
|
||||||
|
|
||||||
|
if (exponent < MIN_EXP - 1)
|
||||||
|
{
|
||||||
|
x = LDEXP (x, exponent - (MIN_EXP - 1));
|
||||||
|
exponent = MIN_EXP - 1;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
/* Since the exponent is an 'int', it fits in 64 bits. Therefore the
|
||||||
|
loops are executed no more than 64 times. */
|
||||||
|
DOUBLE pow2[64]; /* pow2[i] = 2^2^i */
|
||||||
|
DOUBLE powh[64]; /* powh[i] = 2^-2^i */
|
||||||
|
int i;
|
||||||
|
|
||||||
|
exponent = 0;
|
||||||
|
if (x >= L_(1.0))
|
||||||
|
{
|
||||||
|
/* A nonnegative exponent. */
|
||||||
|
{
|
||||||
|
DOUBLE pow2_i; /* = pow2[i] */
|
||||||
|
DOUBLE powh_i; /* = powh[i] */
|
||||||
|
|
||||||
|
/* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
|
||||||
|
x * 2^exponent = argument, x >= 1.0. */
|
||||||
|
for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
|
||||||
|
;
|
||||||
|
i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
|
||||||
|
{
|
||||||
|
if (x >= pow2_i)
|
||||||
|
{
|
||||||
|
exponent += (1 << i);
|
||||||
|
x *= powh_i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
|
||||||
|
pow2[i] = pow2_i;
|
||||||
|
powh[i] = powh_i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Here 1.0 <= x < 2^2^i. */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* A negative exponent. */
|
||||||
|
{
|
||||||
|
DOUBLE pow2_i; /* = pow2[i] */
|
||||||
|
DOUBLE powh_i; /* = powh[i] */
|
||||||
|
|
||||||
|
/* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
|
||||||
|
x * 2^exponent = argument, x < 1.0, exponent >= MIN_EXP - 1. */
|
||||||
|
for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
|
||||||
|
;
|
||||||
|
i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
|
||||||
|
{
|
||||||
|
if (exponent - (1 << i) < MIN_EXP - 1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
exponent -= (1 << i);
|
||||||
|
x *= pow2_i;
|
||||||
|
if (x >= L_(1.0))
|
||||||
|
break;
|
||||||
|
|
||||||
|
pow2[i] = pow2_i;
|
||||||
|
powh[i] = powh_i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Here either x < 1.0 and exponent - 2^i < MIN_EXP - 1 <= exponent,
|
||||||
|
or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
|
||||||
|
|
||||||
|
if (x < L_(1.0))
|
||||||
|
/* Invariants: x * 2^exponent = argument, x < 1.0 and
|
||||||
|
exponent - 2^i < MIN_EXP - 1 <= exponent. */
|
||||||
|
while (i > 0)
|
||||||
|
{
|
||||||
|
i--;
|
||||||
|
if (exponent - (1 << i) >= MIN_EXP - 1)
|
||||||
|
{
|
||||||
|
exponent -= (1 << i);
|
||||||
|
x *= pow2[i];
|
||||||
|
if (x >= L_(1.0))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Here either x < 1.0 and exponent = MIN_EXP - 1,
|
||||||
|
or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Invariants: x * 2^exponent = argument, and
|
||||||
|
either x < 1.0 and exponent = MIN_EXP - 1,
|
||||||
|
or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
|
||||||
|
while (i > 0)
|
||||||
|
{
|
||||||
|
i--;
|
||||||
|
if (x >= pow2[i])
|
||||||
|
{
|
||||||
|
exponent += (1 << i);
|
||||||
|
x *= powh[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Here either x < 1.0 and exponent = MIN_EXP - 1,
|
||||||
|
or 1.0 <= x < 2.0 and exponent >= MIN_EXP - 1. */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
END_ROUNDING ();
|
||||||
|
|
||||||
|
*expptr = exponent;
|
||||||
|
return x;
|
||||||
|
}
|
23
lib/printf-frexp.h
Normal file
23
lib/printf-frexp.h
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/* Split a double into fraction and mantissa, for hexadecimal printf.
|
||||||
|
Copyright (C) 2007, 2009-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Write a finite, positive number x as
|
||||||
|
x = mantissa * 2^exp
|
||||||
|
where exp >= DBL_MIN_EXP - 1,
|
||||||
|
mantissa < 2.0,
|
||||||
|
if x is not a denormalized number then mantissa >= 1.0.
|
||||||
|
Store exp in *EXPPTR and return mantissa. */
|
||||||
|
extern double printf_frexp (double x, int *expptr);
|
37
lib/printf-frexpl.c
Normal file
37
lib/printf-frexpl.c
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
/* Split a 'long double' into fraction and mantissa, for hexadecimal printf.
|
||||||
|
Copyright (C) 2007, 2009-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
# include "printf-frexpl.h"
|
||||||
|
|
||||||
|
# include "printf-frexp.h"
|
||||||
|
|
||||||
|
long double
|
||||||
|
printf_frexpl (long double x, int *expptr)
|
||||||
|
{
|
||||||
|
return printf_frexp (x, expptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
# define USE_LONG_DOUBLE
|
||||||
|
# include "printf-frexp.c"
|
||||||
|
|
||||||
|
#endif
|
23
lib/printf-frexpl.h
Normal file
23
lib/printf-frexpl.h
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/* Split a 'long double' into fraction and mantissa, for hexadecimal printf.
|
||||||
|
Copyright (C) 2007, 2009-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Write a finite, positive number x as
|
||||||
|
x = mantissa * 2^exp
|
||||||
|
where exp >= LDBL_MIN_EXP - 1,
|
||||||
|
mantissa < 2.0,
|
||||||
|
if x is not a denormalized number then mantissa >= 1.0.
|
||||||
|
Store exp in *EXPPTR and return mantissa. */
|
||||||
|
extern long double printf_frexpl (long double x, int *expptr);
|
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-2018 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 <https://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 __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-2018 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 <https://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 */
|
64
lib/signbitd.c
Normal file
64
lib/signbitd.c
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
/* signbit() macro: Determine the sign bit of a floating-point number.
|
||||||
|
Copyright (C) 2007-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include "isnand-nolibm.h"
|
||||||
|
#include "float+.h"
|
||||||
|
|
||||||
|
#ifdef gl_signbitd_OPTIMIZED_MACRO
|
||||||
|
# undef gl_signbitd
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
gl_signbitd (double arg)
|
||||||
|
{
|
||||||
|
#if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT
|
||||||
|
/* The use of a union to extract the bits of the representation of a
|
||||||
|
'long double' is safe in practice, despite of the "aliasing rules" of
|
||||||
|
C99, because the GCC docs say
|
||||||
|
"Even with '-fstrict-aliasing', type-punning is allowed, provided the
|
||||||
|
memory is accessed through the union type."
|
||||||
|
and similarly for other compilers. */
|
||||||
|
# define NWORDS \
|
||||||
|
((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
|
||||||
|
union { double value; unsigned int word[NWORDS]; } m;
|
||||||
|
m.value = arg;
|
||||||
|
return (m.word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1;
|
||||||
|
#elif HAVE_COPYSIGN_IN_LIBC
|
||||||
|
return copysign (1.0, arg) < 0;
|
||||||
|
#else
|
||||||
|
/* This does not do the right thing for NaN, but this is irrelevant for
|
||||||
|
most use cases. */
|
||||||
|
if (isnand (arg))
|
||||||
|
return 0;
|
||||||
|
if (arg < 0.0)
|
||||||
|
return 1;
|
||||||
|
else if (arg == 0.0)
|
||||||
|
{
|
||||||
|
/* Distinguish 0.0 and -0.0. */
|
||||||
|
static double plus_zero = 0.0;
|
||||||
|
double arg_mem = arg;
|
||||||
|
return (memcmp (&plus_zero, &arg_mem, SIZEOF_DBL) != 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
64
lib/signbitf.c
Normal file
64
lib/signbitf.c
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
/* signbit() macro: Determine the sign bit of a floating-point number.
|
||||||
|
Copyright (C) 2007, 2009-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include "isnanf-nolibm.h"
|
||||||
|
#include "float+.h"
|
||||||
|
|
||||||
|
#ifdef gl_signbitf_OPTIMIZED_MACRO
|
||||||
|
# undef gl_signbitf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
gl_signbitf (float arg)
|
||||||
|
{
|
||||||
|
#if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT
|
||||||
|
/* The use of a union to extract the bits of the representation of a
|
||||||
|
'long double' is safe in practice, despite of the "aliasing rules" of
|
||||||
|
C99, because the GCC docs say
|
||||||
|
"Even with '-fstrict-aliasing', type-punning is allowed, provided the
|
||||||
|
memory is accessed through the union type."
|
||||||
|
and similarly for other compilers. */
|
||||||
|
# define NWORDS \
|
||||||
|
((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
|
||||||
|
union { float value; unsigned int word[NWORDS]; } m;
|
||||||
|
m.value = arg;
|
||||||
|
return (m.word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1;
|
||||||
|
#elif HAVE_COPYSIGNF_IN_LIBC
|
||||||
|
return copysignf (1.0f, arg) < 0;
|
||||||
|
#else
|
||||||
|
/* This does not do the right thing for NaN, but this is irrelevant for
|
||||||
|
most use cases. */
|
||||||
|
if (isnanf (arg))
|
||||||
|
return 0;
|
||||||
|
if (arg < 0.0f)
|
||||||
|
return 1;
|
||||||
|
else if (arg == 0.0f)
|
||||||
|
{
|
||||||
|
/* Distinguish 0.0f and -0.0f. */
|
||||||
|
static float plus_zero = 0.0f;
|
||||||
|
float arg_mem = arg;
|
||||||
|
return (memcmp (&plus_zero, &arg_mem, SIZEOF_FLT) != 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
64
lib/signbitl.c
Normal file
64
lib/signbitl.c
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
/* signbit() macro: Determine the sign bit of a floating-point number.
|
||||||
|
Copyright (C) 2007, 2009-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include "isnanl-nolibm.h"
|
||||||
|
#include "float+.h"
|
||||||
|
|
||||||
|
#ifdef gl_signbitl_OPTIMIZED_MACRO
|
||||||
|
# undef gl_signbitl
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
gl_signbitl (long double arg)
|
||||||
|
{
|
||||||
|
#if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT
|
||||||
|
/* The use of a union to extract the bits of the representation of a
|
||||||
|
'long double' is safe in practice, despite of the "aliasing rules" of
|
||||||
|
C99, because the GCC docs say
|
||||||
|
"Even with '-fstrict-aliasing', type-punning is allowed, provided the
|
||||||
|
memory is accessed through the union type."
|
||||||
|
and similarly for other compilers. */
|
||||||
|
# define NWORDS \
|
||||||
|
((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
|
||||||
|
union { long double value; unsigned int word[NWORDS]; } m;
|
||||||
|
m.value = arg;
|
||||||
|
return (m.word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1;
|
||||||
|
#elif HAVE_COPYSIGNL_IN_LIBC
|
||||||
|
return copysignl (1.0L, arg) < 0;
|
||||||
|
#else
|
||||||
|
/* This does not do the right thing for NaN, but this is irrelevant for
|
||||||
|
most use cases. */
|
||||||
|
if (isnanl (arg))
|
||||||
|
return 0;
|
||||||
|
if (arg < 0.0L)
|
||||||
|
return 1;
|
||||||
|
else if (arg == 0.0L)
|
||||||
|
{
|
||||||
|
/* Distinguish 0.0L and -0.0L. */
|
||||||
|
static long double plus_zero = 0.0L;
|
||||||
|
long double arg_mem = arg;
|
||||||
|
return (memcmp (&plus_zero, &arg_mem, SIZEOF_LDBL) != 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
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-2018 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 <https://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 */
|
114
lib/stddef.in.h
Normal file
114
lib/stddef.in.h
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
/* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
|
||||||
|
|
||||||
|
Copyright (C) 2009-2018 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 <https://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
|
||||||
|
# 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@
|
||||||
|
|
||||||
|
/* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */
|
||||||
|
# if (@REPLACE_NULL@ \
|
||||||
|
&& (!defined _@GUARD_PREFIX@_STDDEF_H || defined _GL_STDDEF_WINT_T))
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# ifndef _@GUARD_PREFIX@_STDDEF_H
|
||||||
|
# define _@GUARD_PREFIX@_STDDEF_H
|
||||||
|
|
||||||
|
/* Some platforms lack wchar_t. */
|
||||||
|
#if !@HAVE_WCHAR_T@
|
||||||
|
# define wchar_t int
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Some platforms lack max_align_t. The check for _GCC_MAX_ALIGN_T is
|
||||||
|
a hack in case the configure-time test was done with g++ even though
|
||||||
|
we are currently compiling with gcc. */
|
||||||
|
#if ! (@HAVE_MAX_ALIGN_T@ || defined _GCC_MAX_ALIGN_T)
|
||||||
|
# if !GNULIB_defined_max_align_t
|
||||||
|
/* On the x86, the maximum storage alignment of double, long, etc. is 4,
|
||||||
|
but GCC's C11 ABI for x86 says that max_align_t has an alignment of 8,
|
||||||
|
and the C11 standard allows this. Work around this problem by
|
||||||
|
using __alignof__ (which returns 8 for double) rather than _Alignof
|
||||||
|
(which returns 4), and align each union member accordingly. */
|
||||||
|
# ifdef __GNUC__
|
||||||
|
# define _GL_STDDEF_ALIGNAS(type) \
|
||||||
|
__attribute__ ((__aligned__ (__alignof__ (type))))
|
||||||
|
# else
|
||||||
|
# define _GL_STDDEF_ALIGNAS(type) /* */
|
||||||
|
# endif
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
char *__p _GL_STDDEF_ALIGNAS (char *);
|
||||||
|
double __d _GL_STDDEF_ALIGNAS (double);
|
||||||
|
long double __ld _GL_STDDEF_ALIGNAS (long double);
|
||||||
|
long int __i _GL_STDDEF_ALIGNAS (long int);
|
||||||
|
} rpl_max_align_t;
|
||||||
|
# define max_align_t rpl_max_align_t
|
||||||
|
# define GNULIB_defined_max_align_t 1
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# endif /* _@GUARD_PREFIX@_STDDEF_H */
|
||||||
|
# endif /* _@GUARD_PREFIX@_STDDEF_H */
|
||||||
|
#endif /* __need_XXX */
|
726
lib/stdint.in.h
Normal file
726
lib/stdint.in.h
Normal file
|
@ -0,0 +1,726 @@
|
||||||
|
/* Copyright (C) 2001-2002, 2004-2018 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 <https://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 _GL_INCLUDING_SYS_TYPES_H
|
||||||
|
# @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
|
||||||
|
|
||||||
|
/* Get SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, INT_MIN, INT_MAX,
|
||||||
|
LONG_MIN, LONG_MAX, ULONG_MAX, _GL_INTEGER_WIDTH. */
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
/* Override WINT_MIN and WINT_MAX if gnulib's <wchar.h> or <wctype.h> overrides
|
||||||
|
wint_t. */
|
||||||
|
#if @GNULIB_OVERRIDES_WINT_T@
|
||||||
|
# undef WINT_MIN
|
||||||
|
# undef WINT_MAX
|
||||||
|
# define WINT_MIN 0x0U
|
||||||
|
# define WINT_MAX 0xffffffffU
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ! @HAVE_C99_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
|
||||||
|
|
||||||
|
# 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. */
|
||||||
|
|
||||||
|
/* These are separate macros, because if you try to merge these macros into
|
||||||
|
a single one, HP-UX cc rejects the resulting expression in constant
|
||||||
|
expressions. */
|
||||||
|
# define _STDINT_UNSIGNED_MIN(bits, zero) \
|
||||||
|
(zero)
|
||||||
|
# define _STDINT_SIGNED_MIN(bits, zero) \
|
||||||
|
(~ _STDINT_MAX (1, bits, zero))
|
||||||
|
|
||||||
|
# define _STDINT_MAX(signed, bits, zero) \
|
||||||
|
(((((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 */
|
||||||
|
|
||||||
|
/* kLIBC's stdint.h defines _INTPTR_T_DECLARED and needs its own
|
||||||
|
definitions of intptr_t and uintptr_t (which use int and unsigned)
|
||||||
|
to avoid clashes with declarations of system functions like sbrk. */
|
||||||
|
# ifndef _INTPTR_T_DECLARED
|
||||||
|
# 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
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* 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_SIGNED_MIN (64, 0l)
|
||||||
|
# define PTRDIFF_MAX _STDINT_MAX (1, 64, 0l)
|
||||||
|
# else
|
||||||
|
# define PTRDIFF_MIN _STDINT_SIGNED_MIN (32, 0)
|
||||||
|
# define PTRDIFF_MAX _STDINT_MAX (1, 32, 0)
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# define PTRDIFF_MIN \
|
||||||
|
_STDINT_SIGNED_MIN (@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
|
||||||
|
# if @HAVE_SIGNED_SIG_ATOMIC_T@
|
||||||
|
# define SIG_ATOMIC_MIN \
|
||||||
|
_STDINT_SIGNED_MIN (@BITSIZEOF_SIG_ATOMIC_T@, 0@SIG_ATOMIC_T_SUFFIX@)
|
||||||
|
# else
|
||||||
|
# define SIG_ATOMIC_MIN \
|
||||||
|
_STDINT_UNSIGNED_MIN (@BITSIZEOF_SIG_ATOMIC_T@, 0@SIG_ATOMIC_T_SUFFIX@)
|
||||||
|
# endif
|
||||||
|
# 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
|
||||||
|
# if @HAVE_SIGNED_WCHAR_T@
|
||||||
|
# define WCHAR_MIN \
|
||||||
|
_STDINT_SIGNED_MIN (@BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
|
||||||
|
# else
|
||||||
|
# define WCHAR_MIN \
|
||||||
|
_STDINT_UNSIGNED_MIN (@BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
|
||||||
|
# endif
|
||||||
|
# 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
|
||||||
|
# if @HAVE_SIGNED_WINT_T@
|
||||||
|
# define WINT_MIN \
|
||||||
|
_STDINT_SIGNED_MIN (@BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
|
||||||
|
# else
|
||||||
|
# define WINT_MIN \
|
||||||
|
_STDINT_UNSIGNED_MIN (@BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
|
||||||
|
# endif
|
||||||
|
# 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 /* !@HAVE_C99_STDINT_H@ */
|
||||||
|
|
||||||
|
/* Macros specified by ISO/IEC TS 18661-1:2014. */
|
||||||
|
|
||||||
|
#if (!defined UINTMAX_WIDTH \
|
||||||
|
&& (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__))
|
||||||
|
# ifdef INT8_MAX
|
||||||
|
# define INT8_WIDTH _GL_INTEGER_WIDTH (INT8_MIN, INT8_MAX)
|
||||||
|
# endif
|
||||||
|
# ifdef UINT8_MAX
|
||||||
|
# define UINT8_WIDTH _GL_INTEGER_WIDTH (0, UINT8_MAX)
|
||||||
|
# endif
|
||||||
|
# ifdef INT16_MAX
|
||||||
|
# define INT16_WIDTH _GL_INTEGER_WIDTH (INT16_MIN, INT16_MAX)
|
||||||
|
# endif
|
||||||
|
# ifdef UINT16_MAX
|
||||||
|
# define UINT16_WIDTH _GL_INTEGER_WIDTH (0, UINT16_MAX)
|
||||||
|
# endif
|
||||||
|
# ifdef INT32_MAX
|
||||||
|
# define INT32_WIDTH _GL_INTEGER_WIDTH (INT32_MIN, INT32_MAX)
|
||||||
|
# endif
|
||||||
|
# ifdef UINT32_MAX
|
||||||
|
# define UINT32_WIDTH _GL_INTEGER_WIDTH (0, UINT32_MAX)
|
||||||
|
# endif
|
||||||
|
# ifdef INT64_MAX
|
||||||
|
# define INT64_WIDTH _GL_INTEGER_WIDTH (INT64_MIN, INT64_MAX)
|
||||||
|
# endif
|
||||||
|
# ifdef UINT64_MAX
|
||||||
|
# define UINT64_WIDTH _GL_INTEGER_WIDTH (0, UINT64_MAX)
|
||||||
|
# endif
|
||||||
|
# define INT_LEAST8_WIDTH _GL_INTEGER_WIDTH (INT_LEAST8_MIN, INT_LEAST8_MAX)
|
||||||
|
# define UINT_LEAST8_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST8_MAX)
|
||||||
|
# define INT_LEAST16_WIDTH _GL_INTEGER_WIDTH (INT_LEAST16_MIN, INT_LEAST16_MAX)
|
||||||
|
# define UINT_LEAST16_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST16_MAX)
|
||||||
|
# define INT_LEAST32_WIDTH _GL_INTEGER_WIDTH (INT_LEAST32_MIN, INT_LEAST32_MAX)
|
||||||
|
# define UINT_LEAST32_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST32_MAX)
|
||||||
|
# define INT_LEAST64_WIDTH _GL_INTEGER_WIDTH (INT_LEAST64_MIN, INT_LEAST64_MAX)
|
||||||
|
# define UINT_LEAST64_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST64_MAX)
|
||||||
|
# define INT_FAST8_WIDTH _GL_INTEGER_WIDTH (INT_FAST8_MIN, INT_FAST8_MAX)
|
||||||
|
# define UINT_FAST8_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST8_MAX)
|
||||||
|
# define INT_FAST16_WIDTH _GL_INTEGER_WIDTH (INT_FAST16_MIN, INT_FAST16_MAX)
|
||||||
|
# define UINT_FAST16_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST16_MAX)
|
||||||
|
# define INT_FAST32_WIDTH _GL_INTEGER_WIDTH (INT_FAST32_MIN, INT_FAST32_MAX)
|
||||||
|
# define UINT_FAST32_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST32_MAX)
|
||||||
|
# define INT_FAST64_WIDTH _GL_INTEGER_WIDTH (INT_FAST64_MIN, INT_FAST64_MAX)
|
||||||
|
# define UINT_FAST64_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST64_MAX)
|
||||||
|
# define INTPTR_WIDTH _GL_INTEGER_WIDTH (INTPTR_MIN, INTPTR_MAX)
|
||||||
|
# define UINTPTR_WIDTH _GL_INTEGER_WIDTH (0, UINTPTR_MAX)
|
||||||
|
# define INTMAX_WIDTH _GL_INTEGER_WIDTH (INTMAX_MIN, INTMAX_MAX)
|
||||||
|
# define UINTMAX_WIDTH _GL_INTEGER_WIDTH (0, UINTMAX_MAX)
|
||||||
|
# define PTRDIFF_WIDTH _GL_INTEGER_WIDTH (PTRDIFF_MIN, PTRDIFF_MAX)
|
||||||
|
# define SIZE_WIDTH _GL_INTEGER_WIDTH (0, SIZE_MAX)
|
||||||
|
# define WCHAR_WIDTH _GL_INTEGER_WIDTH (WCHAR_MIN, WCHAR_MAX)
|
||||||
|
# ifdef WINT_MAX
|
||||||
|
# define WINT_WIDTH _GL_INTEGER_WIDTH (WINT_MIN, WINT_MAX)
|
||||||
|
# endif
|
||||||
|
# ifdef SIG_ATOMIC_MAX
|
||||||
|
# define SIG_ATOMIC_WIDTH _GL_INTEGER_WIDTH (SIG_ATOMIC_MIN, SIG_ATOMIC_MAX)
|
||||||
|
# endif
|
||||||
|
#endif /* !WINT_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_STDINT_H */
|
||||||
|
#endif /* !(defined __ANDROID__ && ...) */
|
||||||
|
#endif /* !defined _@GUARD_PREFIX@_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */
|
202
lib/stdio-impl.h
Normal file
202
lib/stdio-impl.h
Normal file
|
@ -0,0 +1,202 @@
|
||||||
|
/* Implementation details of FILE streams.
|
||||||
|
Copyright (C) 2007-2008, 2010-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Many stdio implementations have the same logic and therefore can share
|
||||||
|
the same implementation of stdio extension API, except that some fields
|
||||||
|
have different naming conventions, or their access requires some casts. */
|
||||||
|
|
||||||
|
/* Glibc 2.28 made _IO_IN_BACKUP private. For now, work around this
|
||||||
|
problem by defining it ourselves. FIXME: Do not rely on glibc
|
||||||
|
internals. */
|
||||||
|
#if !defined _IO_IN_BACKUP && defined _IO_EOF_SEEN
|
||||||
|
# define _IO_IN_BACKUP 0x100
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* BSD stdio derived implementations. */
|
||||||
|
|
||||||
|
#if defined __NetBSD__ /* NetBSD */
|
||||||
|
/* Get __NetBSD_Version__. */
|
||||||
|
# include <sys/param.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h> /* For detecting Plan9. */
|
||||||
|
|
||||||
|
#if defined __sferror || defined __DragonFly__ || defined __ANDROID__
|
||||||
|
/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
|
||||||
|
|
||||||
|
# if defined __DragonFly__ /* DragonFly */
|
||||||
|
/* See <https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/lib/libc/stdio/priv_stdio.h>. */
|
||||||
|
# define fp_ ((struct { struct __FILE_public pub; \
|
||||||
|
struct { unsigned char *_base; int _size; } _bf; \
|
||||||
|
void *cookie; \
|
||||||
|
void *_close; \
|
||||||
|
void *_read; \
|
||||||
|
void *_seek; \
|
||||||
|
void *_write; \
|
||||||
|
struct { unsigned char *_base; int _size; } _ub; \
|
||||||
|
int _ur; \
|
||||||
|
unsigned char _ubuf[3]; \
|
||||||
|
unsigned char _nbuf[1]; \
|
||||||
|
struct { unsigned char *_base; int _size; } _lb; \
|
||||||
|
int _blksize; \
|
||||||
|
fpos_t _offset; \
|
||||||
|
/* More fields, not relevant here. */ \
|
||||||
|
} *) fp)
|
||||||
|
/* See <https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/include/stdio.h>. */
|
||||||
|
# define _p pub._p
|
||||||
|
# define _flags pub._flags
|
||||||
|
# define _r pub._r
|
||||||
|
# define _w pub._w
|
||||||
|
# elif defined __ANDROID__ /* Android */
|
||||||
|
/* Up to this commit from 2015-10-12
|
||||||
|
<https://android.googlesource.com/platform/bionic.git/+/f0141dfab10a4b332769d52fa76631a64741297a>
|
||||||
|
the innards of FILE were public, and fp_ub could be defined like for OpenBSD,
|
||||||
|
see <https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/fileext.h>
|
||||||
|
and <https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/local.h>.
|
||||||
|
After this commit, the innards of FILE are hidden. */
|
||||||
|
# define fp_ ((struct { unsigned char *_p; \
|
||||||
|
int _r; \
|
||||||
|
int _w; \
|
||||||
|
int _flags; \
|
||||||
|
int _file; \
|
||||||
|
struct { unsigned char *_base; size_t _size; } _bf; \
|
||||||
|
int _lbfsize; \
|
||||||
|
void *_cookie; \
|
||||||
|
void *_close; \
|
||||||
|
void *_read; \
|
||||||
|
void *_seek; \
|
||||||
|
void *_write; \
|
||||||
|
struct { unsigned char *_base; size_t _size; } _ext; \
|
||||||
|
unsigned char *_up; \
|
||||||
|
int _ur; \
|
||||||
|
unsigned char _ubuf[3]; \
|
||||||
|
unsigned char _nbuf[1]; \
|
||||||
|
struct { unsigned char *_base; size_t _size; } _lb; \
|
||||||
|
int _blksize; \
|
||||||
|
fpos_t _offset; \
|
||||||
|
/* More fields, not relevant here. */ \
|
||||||
|
} *) fp)
|
||||||
|
# else
|
||||||
|
# define fp_ fp
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __OpenBSD__ || defined __minix /* NetBSD >= 1.5ZA, OpenBSD, Minix 3 */
|
||||||
|
/* See <http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
|
||||||
|
and <https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
|
||||||
|
and <https://github.com/Stichting-MINIX-Research-Foundation/minix/blob/master/lib/libc/stdio/fileext.h> */
|
||||||
|
struct __sfileext
|
||||||
|
{
|
||||||
|
struct __sbuf _ub; /* ungetc buffer */
|
||||||
|
/* More fields, not relevant here. */
|
||||||
|
};
|
||||||
|
# define fp_ub ((struct __sfileext *) fp->_ext._base)->_ub
|
||||||
|
# elif defined __ANDROID__ /* Android */
|
||||||
|
struct __sfileext
|
||||||
|
{
|
||||||
|
struct { unsigned char *_base; size_t _size; } _ub; /* ungetc buffer */
|
||||||
|
/* More fields, not relevant here. */
|
||||||
|
};
|
||||||
|
# define fp_ub ((struct __sfileext *) fp_->_ext._base)->_ub
|
||||||
|
# else /* FreeBSD, NetBSD <= 1.5Z, DragonFly, Mac OS X, Cygwin */
|
||||||
|
# define fp_ub fp_->_ub
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# define HASUB(fp) (fp_ub._base != NULL)
|
||||||
|
|
||||||
|
# if defined __ANDROID__ /* Android */
|
||||||
|
/* Needed after this commit from 2016-01-25
|
||||||
|
<https://android.googlesource.com/platform/bionic.git/+/e70e0e9267d069bf56a5078c99307e08a7280de7> */
|
||||||
|
# ifndef __SEOF
|
||||||
|
# define __SLBF 1
|
||||||
|
# define __SNBF 2
|
||||||
|
# define __SRD 4
|
||||||
|
# define __SWR 8
|
||||||
|
# define __SRW 0x10
|
||||||
|
# define __SEOF 0x20
|
||||||
|
# define __SERR 0x40
|
||||||
|
# endif
|
||||||
|
# ifndef __SOFF
|
||||||
|
# define __SOFF 0x1000
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* SystemV derived implementations. */
|
||||||
|
|
||||||
|
#ifdef __TANDEM /* NonStop Kernel */
|
||||||
|
# ifndef _IOERR
|
||||||
|
/* These values were determined by the program 'stdioext-flags' at
|
||||||
|
<https://lists.gnu.org/r/bug-gnulib/2010-12/msg00165.html>. */
|
||||||
|
# define _IOERR 0x40
|
||||||
|
# define _IOREAD 0x80
|
||||||
|
# define _IOWRT 0x4
|
||||||
|
# define _IORW 0x100
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined _IOERR
|
||||||
|
|
||||||
|
# if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */
|
||||||
|
# define fp_ ((struct { unsigned char *_ptr; \
|
||||||
|
unsigned char *_base; \
|
||||||
|
unsigned char *_end; \
|
||||||
|
long _cnt; \
|
||||||
|
int _file; \
|
||||||
|
unsigned int _flag; \
|
||||||
|
} *) fp)
|
||||||
|
# elif defined __VMS /* OpenVMS */
|
||||||
|
# define fp_ ((struct _iobuf *) fp)
|
||||||
|
# else
|
||||||
|
# define fp_ fp
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if defined _SCO_DS /* OpenServer */
|
||||||
|
# define _cnt __cnt
|
||||||
|
# define _ptr __ptr
|
||||||
|
# define _base __base
|
||||||
|
# define _flag __flag
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined _WIN32 && ! defined __CYGWIN__ /* newer Windows with MSVC */
|
||||||
|
|
||||||
|
/* <stdio.h> does not define the innards of FILE any more. */
|
||||||
|
# define WINDOWS_OPAQUE_FILE
|
||||||
|
|
||||||
|
struct _gl_real_FILE
|
||||||
|
{
|
||||||
|
/* Note: Compared to older Windows and to mingw, it has the fields
|
||||||
|
_base and _cnt swapped. */
|
||||||
|
unsigned char *_ptr;
|
||||||
|
unsigned char *_base;
|
||||||
|
int _cnt;
|
||||||
|
int _flag;
|
||||||
|
int _file;
|
||||||
|
int _charbuf;
|
||||||
|
int _bufsiz;
|
||||||
|
};
|
||||||
|
# define fp_ ((struct _gl_real_FILE *) fp)
|
||||||
|
|
||||||
|
/* These values were determined by a program similar to the one at
|
||||||
|
<https://lists.gnu.org/r/bug-gnulib/2010-12/msg00165.html>. */
|
||||||
|
# define _IOREAD 0x1
|
||||||
|
# define _IOWRT 0x2
|
||||||
|
# define _IORW 0x4
|
||||||
|
# define _IOEOF 0x8
|
||||||
|
# define _IOERR 0x10
|
||||||
|
|
||||||
|
#endif
|
1377
lib/stdio.in.h
Normal file
1377
lib/stdio.in.h
Normal file
File diff suppressed because it is too large
Load diff
1063
lib/string.in.h
Normal file
1063
lib/string.in.h
Normal file
File diff suppressed because it is too large
Load diff
123
lib/sys_resource.in.h
Normal file
123
lib/sys_resource.in.h
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
/* Substitute for <sys/resource.h>.
|
||||||
|
Copyright (C) 2012-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
# if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
# endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_SYS_RESOURCE_H
|
||||||
|
|
||||||
|
#if @HAVE_SYS_RESOURCE_H@
|
||||||
|
|
||||||
|
/* On FreeBSD 5.0, <sys/resource.h> assumes prior inclusion of <sys/types.h>
|
||||||
|
and <sys/time.h>. */
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <sys/time.h>
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
# @INCLUDE_NEXT@ @NEXT_SYS_RESOURCE_H@
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_SYS_RESOURCE_H
|
||||||
|
#define _@GUARD_PREFIX@_SYS_RESOURCE_H
|
||||||
|
|
||||||
|
#if !@HAVE_SYS_RESOURCE_H@
|
||||||
|
/* A platform that lacks <sys/resource.h>. */
|
||||||
|
|
||||||
|
/* Get 'struct timeval'. */
|
||||||
|
# include <sys/time.h>
|
||||||
|
|
||||||
|
/* Define the RUSAGE_* constants. */
|
||||||
|
# define RUSAGE_SELF 0
|
||||||
|
# define RUSAGE_CHILDREN -1
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if !GNULIB_defined_struct_rusage
|
||||||
|
/* All known platforms that lack <sys/resource.h> also lack any declaration
|
||||||
|
of struct rusage in any other header. */
|
||||||
|
struct rusage
|
||||||
|
{
|
||||||
|
struct timeval ru_utime; /* CPU time used in user mode */
|
||||||
|
struct timeval ru_stime; /* CPU time used in system mode (kernel) */
|
||||||
|
long ru_maxrss;
|
||||||
|
long ru_ixrss;
|
||||||
|
long ru_idrss;
|
||||||
|
long ru_isrss;
|
||||||
|
long ru_minflt;
|
||||||
|
long ru_majflt;
|
||||||
|
long ru_nswap;
|
||||||
|
long ru_inblock;
|
||||||
|
long ru_oublock;
|
||||||
|
long ru_msgsnd;
|
||||||
|
long ru_msgrcv;
|
||||||
|
long ru_nsignals;
|
||||||
|
long ru_nvcsw;
|
||||||
|
long ru_nivcsw;
|
||||||
|
};
|
||||||
|
# define GNULIB_defined_struct_rusage 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
# ifdef __VMS /* OpenVMS */
|
||||||
|
/* Define the RUSAGE_* constants. */
|
||||||
|
# ifndef RUSAGE_SELF
|
||||||
|
# define RUSAGE_SELF 0
|
||||||
|
# endif
|
||||||
|
# ifndef RUSAGE_CHILDREN
|
||||||
|
# define RUSAGE_CHILDREN -1
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#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. */
|
||||||
|
|
||||||
|
|
||||||
|
/* Declare overridden functions. */
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_GETRUSAGE@
|
||||||
|
# if !@HAVE_GETRUSAGE@
|
||||||
|
_GL_FUNCDECL_SYS (getrusage, int, (int who, struct rusage *usage_p)
|
||||||
|
_GL_ARG_NONNULL ((2)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (getrusage, int, (int who, struct rusage *usage_p));
|
||||||
|
_GL_CXXALIASWARN (getrusage);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef getrusage
|
||||||
|
# if HAVE_RAW_DECL_GETRUSAGE
|
||||||
|
_GL_WARN_ON_USE (getrusage, "getrusage is unportable - "
|
||||||
|
"use gnulib module getrusage for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_SYS_RESOURCE_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_SYS_RESOURCE_H */
|
220
lib/sys_time.in.h
Normal file
220
lib/sys_time.in.h
Normal file
|
@ -0,0 +1,220 @@
|
||||||
|
/* Provide a more complete sys/time.h.
|
||||||
|
|
||||||
|
Copyright (C) 2007-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Paul Eggert. */
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_SYS_TIME_H
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
/* On Cygwin and on many BSDish systems, <sys/time.h> includes itself
|
||||||
|
recursively via <sys/select.h>.
|
||||||
|
Simply delegate to the system's header in this case; it is a no-op.
|
||||||
|
Without this extra ifdef, the C++ gettimeofday declaration below
|
||||||
|
would be a forward declaration in gnulib's nested <sys/time.h>. */
|
||||||
|
#if defined _CYGWIN_SYS_TIME_H || defined _SYS_TIME_H || defined _SYS_TIME_H_
|
||||||
|
# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
#if @HAVE_SYS_TIME_H@
|
||||||
|
# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_SYS_TIME_H
|
||||||
|
#define _@GUARD_PREFIX@_SYS_TIME_H
|
||||||
|
|
||||||
|
#if ! @HAVE_SYS_TIME_H@
|
||||||
|
# include <time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* On native Windows with MSVC, get the 'struct timeval' type.
|
||||||
|
Also, on native Windows with a 64-bit time_t, where we are overriding the
|
||||||
|
'struct timeval' type, get all declarations of system functions whose
|
||||||
|
signature contains 'struct timeval'. */
|
||||||
|
#if (defined _MSC_VER || @REPLACE_STRUCT_TIMEVAL@) && @HAVE_WINSOCK2_H@ && !defined _GL_INCLUDING_WINSOCK2_H
|
||||||
|
# define _GL_INCLUDING_WINSOCK2_H
|
||||||
|
# include <winsock2.h>
|
||||||
|
# undef _GL_INCLUDING_WINSOCK2_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
|
||||||
|
|
||||||
|
#if !@HAVE_STRUCT_TIMEVAL@ || @REPLACE_STRUCT_TIMEVAL@
|
||||||
|
|
||||||
|
# if @REPLACE_STRUCT_TIMEVAL@
|
||||||
|
# define timeval rpl_timeval
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if !GNULIB_defined_struct_timeval
|
||||||
|
struct timeval
|
||||||
|
{
|
||||||
|
time_t tv_sec;
|
||||||
|
long int tv_usec;
|
||||||
|
};
|
||||||
|
# define GNULIB_defined_struct_timeval 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_GETTIMEOFDAY@
|
||||||
|
# if @REPLACE_GETTIMEOFDAY@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef gettimeofday
|
||||||
|
# define gettimeofday rpl_gettimeofday
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (gettimeofday, int,
|
||||||
|
(struct timeval *restrict, void *restrict)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
_GL_CXXALIAS_RPL (gettimeofday, int,
|
||||||
|
(struct timeval *restrict, void *restrict));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_GETTIMEOFDAY@
|
||||||
|
_GL_FUNCDECL_SYS (gettimeofday, int,
|
||||||
|
(struct timeval *restrict, void *restrict)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
/* Need to cast, because on glibc systems, by default, the second argument is
|
||||||
|
struct timezone *. */
|
||||||
|
_GL_CXXALIAS_SYS_CAST (gettimeofday, int,
|
||||||
|
(struct timeval *restrict, void *restrict));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (gettimeofday);
|
||||||
|
# if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||||
|
namespace GNULIB_NAMESPACE {
|
||||||
|
typedef ::timeval
|
||||||
|
#undef timeval
|
||||||
|
timeval;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef gettimeofday
|
||||||
|
# if HAVE_RAW_DECL_GETTIMEOFDAY
|
||||||
|
_GL_WARN_ON_USE (gettimeofday, "gettimeofday is unportable - "
|
||||||
|
"use gnulib module gettimeofday for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Hide some function declarations from <winsock2.h>. */
|
||||||
|
|
||||||
|
#if defined _MSC_VER && @HAVE_WINSOCK2_H@
|
||||||
|
# if !defined _@GUARD_PREFIX@_UNISTD_H
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef close
|
||||||
|
# define close close_used_without_including_unistd_h
|
||||||
|
# else
|
||||||
|
_GL_WARN_ON_USE (close,
|
||||||
|
"close() used without including <unistd.h>");
|
||||||
|
# endif
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef gethostname
|
||||||
|
# define gethostname gethostname_used_without_including_unistd_h
|
||||||
|
# else
|
||||||
|
_GL_WARN_ON_USE (gethostname,
|
||||||
|
"gethostname() used without including <unistd.h>");
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef socket
|
||||||
|
# define socket socket_used_without_including_sys_socket_h
|
||||||
|
# undef connect
|
||||||
|
# define connect connect_used_without_including_sys_socket_h
|
||||||
|
# undef accept
|
||||||
|
# define accept accept_used_without_including_sys_socket_h
|
||||||
|
# undef bind
|
||||||
|
# define bind bind_used_without_including_sys_socket_h
|
||||||
|
# undef getpeername
|
||||||
|
# define getpeername getpeername_used_without_including_sys_socket_h
|
||||||
|
# undef getsockname
|
||||||
|
# define getsockname getsockname_used_without_including_sys_socket_h
|
||||||
|
# undef getsockopt
|
||||||
|
# define getsockopt getsockopt_used_without_including_sys_socket_h
|
||||||
|
# undef listen
|
||||||
|
# define listen listen_used_without_including_sys_socket_h
|
||||||
|
# undef recv
|
||||||
|
# define recv recv_used_without_including_sys_socket_h
|
||||||
|
# undef send
|
||||||
|
# define send send_used_without_including_sys_socket_h
|
||||||
|
# undef recvfrom
|
||||||
|
# define recvfrom recvfrom_used_without_including_sys_socket_h
|
||||||
|
# undef sendto
|
||||||
|
# define sendto sendto_used_without_including_sys_socket_h
|
||||||
|
# undef setsockopt
|
||||||
|
# define setsockopt setsockopt_used_without_including_sys_socket_h
|
||||||
|
# undef shutdown
|
||||||
|
# define shutdown shutdown_used_without_including_sys_socket_h
|
||||||
|
# else
|
||||||
|
_GL_WARN_ON_USE (socket,
|
||||||
|
"socket() used without including <sys/socket.h>");
|
||||||
|
_GL_WARN_ON_USE (connect,
|
||||||
|
"connect() used without including <sys/socket.h>");
|
||||||
|
_GL_WARN_ON_USE (accept,
|
||||||
|
"accept() used without including <sys/socket.h>");
|
||||||
|
_GL_WARN_ON_USE (bind,
|
||||||
|
"bind() used without including <sys/socket.h>");
|
||||||
|
_GL_WARN_ON_USE (getpeername,
|
||||||
|
"getpeername() used without including <sys/socket.h>");
|
||||||
|
_GL_WARN_ON_USE (getsockname,
|
||||||
|
"getsockname() used without including <sys/socket.h>");
|
||||||
|
_GL_WARN_ON_USE (getsockopt,
|
||||||
|
"getsockopt() used without including <sys/socket.h>");
|
||||||
|
_GL_WARN_ON_USE (listen,
|
||||||
|
"listen() used without including <sys/socket.h>");
|
||||||
|
_GL_WARN_ON_USE (recv,
|
||||||
|
"recv() used without including <sys/socket.h>");
|
||||||
|
_GL_WARN_ON_USE (send,
|
||||||
|
"send() used without including <sys/socket.h>");
|
||||||
|
_GL_WARN_ON_USE (recvfrom,
|
||||||
|
"recvfrom() used without including <sys/socket.h>");
|
||||||
|
_GL_WARN_ON_USE (sendto,
|
||||||
|
"sendto() used without including <sys/socket.h>");
|
||||||
|
_GL_WARN_ON_USE (setsockopt,
|
||||||
|
"setsockopt() used without including <sys/socket.h>");
|
||||||
|
_GL_WARN_ON_USE (shutdown,
|
||||||
|
"shutdown() used without including <sys/socket.h>");
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if !defined _@GUARD_PREFIX@_SYS_SELECT_H
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef select
|
||||||
|
# define select select_used_without_including_sys_select_h
|
||||||
|
# else
|
||||||
|
_GL_WARN_ON_USE (select,
|
||||||
|
"select() used without including <sys/select.h>");
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_SYS_TIME_H */
|
||||||
|
#endif /* _CYGWIN_SYS_TIME_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_SYS_TIME_H */
|
106
lib/sys_types.in.h
Normal file
106
lib/sys_types.in.h
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
/* Provide a more complete sys/types.h.
|
||||||
|
|
||||||
|
Copyright (C) 2011-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
#if defined _WIN32 && !defined __CYGWIN__ \
|
||||||
|
&& (defined __need_off_t || defined __need___off64_t \
|
||||||
|
|| defined __need_ssize_t || defined __need_time_t)
|
||||||
|
|
||||||
|
/* Special invocation convention inside mingw header files. */
|
||||||
|
|
||||||
|
#@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* Normal invocation convention. */
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
# define _GL_INCLUDING_SYS_TYPES_H
|
||||||
|
#@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@
|
||||||
|
# undef _GL_INCLUDING_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
|
||||||
|
|
||||||
|
/* Override dev_t and ino_t if distinguishable inodes support is requested
|
||||||
|
on native Windows. */
|
||||||
|
#if @WINDOWS_STAT_INODES@
|
||||||
|
|
||||||
|
# if @WINDOWS_STAT_INODES@ == 2
|
||||||
|
/* Experimental, not useful in Windows 10. */
|
||||||
|
|
||||||
|
/* Define dev_t to a 64-bit type. */
|
||||||
|
# if !defined GNULIB_defined_dev_t
|
||||||
|
typedef unsigned long long int rpl_dev_t;
|
||||||
|
# undef dev_t
|
||||||
|
# define dev_t rpl_dev_t
|
||||||
|
# define GNULIB_defined_dev_t 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Define ino_t to a 128-bit type. */
|
||||||
|
# if !defined GNULIB_defined_ino_t
|
||||||
|
/* MSVC does not have a 128-bit integer type.
|
||||||
|
GCC has a 128-bit integer type __int128, but only on 64-bit targets. */
|
||||||
|
typedef struct { unsigned long long int _gl_ino[2]; } rpl_ino_t;
|
||||||
|
# undef ino_t
|
||||||
|
# define ino_t rpl_ino_t
|
||||||
|
# define GNULIB_defined_ino_t 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# else /* @WINDOWS_STAT_INODES@ == 1 */
|
||||||
|
|
||||||
|
/* Define ino_t to a 64-bit type. */
|
||||||
|
# if !defined GNULIB_defined_ino_t
|
||||||
|
typedef unsigned long long int rpl_ino_t;
|
||||||
|
# undef ino_t
|
||||||
|
# define ino_t rpl_ino_t
|
||||||
|
# define GNULIB_defined_ino_t 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Indicator, for gnulib internal purposes. */
|
||||||
|
# define _GL_WINDOWS_STAT_INODES @WINDOWS_STAT_INODES@
|
||||||
|
|
||||||
|
#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 __CYGWIN__) && ! defined __GLIBC__
|
||||||
|
# include <stddef.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
|
||||||
|
#endif /* __need_XXX */
|
5619
lib/vasnprintf.c
Normal file
5619
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-2018 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 <https://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 */
|
284
lib/verify.h
Normal file
284
lib/verify.h
Normal file
|
@ -0,0 +1,284 @@
|
||||||
|
/* Compile-time assert-like macros.
|
||||||
|
|
||||||
|
Copyright (C) 2005-2006, 2009-2018 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 <https://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__ + (6 <= __GNUC_MINOR__) \
|
||||||
|
&& (201112L <= __STDC_VERSION__ || !defined __STRICT_ANSI__) \
|
||||||
|
&& !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
|
||||||
|
|
||||||
|
/* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other
|
||||||
|
system headers, defines a conflicting _Static_assert that is no
|
||||||
|
better than ours; override it. */
|
||||||
|
#ifndef _GL_HAVE_STATIC_ASSERT
|
||||||
|
# include <stddef.h>
|
||||||
|
# undef _Static_assert
|
||||||
|
#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 ';'. */
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# define verify(R) _GL_VERIFY (R, "verify (" #R ")")
|
||||||
|
#else
|
||||||
|
/* PGI barfs if R is long. Play it safe. */
|
||||||
|
# define verify(R) _GL_VERIFY (R, "verify (...)")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __has_builtin
|
||||||
|
# define __has_builtin(x) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Assume that R always holds. This lets the compiler optimize
|
||||||
|
accordingly. R should not have side-effects; it may or may not be
|
||||||
|
evaluated. Behavior is undefined if R is false. */
|
||||||
|
|
||||||
|
#if (__has_builtin (__builtin_unreachable) \
|
||||||
|
|| 4 < __GNUC__ + (5 <= __GNUC_MINOR__))
|
||||||
|
# define assume(R) ((R) ? (void) 0 : __builtin_unreachable ())
|
||||||
|
#elif 1200 <= _MSC_VER
|
||||||
|
# define assume(R) __assume (R)
|
||||||
|
#elif ((defined GCC_LINT || defined lint) \
|
||||||
|
&& (__has_builtin (__builtin_trap) \
|
||||||
|
|| 3 < __GNUC__ + (3 < __GNUC_MINOR__ + (4 <= __GNUC_PATCHLEVEL__))))
|
||||||
|
/* Doing it this way helps various packages when configured with
|
||||||
|
--enable-gcc-warnings, which compiles with -Dlint. It's nicer
|
||||||
|
when 'assume' silences warnings even with older GCCs. */
|
||||||
|
# define assume(R) ((R) ? (void) 0 : __builtin_trap ())
|
||||||
|
#else
|
||||||
|
# define assume(R) ((void) (0 && (R)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @assert.h omit end@ */
|
||||||
|
|
||||||
|
#endif
|
109
lib/warn-on-use.h
Normal file
109
lib/warn-on-use.h
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
/* A C macro for emitting warnings if a function is used.
|
||||||
|
Copyright (C) 2010-2018 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
|
||||||
|
for FUNCTION which will then trigger a compiler warning containing
|
||||||
|
the text of "literal string" anywhere that function is called, if
|
||||||
|
supported by the compiler. If the compiler does not support this
|
||||||
|
feature, the macro expands to an unused extern declaration.
|
||||||
|
|
||||||
|
This macro is useful for marking a function as a potential
|
||||||
|
portability trap, with the intent that "literal string" include
|
||||||
|
instructions on the replacement function that should be used
|
||||||
|
instead. However, one of the reasons that a function is a
|
||||||
|
portability trap is if it has the wrong signature. Declaring
|
||||||
|
FUNCTION with a different signature in C is a compilation error, so
|
||||||
|
this macro must use the same type as any existing declaration so
|
||||||
|
that programs that avoid the problematic FUNCTION do not fail to
|
||||||
|
compile merely because they included a header that poisoned the
|
||||||
|
function. But this implies that _GL_WARN_ON_USE is only safe to
|
||||||
|
use if FUNCTION is known to already have a declaration. Use of
|
||||||
|
this macro implies that there must not be any other macro hiding
|
||||||
|
the declaration of FUNCTION; but undefining FUNCTION first is part
|
||||||
|
of the poisoning process anyway (although for symbols that are
|
||||||
|
provided only via a macro, the result is a compilation error rather
|
||||||
|
than a warning containing "literal string"). Also note that in
|
||||||
|
C++, it is only safe to use if FUNCTION has no overloads.
|
||||||
|
|
||||||
|
For an example, it is possible to poison 'getline' by:
|
||||||
|
- adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
|
||||||
|
[getline]) in configure.ac, which potentially defines
|
||||||
|
HAVE_RAW_DECL_GETLINE
|
||||||
|
- adding this code to a header that wraps the system <stdio.h>:
|
||||||
|
#undef getline
|
||||||
|
#if HAVE_RAW_DECL_GETLINE
|
||||||
|
_GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
|
||||||
|
"not universally present; use the gnulib module getline");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
It is not possible to directly poison global variables. But it is
|
||||||
|
possible to write a wrapper accessor function, and poison that
|
||||||
|
(less common usage, like &environ, will cause a compilation error
|
||||||
|
rather than issue the nice warning, but the end result of informing
|
||||||
|
the developer about their portability problem is still achieved):
|
||||||
|
#if HAVE_RAW_DECL_ENVIRON
|
||||||
|
static char ***rpl_environ (void) { return &environ; }
|
||||||
|
_GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
|
||||||
|
# undef environ
|
||||||
|
# define environ (*rpl_environ ())
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
#ifndef _GL_WARN_ON_USE
|
||||||
|
|
||||||
|
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
||||||
|
/* A compiler attribute is available in gcc versions 4.3.0 and later. */
|
||||||
|
# define _GL_WARN_ON_USE(function, message) \
|
||||||
|
extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
|
||||||
|
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||||
|
/* Verify the existence of the function. */
|
||||||
|
# define _GL_WARN_ON_USE(function, message) \
|
||||||
|
extern __typeof__ (function) function
|
||||||
|
# else /* Unsupported. */
|
||||||
|
# define _GL_WARN_ON_USE(function, message) \
|
||||||
|
_GL_WARN_EXTERN_C int _gl_warn_on_use
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
|
||||||
|
is like _GL_WARN_ON_USE (function, "string"), except that the function is
|
||||||
|
declared with the given prototype, consisting of return type, parameters,
|
||||||
|
and attributes.
|
||||||
|
This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
|
||||||
|
not work in this case. */
|
||||||
|
#ifndef _GL_WARN_ON_USE_CXX
|
||||||
|
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
||||||
|
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
||||||
|
extern rettype function parameters_and_attributes \
|
||||||
|
__attribute__ ((__warning__ (msg)))
|
||||||
|
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||||
|
/* Verify the existence of the function. */
|
||||||
|
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
||||||
|
extern rettype function parameters_and_attributes
|
||||||
|
# else /* Unsupported. */
|
||||||
|
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
||||||
|
_GL_WARN_EXTERN_C int _gl_warn_on_use
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_WARN_EXTERN_C declaration;
|
||||||
|
performs the declaration with C linkage. */
|
||||||
|
#ifndef _GL_WARN_EXTERN_C
|
||||||
|
# if defined __cplusplus
|
||||||
|
# define _GL_WARN_EXTERN_C extern "C"
|
||||||
|
# else
|
||||||
|
# define _GL_WARN_EXTERN_C extern
|
||||||
|
# endif
|
||||||
|
#endif
|
1072
lib/wchar.in.h
Normal file
1072
lib/wchar.in.h
Normal file
File diff suppressed because it is too large
Load diff
3
lib/xsize.c
Normal file
3
lib/xsize.c
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
#include <config.h>
|
||||||
|
#define XSIZE_INLINE _GL_EXTERN_INLINE
|
||||||
|
#include "xsize.h"
|
117
lib/xsize.h
Normal file
117
lib/xsize.h
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
/* xsize.h -- Checked size_t computations.
|
||||||
|
|
||||||
|
Copyright (C) 2003, 2008-2018 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 <https://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
|
||||||
|
|
||||||
|
#ifndef _GL_INLINE_HEADER_BEGIN
|
||||||
|
#error "Please include config.h first."
|
||||||
|
#endif
|
||||||
|
_GL_INLINE_HEADER_BEGIN
|
||||||
|
#ifndef XSIZE_INLINE
|
||||||
|
# define XSIZE_INLINE _GL_INLINE
|
||||||
|
#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. */
|
||||||
|
XSIZE_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. */
|
||||||
|
XSIZE_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. */
|
||||||
|
XSIZE_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. */
|
||||||
|
XSIZE_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 a 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)
|
||||||
|
|
||||||
|
_GL_INLINE_HEADER_END
|
||||||
|
|
||||||
|
#endif /* _XSIZE_H */
|
8
ltl2ba.h
8
ltl2ba.h
|
@ -140,12 +140,12 @@ enum {
|
||||||
AND, /* 258 */
|
AND, /* 258 */
|
||||||
EQUIV, /* 259 */
|
EQUIV, /* 259 */
|
||||||
EVENTUALLY, /* 260 */
|
EVENTUALLY, /* 260 */
|
||||||
FALSE, /* 261 */
|
FALSE, /* 261 */
|
||||||
IMPLIES, /* 262 */
|
IMPLIES, /* 262 */
|
||||||
NOT, /* 263 */
|
NOT, /* 263 */
|
||||||
OR, /* 264 */
|
OR, /* 264 */
|
||||||
PREDICATE, /* 265 */
|
PREDICATE, /* 265 */
|
||||||
TRUE, /* 266 */
|
TRUE, /* 266 */
|
||||||
U_OPER, /* 267 */
|
U_OPER, /* 267 */
|
||||||
V_OPER /* 268 */
|
V_OPER /* 268 */
|
||||||
#ifdef NXT
|
#ifdef NXT
|
||||||
|
@ -251,7 +251,9 @@ typedef Node *Nodeptr;
|
||||||
|
|
||||||
#define Assert(x, y) { if (!(x)) { tl_explain(y); \
|
#define Assert(x, y) { if (!(x)) { tl_explain(y); \
|
||||||
Fatal(": assertion failed\n",(char *)0); } }
|
Fatal(": assertion failed\n",(char *)0); } }
|
||||||
#define min(x,y) ((x<y)?x:y)
|
#ifndef min
|
||||||
|
# define min(x,y) ((x<y)?x:y)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* from main.c */
|
/* from main.c */
|
||||||
extern FILE *tl_out;
|
extern FILE *tl_out;
|
||||||
|
|
46
m4/00gnulib.m4
Normal file
46
m4/00gnulib.m4
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
# 00gnulib.m4 serial 3
|
||||||
|
dnl Copyright (C) 2009-2018 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 and
|
||||||
|
dnl m4_divert semantics.
|
||||||
|
|
||||||
|
# Until autoconf 2.63, handling of the diversion stack required m4_init
|
||||||
|
# to be called first; but this does not happen with aclocal. Wrapping
|
||||||
|
# the entire execution in another layer of the diversion stack fixes this.
|
||||||
|
# Worse, prior to autoconf 2.62, m4_wrap depended on the underlying m4
|
||||||
|
# for whether it was FIFO or LIFO; in order to properly balance with
|
||||||
|
# m4_init, we need to undo our push just before anything wrapped within
|
||||||
|
# the m4_init body. The way to ensure this is to wrap both sides of
|
||||||
|
# m4_init with a one-shot macro that does the pop at the right time.
|
||||||
|
m4_ifndef([_m4_divert_diversion],
|
||||||
|
[m4_divert_push([KILL])
|
||||||
|
m4_define([gl_divert_fixup], [m4_divert_pop()m4_define([$0])])
|
||||||
|
m4_define([m4_init],
|
||||||
|
[gl_divert_fixup()]m4_defn([m4_init])[gl_divert_fixup()])])
|
||||||
|
|
||||||
|
|
||||||
|
# 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])
|
102
m4/absolute-header.m4
Normal file
102
m4/absolute-header.m4
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
# absolute-header.m4 serial 16
|
||||||
|
dnl Copyright (C) 2006-2018 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 Derek Price.
|
||||||
|
|
||||||
|
# gl_ABSOLUTE_HEADER(HEADER1 HEADER2 ...)
|
||||||
|
# ---------------------------------------
|
||||||
|
# Find the absolute name of a header file, testing first if the header exists.
|
||||||
|
# If the header were sys/inttypes.h, this macro would define
|
||||||
|
# ABSOLUTE_SYS_INTTYPES_H to the '""' quoted absolute name of sys/inttypes.h
|
||||||
|
# in config.h
|
||||||
|
# (e.g. '#define ABSOLUTE_SYS_INTTYPES_H "///usr/include/sys/inttypes.h"').
|
||||||
|
# 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.
|
||||||
|
AC_DEFUN([gl_ABSOLUTE_HEADER],
|
||||||
|
[AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
|
AC_LANG_PREPROC_REQUIRE()dnl
|
||||||
|
dnl FIXME: gl_absolute_header and ac_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_absolute_header],
|
||||||
|
[gl_cv_absolute_]m4_defn([gl_HEADER_NAME]))dnl
|
||||||
|
AC_CACHE_CHECK([absolute name of <]m4_defn([gl_HEADER_NAME])[>],
|
||||||
|
m4_defn([gl_absolute_header]),
|
||||||
|
[AS_VAR_PUSHDEF([ac_header_exists],
|
||||||
|
[ac_cv_header_]m4_defn([gl_HEADER_NAME]))dnl
|
||||||
|
AC_CHECK_HEADERS_ONCE(m4_defn([gl_HEADER_NAME]))dnl
|
||||||
|
if test AS_VAR_GET(ac_header_exists) = yes; then
|
||||||
|
gl_ABSOLUTE_HEADER_ONE(m4_defn([gl_HEADER_NAME]))
|
||||||
|
fi
|
||||||
|
AS_VAR_POPDEF([ac_header_exists])dnl
|
||||||
|
])dnl
|
||||||
|
AC_DEFINE_UNQUOTED(AS_TR_CPP([ABSOLUTE_]m4_defn([gl_HEADER_NAME])),
|
||||||
|
["AS_VAR_GET(gl_absolute_header)"],
|
||||||
|
[Define this to an absolute name of <]m4_defn([gl_HEADER_NAME])[>.])
|
||||||
|
AS_VAR_POPDEF([gl_absolute_header])dnl
|
||||||
|
])dnl
|
||||||
|
])# gl_ABSOLUTE_HEADER
|
||||||
|
|
||||||
|
# gl_ABSOLUTE_HEADER_ONE(HEADER)
|
||||||
|
# ------------------------------
|
||||||
|
# Like gl_ABSOLUTE_HEADER, except that:
|
||||||
|
# - it assumes that the header exists,
|
||||||
|
# - it uses the current CPPFLAGS,
|
||||||
|
# - it does not cache the result,
|
||||||
|
# - it is silent.
|
||||||
|
AC_DEFUN([gl_ABSOLUTE_HEADER_ONE],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
|
AC_LANG_CONFTEST([AC_LANG_SOURCE([[#include <]]m4_dquote([$1])[[>]])])
|
||||||
|
dnl AIX "xlc -E" and "cc -E" omit #line directives for header files
|
||||||
|
dnl that contain only a #include of other header files and no
|
||||||
|
dnl non-comment tokens of their own. This leads to a failure to
|
||||||
|
dnl detect the absolute name of <dirent.h>, <signal.h>, <poll.h>
|
||||||
|
dnl and others. The workaround is to force preservation of comments
|
||||||
|
dnl through option -C. This ensures all necessary #line directives
|
||||||
|
dnl 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'
|
||||||
|
gl_header_literal_regex=`echo '$1' \
|
||||||
|
| 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/
|
||||||
|
s|^/[^/]|//&|
|
||||||
|
p
|
||||||
|
q
|
||||||
|
}'
|
||||||
|
changequote([,])
|
||||||
|
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_cv_absolute_]AS_TR_SH([[$1]]),
|
||||||
|
[`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
|
||||||
|
sed -n "$gl_absolute_header_sed"`])
|
||||||
|
])
|
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-2018 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 <https://lists.gnu.org/r/bug-gnulib/2011-06/msg00277.html>.
|
||||||
|
|
||||||
|
m4_version_prereq([2.69], [] ,[
|
||||||
|
|
||||||
|
# This is taken from the following Autoconf patch:
|
||||||
|
# https://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=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
|
||||||
|
])
|
137
m4/errno_h.m4
Normal file
137
m4/errno_h.m4
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
# errno_h.m4 serial 12
|
||||||
|
dnl Copyright (C) 2004, 2006, 2008-2018 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
|
||||||
|
#if !defined EILSEQ
|
||||||
|
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-2018 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
|
||||||
|
])
|
92
m4/exponentf.m4
Normal file
92
m4/exponentf.m4
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
# exponentf.m4 serial 2
|
||||||
|
dnl Copyright (C) 2007-2008, 2010-2018 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_EXPONENT_LOCATION],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([where to find the exponent in a 'float'],
|
||||||
|
[gl_cv_cc_float_expbit0],
|
||||||
|
[
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#include <float.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#define NWORDS \
|
||||||
|
((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
|
||||||
|
typedef union { float value; unsigned int word[NWORDS]; } memory_float;
|
||||||
|
static unsigned int ored_words[NWORDS];
|
||||||
|
static unsigned int anded_words[NWORDS];
|
||||||
|
static void add_to_ored_words (float x)
|
||||||
|
{
|
||||||
|
memory_float m;
|
||||||
|
size_t i;
|
||||||
|
/* Clear it first, in case
|
||||||
|
sizeof (float) < sizeof (memory_float). */
|
||||||
|
memset (&m, 0, sizeof (memory_float));
|
||||||
|
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.25f);
|
||||||
|
add_to_ored_words (0.5f);
|
||||||
|
add_to_ored_words (1.0f);
|
||||||
|
add_to_ored_words (2.0f);
|
||||||
|
add_to_ored_words (4.0f);
|
||||||
|
/* 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_float_expbit0=`cat conftest.out`],
|
||||||
|
[gl_cv_cc_float_expbit0="unknown"],
|
||||||
|
[gl_cv_cc_float_expbit0="word 0 bit 23"])
|
||||||
|
rm -f conftest.out
|
||||||
|
])
|
||||||
|
case "$gl_cv_cc_float_expbit0" in
|
||||||
|
word*bit*)
|
||||||
|
word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
|
||||||
|
bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'`
|
||||||
|
AC_DEFINE_UNQUOTED([FLT_EXPBIT0_WORD], [$word],
|
||||||
|
[Define as the word index where to find the exponent of 'float'.])
|
||||||
|
AC_DEFINE_UNQUOTED([FLT_EXPBIT0_BIT], [$bit],
|
||||||
|
[Define as the bit index in the word where to find bit 0 of the exponent of 'float'.])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
])
|
114
m4/exponentl.m4
Normal file
114
m4/exponentl.m4
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
# exponentl.m4 serial 4
|
||||||
|
dnl Copyright (C) 2007-2018 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_LONG_DOUBLE_EXPONENT_LOCATION],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_BIGENDIAN])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
||||||
|
AC_CACHE_CHECK([where to find the exponent in a 'long double'],
|
||||||
|
[gl_cv_cc_long_double_expbit0],
|
||||||
|
[
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#include <float.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#define NWORDS \
|
||||||
|
((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
|
||||||
|
typedef union { long double value; unsigned int word[NWORDS]; }
|
||||||
|
memory_long_double;
|
||||||
|
static unsigned int ored_words[NWORDS];
|
||||||
|
static unsigned int anded_words[NWORDS];
|
||||||
|
static void add_to_ored_words (long double x)
|
||||||
|
{
|
||||||
|
memory_long_double m;
|
||||||
|
size_t i;
|
||||||
|
/* Clear it first, in case
|
||||||
|
sizeof (long double) < sizeof (memory_long_double). */
|
||||||
|
memset (&m, 0, sizeof (memory_long_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.25L);
|
||||||
|
add_to_ored_words (0.5L);
|
||||||
|
add_to_ored_words (1.0L);
|
||||||
|
add_to_ored_words (2.0L);
|
||||||
|
add_to_ored_words (4.0L);
|
||||||
|
/* 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_long_double_expbit0=`cat conftest.out`],
|
||||||
|
[gl_cv_cc_long_double_expbit0="unknown"],
|
||||||
|
[
|
||||||
|
dnl When cross-compiling, in general we don't know. It depends on the
|
||||||
|
dnl ABI and compiler version. There are too many cases.
|
||||||
|
gl_cv_cc_long_double_expbit0="unknown"
|
||||||
|
case "$host_os" in
|
||||||
|
mingw*) # On native Windows (little-endian), we know the result
|
||||||
|
# in two cases: mingw, MSVC.
|
||||||
|
AC_EGREP_CPP([Known], [
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
Known
|
||||||
|
#endif
|
||||||
|
], [gl_cv_cc_long_double_expbit0="word 2 bit 0"])
|
||||||
|
AC_EGREP_CPP([Known], [
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
Known
|
||||||
|
#endif
|
||||||
|
], [gl_cv_cc_long_double_expbit0="word 1 bit 20"])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
rm -f conftest.out
|
||||||
|
])
|
||||||
|
case "$gl_cv_cc_long_double_expbit0" in
|
||||||
|
word*bit*)
|
||||||
|
word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
|
||||||
|
bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'`
|
||||||
|
AC_DEFINE_UNQUOTED([LDBL_EXPBIT0_WORD], [$word],
|
||||||
|
[Define as the word index where to find the exponent of 'long double'.])
|
||||||
|
AC_DEFINE_UNQUOTED([LDBL_EXPBIT0_BIT], [$bit],
|
||||||
|
[Define as the bit index in the word where to find bit 0 of the exponent of 'long double'.])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
])
|
189
m4/extensions.m4
Normal file
189
m4/extensions.m4
Normal file
|
@ -0,0 +1,189 @@
|
||||||
|
# serial 18 -*- Autoconf -*-
|
||||||
|
# Enable extensions on systems that normally disable them.
|
||||||
|
|
||||||
|
# Copyright (C) 2003, 2006-2018 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 git
|
||||||
|
# Autoconf. Perhaps we can remove this once we can assume Autoconf
|
||||||
|
# 2.70 or later everywhere, but since 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_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.])
|
||||||
|
AC_DEFINE([_NETBSD_SOURCE], [1],
|
||||||
|
[Define to 1 to make NetBSD features available. MINIX 3 needs this.])
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Use a different key than __EXTENSIONS__, as that name broke existing
|
||||||
|
dnl configure.ac when using autoheader 2.62.
|
||||||
|
AH_VERBATIM([USE_SYSTEM_EXTENSIONS],
|
||||||
|
[/* Enable extensions on AIX 3, Interix. */
|
||||||
|
#ifndef _ALL_SOURCE
|
||||||
|
# undef _ALL_SOURCE
|
||||||
|
#endif
|
||||||
|
/* Enable general extensions on macOS. */
|
||||||
|
#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 NetBSD extensions on NetBSD. */
|
||||||
|
#ifndef _NETBSD_SOURCE
|
||||||
|
# undef _NETBSD_SOURCE
|
||||||
|
#endif
|
||||||
|
/* Enable OpenBSD extensions on NetBSD. */
|
||||||
|
#ifndef _OPENBSD_SOURCE
|
||||||
|
# undef _OPENBSD_SOURCE
|
||||||
|
#endif
|
||||||
|
/* Enable threading extensions on Solaris. */
|
||||||
|
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||||
|
# undef _POSIX_PTHREAD_SEMANTICS
|
||||||
|
#endif
|
||||||
|
/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */
|
||||||
|
#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
|
||||||
|
# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
|
||||||
|
#endif
|
||||||
|
/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */
|
||||||
|
#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
|
||||||
|
# undef __STDC_WANT_IEC_60559_BFP_EXT__
|
||||||
|
#endif
|
||||||
|
/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */
|
||||||
|
#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
|
||||||
|
# undef __STDC_WANT_IEC_60559_DFP_EXT__
|
||||||
|
#endif
|
||||||
|
/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
|
||||||
|
#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
|
||||||
|
# undef __STDC_WANT_IEC_60559_FUNCS_EXT__
|
||||||
|
#endif
|
||||||
|
/* Enable extensions specified by ISO/IEC TS 18661-3:2015. */
|
||||||
|
#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
|
||||||
|
# undef __STDC_WANT_IEC_60559_TYPES_EXT__
|
||||||
|
#endif
|
||||||
|
/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */
|
||||||
|
#ifndef __STDC_WANT_LIB_EXT2__
|
||||||
|
# undef __STDC_WANT_LIB_EXT2__
|
||||||
|
#endif
|
||||||
|
/* Enable extensions specified by ISO/IEC 24747:2009. */
|
||||||
|
#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
|
||||||
|
# undef __STDC_WANT_MATH_SPEC_FUNCS__
|
||||||
|
#endif
|
||||||
|
/* Enable extensions on HP NonStop. */
|
||||||
|
#ifndef _TANDEM_SOURCE
|
||||||
|
# undef _TANDEM_SOURCE
|
||||||
|
#endif
|
||||||
|
/* Enable X/Open extensions if necessary. HP-UX 11.11 defines
|
||||||
|
mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of
|
||||||
|
whether compiling with -Ae or -D_HPUX_SOURCE=1. */
|
||||||
|
#ifndef _XOPEN_SOURCE
|
||||||
|
# undef _XOPEN_SOURCE
|
||||||
|
#endif
|
||||||
|
/* Enable X/Open compliant socket functions that do not require linking
|
||||||
|
with -lxnet on HP-UX 11.11. */
|
||||||
|
#ifndef _HPUX_ALT_XOPEN_SOCKET_API
|
||||||
|
# undef _HPUX_ALT_XOPEN_SOCKET_API
|
||||||
|
#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([_NETBSD_SOURCE])
|
||||||
|
AC_DEFINE([_OPENBSD_SOURCE])
|
||||||
|
AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
|
||||||
|
AC_DEFINE([__STDC_WANT_IEC_60559_ATTRIBS_EXT__])
|
||||||
|
AC_DEFINE([__STDC_WANT_IEC_60559_BFP_EXT__])
|
||||||
|
AC_DEFINE([__STDC_WANT_IEC_60559_DFP_EXT__])
|
||||||
|
AC_DEFINE([__STDC_WANT_IEC_60559_FUNCS_EXT__])
|
||||||
|
AC_DEFINE([__STDC_WANT_IEC_60559_TYPES_EXT__])
|
||||||
|
AC_DEFINE([__STDC_WANT_LIB_EXT2__])
|
||||||
|
AC_DEFINE([__STDC_WANT_MATH_SPEC_FUNCS__])
|
||||||
|
AC_DEFINE([_TANDEM_SOURCE])
|
||||||
|
AC_CACHE_CHECK([whether _XOPEN_SOURCE should be defined],
|
||||||
|
[ac_cv_should_define__xopen_source],
|
||||||
|
[ac_cv_should_define__xopen_source=no
|
||||||
|
AC_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([[
|
||||||
|
#include <wchar.h>
|
||||||
|
mbstate_t x;]])],
|
||||||
|
[],
|
||||||
|
[AC_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([[
|
||||||
|
#define _XOPEN_SOURCE 500
|
||||||
|
#include <wchar.h>
|
||||||
|
mbstate_t x;]])],
|
||||||
|
[ac_cv_should_define__xopen_source=yes])])])
|
||||||
|
test $ac_cv_should_define__xopen_source = yes &&
|
||||||
|
AC_DEFINE([_XOPEN_SOURCE], [500])
|
||||||
|
AC_DEFINE([_HPUX_ALT_XOPEN_SOCKET_API])
|
||||||
|
])# 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])
|
||||||
|
])
|
102
m4/extern-inline.m4
Normal file
102
m4/extern-inline.m4
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
dnl 'extern inline' a la ISO C99.
|
||||||
|
|
||||||
|
dnl Copyright 2012-2018 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_EXTERN_INLINE],
|
||||||
|
[
|
||||||
|
AH_VERBATIM([extern_inline],
|
||||||
|
[/* Please see the Gnulib manual for how to use these macros.
|
||||||
|
|
||||||
|
Suppress extern inline with HP-UX cc, as it appears to be broken; see
|
||||||
|
<https://lists.gnu.org/r/bug-texinfo/2013-02/msg00030.html>.
|
||||||
|
|
||||||
|
Suppress extern inline with Sun C in standards-conformance mode, as it
|
||||||
|
mishandles inline functions that call each other. E.g., for 'inline void f
|
||||||
|
(void) { } inline void g (void) { f (); }', c99 incorrectly complains
|
||||||
|
'reference to static identifier "f" in extern inline function'.
|
||||||
|
This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
|
||||||
|
|
||||||
|
Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
|
||||||
|
on configurations that mistakenly use 'static inline' to implement
|
||||||
|
functions or macros in standard C headers like <ctype.h>. For example,
|
||||||
|
if isdigit is mistakenly implemented via a static inline function,
|
||||||
|
a program containing an extern inline function that calls isdigit
|
||||||
|
may not work since the C standard prohibits extern inline functions
|
||||||
|
from calling static functions. This bug is known to occur on:
|
||||||
|
|
||||||
|
OS X 10.8 and earlier; see:
|
||||||
|
https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html
|
||||||
|
|
||||||
|
DragonFly; see
|
||||||
|
http://muscles.dragonflybsd.org/bulk/bleeding-edge-potential/latest-per-pkg/ah-tty-0.3.12.log
|
||||||
|
|
||||||
|
FreeBSD; see:
|
||||||
|
https://lists.gnu.org/r/bug-gnulib/2014-07/msg00104.html
|
||||||
|
|
||||||
|
OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and
|
||||||
|
for clang but remains for g++; see <https://trac.macports.org/ticket/41033>.
|
||||||
|
Assume DragonFly and FreeBSD will be similar. */
|
||||||
|
#if (((defined __APPLE__ && defined __MACH__) \
|
||||||
|
|| defined __DragonFly__ || defined __FreeBSD__) \
|
||||||
|
&& (defined __header_inline \
|
||||||
|
? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \
|
||||||
|
&& ! defined __clang__) \
|
||||||
|
: ((! defined _DONT_USE_CTYPE_INLINE_ \
|
||||||
|
&& (defined __GNUC__ || defined __cplusplus)) \
|
||||||
|
|| (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \
|
||||||
|
&& defined __GNUC__ && ! defined __cplusplus))))
|
||||||
|
# define _GL_EXTERN_INLINE_STDHEADER_BUG
|
||||||
|
#endif
|
||||||
|
#if ((__GNUC__ \
|
||||||
|
? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \
|
||||||
|
: (199901L <= __STDC_VERSION__ \
|
||||||
|
&& !defined __HP_cc \
|
||||||
|
&& !defined __PGI \
|
||||||
|
&& !(defined __SUNPRO_C && __STDC__))) \
|
||||||
|
&& !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
|
||||||
|
# define _GL_INLINE inline
|
||||||
|
# define _GL_EXTERN_INLINE extern inline
|
||||||
|
# define _GL_EXTERN_INLINE_IN_USE
|
||||||
|
#elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \
|
||||||
|
&& !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
|
||||||
|
# if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__
|
||||||
|
/* __gnu_inline__ suppresses a GCC 4.2 diagnostic. */
|
||||||
|
# define _GL_INLINE extern inline __attribute__ ((__gnu_inline__))
|
||||||
|
# else
|
||||||
|
# define _GL_INLINE extern inline
|
||||||
|
# endif
|
||||||
|
# define _GL_EXTERN_INLINE extern
|
||||||
|
# define _GL_EXTERN_INLINE_IN_USE
|
||||||
|
#else
|
||||||
|
# define _GL_INLINE static _GL_UNUSED
|
||||||
|
# define _GL_EXTERN_INLINE static _GL_UNUSED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* In GCC 4.6 (inclusive) to 5.1 (exclusive),
|
||||||
|
suppress bogus "no previous prototype for 'FOO'"
|
||||||
|
and "no previous declaration for 'FOO'" diagnostics,
|
||||||
|
when FOO is an inline function in the header; see
|
||||||
|
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113> and
|
||||||
|
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63877>. */
|
||||||
|
#if __GNUC__ == 4 && 6 <= __GNUC_MINOR__
|
||||||
|
# if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__
|
||||||
|
# define _GL_INLINE_HEADER_CONST_PRAGMA
|
||||||
|
# else
|
||||||
|
# define _GL_INLINE_HEADER_CONST_PRAGMA \
|
||||||
|
_Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"")
|
||||||
|
# endif
|
||||||
|
# define _GL_INLINE_HEADER_BEGIN \
|
||||||
|
_Pragma ("GCC diagnostic push") \
|
||||||
|
_Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \
|
||||||
|
_Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \
|
||||||
|
_GL_INLINE_HEADER_CONST_PRAGMA
|
||||||
|
# define _GL_INLINE_HEADER_END \
|
||||||
|
_Pragma ("GCC diagnostic pop")
|
||||||
|
#else
|
||||||
|
# define _GL_INLINE_HEADER_BEGIN
|
||||||
|
# define _GL_INLINE_HEADER_END
|
||||||
|
#endif])
|
||||||
|
])
|
108
m4/float_h.m4
Normal file
108
m4/float_h.m4
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
# float_h.m4 serial 12
|
||||||
|
dnl Copyright (C) 2007, 2009-2018 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* | dragonfly*)
|
||||||
|
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_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_SOURCE(
|
||||||
|
[[#if defined __LP64__ || defined __x86_64__ || defined __amd64__
|
||||||
|
int ok;
|
||||||
|
#else
|
||||||
|
error fail
|
||||||
|
#endif
|
||||||
|
]])],
|
||||||
|
[],
|
||||||
|
[FLOAT_H=float.h])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
linux*)
|
||||||
|
case "$host_cpu" in
|
||||||
|
powerpc*)
|
||||||
|
FLOAT_H=float.h
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case "$host_os" in
|
||||||
|
aix* | freebsd* | dragonfly* | 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_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_SOURCE(
|
||||||
|
[[#if defined __LP64__ || defined __arch64__
|
||||||
|
int ok;
|
||||||
|
#else
|
||||||
|
error fail
|
||||||
|
#endif
|
||||||
|
]])],
|
||||||
|
[gl_cv_func_itold_works="guessing no"],
|
||||||
|
[gl_cv_func_itold_works="guessing yes"])
|
||||||
|
;;
|
||||||
|
# Guess yes on native Windows.
|
||||||
|
mingw*) 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])
|
||||||
|
])
|
54
m4/fpieee.m4
Normal file
54
m4/fpieee.m4
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
# fpieee.m4 serial 2 -*- coding: utf-8 -*-
|
||||||
|
dnl Copyright (C) 2007, 2009-2018 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 IEEE 754 standardized three items:
|
||||||
|
dnl - The formats of single-float and double-float - nowadays commonly
|
||||||
|
dnl available as 'float' and 'double' in C and C++.
|
||||||
|
dnl No autoconf test needed.
|
||||||
|
dnl - The overflow and division by zero behaviour: The result are values
|
||||||
|
dnl '±Inf' and 'NaN', rather than exceptions as it was before.
|
||||||
|
dnl This file provides an autoconf macro for ensuring this behaviour of
|
||||||
|
dnl floating-point operations.
|
||||||
|
dnl - A set of conditions (overflow, underflow, inexact, etc.) which can
|
||||||
|
dnl be configured to trigger an exception.
|
||||||
|
dnl This cannot be done in a portable way: it depends on the compiler,
|
||||||
|
dnl libc, kernel, and CPU. No autoconf macro is provided for this.
|
||||||
|
|
||||||
|
dnl Ensure non-trapping behaviour of floating-point overflow and
|
||||||
|
dnl floating-point division by zero.
|
||||||
|
dnl (For integer overflow, see gcc's -ftrapv option; for integer division by
|
||||||
|
dnl zero, see the autoconf macro in intdiv0.m4.)
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FP_IEEE],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
|
# IEEE behaviour is the default on all CPUs except Alpha and SH
|
||||||
|
# (according to the test results of Bruno Haible's ieeefp/fenv_default.m4
|
||||||
|
# and the GCC 4.1.2 manual).
|
||||||
|
case "$host_cpu" in
|
||||||
|
alpha*)
|
||||||
|
# On Alpha systems, a compiler option provides the behaviour.
|
||||||
|
# See the ieee(3) manual page, also available at
|
||||||
|
# <https://backdrift.org/man/tru64/man3/ieee.3.html>
|
||||||
|
if test -n "$GCC"; then
|
||||||
|
# GCC has the option -mieee.
|
||||||
|
# For full IEEE compliance (rarely needed), use option -mieee-with-inexact.
|
||||||
|
CPPFLAGS="$CPPFLAGS -mieee"
|
||||||
|
else
|
||||||
|
# Compaq (ex-DEC) C has the option -ieee, equivalent to -ieee_with_no_inexact.
|
||||||
|
# For full IEEE compliance (rarely needed), use option -ieee_with_inexact.
|
||||||
|
CPPFLAGS="$CPPFLAGS -ieee"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
sh*)
|
||||||
|
if test -n "$GCC"; then
|
||||||
|
# GCC has the option -mieee.
|
||||||
|
CPPFLAGS="$CPPFLAGS -mieee"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
])
|
110
m4/fprintf-posix.m4
Normal file
110
m4/fprintf-posix.m4
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
# fprintf-posix.m4 serial 14
|
||||||
|
dnl Copyright (C) 2007-2018 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_FUNC_FPRINTF_POSIX],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_PRINTF_SIZES_C99])
|
||||||
|
AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
|
||||||
|
AC_REQUIRE([gl_PRINTF_INFINITE])
|
||||||
|
AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
|
||||||
|
AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
|
||||||
|
AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
|
||||||
|
AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
|
||||||
|
AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
|
||||||
|
AC_REQUIRE([gl_PRINTF_POSITIONS])
|
||||||
|
AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
|
||||||
|
AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
|
||||||
|
AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
|
||||||
|
AC_REQUIRE([gl_PRINTF_PRECISION])
|
||||||
|
AC_REQUIRE([gl_PRINTF_ENOMEM])
|
||||||
|
gl_cv_func_fprintf_posix=no
|
||||||
|
case "$gl_cv_func_printf_sizes_c99" in
|
||||||
|
*yes)
|
||||||
|
case "$gl_cv_func_printf_long_double" in
|
||||||
|
*yes)
|
||||||
|
case "$gl_cv_func_printf_infinite" in
|
||||||
|
*yes)
|
||||||
|
case "$gl_cv_func_printf_infinite_long_double" in
|
||||||
|
*yes)
|
||||||
|
case "$gl_cv_func_printf_directive_a" in
|
||||||
|
*yes)
|
||||||
|
case "$gl_cv_func_printf_directive_f" in
|
||||||
|
*yes)
|
||||||
|
case "$gl_cv_func_printf_directive_n" in
|
||||||
|
*yes)
|
||||||
|
case "$gl_cv_func_printf_directive_ls" in
|
||||||
|
*yes)
|
||||||
|
case "$gl_cv_func_printf_positions" in
|
||||||
|
*yes)
|
||||||
|
case "$gl_cv_func_printf_flag_grouping" in
|
||||||
|
*yes)
|
||||||
|
case "$gl_cv_func_printf_flag_leftadjust" in
|
||||||
|
*yes)
|
||||||
|
case "$gl_cv_func_printf_flag_zero" in
|
||||||
|
*yes)
|
||||||
|
case "$gl_cv_func_printf_precision" in
|
||||||
|
*yes)
|
||||||
|
case "$gl_cv_func_printf_enomem" in
|
||||||
|
*yes)
|
||||||
|
# fprintf exists and is
|
||||||
|
# already POSIX compliant.
|
||||||
|
gl_cv_func_fprintf_posix=yes
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if test $gl_cv_func_fprintf_posix = no; then
|
||||||
|
gl_PREREQ_VASNPRINTF_LONG_DOUBLE
|
||||||
|
gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
|
||||||
|
gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
|
||||||
|
gl_PREREQ_VASNPRINTF_DIRECTIVE_A
|
||||||
|
gl_PREREQ_VASNPRINTF_DIRECTIVE_F
|
||||||
|
gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
|
||||||
|
gl_PREREQ_VASNPRINTF_FLAG_GROUPING
|
||||||
|
gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
|
||||||
|
gl_PREREQ_VASNPRINTF_FLAG_ZERO
|
||||||
|
gl_PREREQ_VASNPRINTF_PRECISION
|
||||||
|
gl_PREREQ_VASNPRINTF_ENOMEM
|
||||||
|
gl_REPLACE_VASNPRINTF
|
||||||
|
gl_REPLACE_FPRINTF
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_REPLACE_FPRINTF],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_STDIO_H_DEFAULTS])
|
||||||
|
AC_LIBOBJ([fprintf])
|
||||||
|
REPLACE_FPRINTF=1
|
||||||
|
AC_DEFINE([REPLACE_FPRINTF_POSIX], [1],
|
||||||
|
[Define if fprintf is overridden by a POSIX compliant gnulib implementation.])
|
||||||
|
gl_PREREQ_FPRINTF
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_PREREQ_FPRINTF], [:])
|
181
m4/frexp.m4
Normal file
181
m4/frexp.m4
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
# frexp.m4 serial 16
|
||||||
|
dnl Copyright (C) 2007-2018 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_FUNC_FREXP],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_MATH_H_DEFAULTS])
|
||||||
|
AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM])
|
||||||
|
FREXP_LIBM=
|
||||||
|
if test $gl_cv_func_frexp_no_libm = no; then
|
||||||
|
AC_CACHE_CHECK([whether frexp() can be used with libm],
|
||||||
|
[gl_cv_func_frexp_in_libm],
|
||||||
|
[
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS -lm"
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
double x;]],
|
||||||
|
[[int e; return frexp (x, &e) > 0;]])],
|
||||||
|
[gl_cv_func_frexp_in_libm=yes],
|
||||||
|
[gl_cv_func_frexp_in_libm=no])
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
])
|
||||||
|
if test $gl_cv_func_frexp_in_libm = yes; then
|
||||||
|
FREXP_LIBM=-lm
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test $gl_cv_func_frexp_no_libm = yes \
|
||||||
|
|| test $gl_cv_func_frexp_in_libm = yes; then
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS $FREXP_LIBM"
|
||||||
|
gl_FUNC_FREXP_WORKS
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
case "$gl_cv_func_frexp_works" in
|
||||||
|
*yes) gl_func_frexp=yes ;;
|
||||||
|
*) gl_func_frexp=no; REPLACE_FREXP=1; FREXP_LIBM= ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
gl_func_frexp=no
|
||||||
|
fi
|
||||||
|
if test $gl_func_frexp = yes; then
|
||||||
|
AC_DEFINE([HAVE_FREXP], [1],
|
||||||
|
[Define if the frexp() function is available and works.])
|
||||||
|
fi
|
||||||
|
AC_SUBST([FREXP_LIBM])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FUNC_FREXP_NO_LIBM],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_MATH_H_DEFAULTS])
|
||||||
|
AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM])
|
||||||
|
if test $gl_cv_func_frexp_no_libm = yes; then
|
||||||
|
gl_FUNC_FREXP_WORKS
|
||||||
|
case "$gl_cv_func_frexp_works" in
|
||||||
|
*yes) gl_func_frexp_no_libm=yes ;;
|
||||||
|
*) gl_func_frexp_no_libm=no; REPLACE_FREXP=1 ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
gl_func_frexp_no_libm=no
|
||||||
|
dnl Set REPLACE_FREXP here because the system may have frexp in libm.
|
||||||
|
REPLACE_FREXP=1
|
||||||
|
fi
|
||||||
|
if test $gl_func_frexp_no_libm = yes; then
|
||||||
|
AC_DEFINE([HAVE_FREXP_IN_LIBC], [1],
|
||||||
|
[Define if the frexp() function is available in libc.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Test whether frexp() can be used without linking with libm.
|
||||||
|
dnl Set gl_cv_func_frexp_no_libm to 'yes' or 'no' accordingly.
|
||||||
|
AC_DEFUN([gl_CHECK_FREXP_NO_LIBM],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([whether frexp() can be used without linking with libm],
|
||||||
|
[gl_cv_func_frexp_no_libm],
|
||||||
|
[
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
double x;]],
|
||||||
|
[[int e; return frexp (x, &e) > 0;]])],
|
||||||
|
[gl_cv_func_frexp_no_libm=yes],
|
||||||
|
[gl_cv_func_frexp_no_libm=no])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Test whether frexp() works also on denormalized numbers (this fails e.g. on
|
||||||
|
dnl NetBSD 3.0), on infinite numbers (this fails e.g. on IRIX 6.5 and mingw),
|
||||||
|
dnl and on negative zero (this fails e.g. on NetBSD 4.99 and mingw).
|
||||||
|
AC_DEFUN([gl_FUNC_FREXP_WORKS],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
||||||
|
AC_CHECK_DECLS_ONCE([alarm])
|
||||||
|
AC_CACHE_CHECK([whether frexp works], [gl_cv_func_frexp_works],
|
||||||
|
[
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#include <float.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
#if HAVE_DECL_ALARM
|
||||||
|
# include <signal.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
|
||||||
|
ICC 10.0 has a bug when optimizing the expression -zero.
|
||||||
|
The expression -DBL_MIN * DBL_MIN does not work when cross-compiling
|
||||||
|
to PowerPC on Mac OS X 10.5. */
|
||||||
|
#if defined __hpux || defined __sgi || defined __ICC
|
||||||
|
static double
|
||||||
|
compute_minus_zero (void)
|
||||||
|
{
|
||||||
|
return -DBL_MIN * DBL_MIN;
|
||||||
|
}
|
||||||
|
# define minus_zero compute_minus_zero ()
|
||||||
|
#else
|
||||||
|
double minus_zero = -0.0;
|
||||||
|
#endif
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
int i;
|
||||||
|
volatile double x;
|
||||||
|
double zero = 0.0;
|
||||||
|
#if HAVE_DECL_ALARM
|
||||||
|
/* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite
|
||||||
|
number. Let the test fail in this case. */
|
||||||
|
signal (SIGALRM, SIG_DFL);
|
||||||
|
alarm (5);
|
||||||
|
#endif
|
||||||
|
/* Test on denormalized numbers. */
|
||||||
|
for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
|
||||||
|
;
|
||||||
|
if (x > 0.0)
|
||||||
|
{
|
||||||
|
int exp;
|
||||||
|
double y = frexp (x, &exp);
|
||||||
|
/* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
|
||||||
|
On NetBSD: y = 0.75. Correct: y = 0.5. */
|
||||||
|
if (y != 0.5)
|
||||||
|
result |= 1;
|
||||||
|
}
|
||||||
|
/* Test on infinite numbers. */
|
||||||
|
x = 1.0 / zero;
|
||||||
|
{
|
||||||
|
int exp;
|
||||||
|
double y = frexp (x, &exp);
|
||||||
|
if (y != x)
|
||||||
|
result |= 2;
|
||||||
|
}
|
||||||
|
/* Test on negative zero. */
|
||||||
|
x = minus_zero;
|
||||||
|
{
|
||||||
|
int exp;
|
||||||
|
double y = frexp (x, &exp);
|
||||||
|
if (memcmp (&y, &x, sizeof x))
|
||||||
|
result |= 4;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}]])],
|
||||||
|
[gl_cv_func_frexp_works=yes],
|
||||||
|
[gl_cv_func_frexp_works=no],
|
||||||
|
[case "$host_os" in
|
||||||
|
netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;;
|
||||||
|
mingw*) # Guess yes with MSVC, no with mingw.
|
||||||
|
AC_EGREP_CPP([Good], [
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
Good
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
[gl_cv_func_frexp_works="guessing yes"],
|
||||||
|
[gl_cv_func_frexp_works="guessing no"])
|
||||||
|
;;
|
||||||
|
*) gl_cv_func_frexp_works="guessing yes" ;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
231
m4/frexpl.m4
Normal file
231
m4/frexpl.m4
Normal file
|
@ -0,0 +1,231 @@
|
||||||
|
# frexpl.m4 serial 21
|
||||||
|
dnl Copyright (C) 2007-2018 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_FUNC_FREXPL],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_MATH_H_DEFAULTS])
|
||||||
|
AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
|
||||||
|
|
||||||
|
dnl Persuade glibc <math.h> to declare frexpl().
|
||||||
|
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
||||||
|
|
||||||
|
dnl Check whether it's declared.
|
||||||
|
dnl Mac OS X 10.3 has frexpl() in libc but doesn't declare it in <math.h>.
|
||||||
|
AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [[#include <math.h>]])
|
||||||
|
|
||||||
|
FREXPL_LIBM=
|
||||||
|
if test $HAVE_DECL_FREXPL = 1; then
|
||||||
|
gl_CHECK_FREXPL_NO_LIBM
|
||||||
|
if test $gl_cv_func_frexpl_no_libm = no; then
|
||||||
|
AC_CACHE_CHECK([whether frexpl() can be used with libm],
|
||||||
|
[gl_cv_func_frexpl_in_libm],
|
||||||
|
[
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS -lm"
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
long double x;]],
|
||||||
|
[[int e; return frexpl (x, &e) > 0;]])],
|
||||||
|
[gl_cv_func_frexpl_in_libm=yes],
|
||||||
|
[gl_cv_func_frexpl_in_libm=no])
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
])
|
||||||
|
if test $gl_cv_func_frexpl_in_libm = yes; then
|
||||||
|
FREXPL_LIBM=-lm
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test $gl_cv_func_frexpl_no_libm = yes \
|
||||||
|
|| test $gl_cv_func_frexpl_in_libm = yes; then
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS $FREXPL_LIBM"
|
||||||
|
gl_FUNC_FREXPL_WORKS
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
case "$gl_cv_func_frexpl_works" in
|
||||||
|
*yes) gl_func_frexpl=yes ;;
|
||||||
|
*) gl_func_frexpl=no; REPLACE_FREXPL=1 ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
gl_func_frexpl=no
|
||||||
|
fi
|
||||||
|
if test $gl_func_frexpl = yes; then
|
||||||
|
AC_DEFINE([HAVE_FREXPL], [1],
|
||||||
|
[Define if the frexpl() function is available.])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl = no; then
|
||||||
|
dnl Find libraries needed to link lib/frexpl.c.
|
||||||
|
if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
|
||||||
|
AC_REQUIRE([gl_FUNC_FREXP])
|
||||||
|
FREXPL_LIBM="$FREXP_LIBM"
|
||||||
|
else
|
||||||
|
FREXPL_LIBM=
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AC_SUBST([FREXPL_LIBM])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FUNC_FREXPL_NO_LIBM],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_MATH_H_DEFAULTS])
|
||||||
|
AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
|
||||||
|
dnl Check whether it's declared.
|
||||||
|
dnl Mac OS X 10.3 has frexpl() in libc but doesn't declare it in <math.h>.
|
||||||
|
AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [[#include <math.h>]])
|
||||||
|
if test $HAVE_DECL_FREXPL = 1; then
|
||||||
|
gl_CHECK_FREXPL_NO_LIBM
|
||||||
|
if test $gl_cv_func_frexpl_no_libm = yes; then
|
||||||
|
gl_FUNC_FREXPL_WORKS
|
||||||
|
case "$gl_cv_func_frexpl_works" in
|
||||||
|
*yes) gl_func_frexpl_no_libm=yes ;;
|
||||||
|
*) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
gl_func_frexpl_no_libm=no
|
||||||
|
dnl Set REPLACE_FREXPL here because the system may have frexpl in libm.
|
||||||
|
REPLACE_FREXPL=1
|
||||||
|
fi
|
||||||
|
if test $gl_func_frexpl_no_libm = yes; then
|
||||||
|
AC_DEFINE([HAVE_FREXPL_IN_LIBC], [1],
|
||||||
|
[Define if the frexpl() function is available in libc.])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Test whether frexpl() can be used without linking with libm.
|
||||||
|
dnl Set gl_cv_func_frexpl_no_libm to 'yes' or 'no' accordingly.
|
||||||
|
AC_DEFUN([gl_CHECK_FREXPL_NO_LIBM],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([whether frexpl() can be used without linking with libm],
|
||||||
|
[gl_cv_func_frexpl_no_libm],
|
||||||
|
[
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
long double x;]],
|
||||||
|
[[int e; return frexpl (x, &e) > 0;]])],
|
||||||
|
[gl_cv_func_frexpl_no_libm=yes],
|
||||||
|
[gl_cv_func_frexpl_no_libm=no])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Test whether frexpl() works on finite numbers (this fails on
|
||||||
|
dnl Mac OS X 10.4/PowerPC, on AIX 5.1, and on BeOS), on denormalized numbers
|
||||||
|
dnl (this fails on Mac OS X 10.5/i386), and also on infinite numbers (this
|
||||||
|
dnl fails e.g. on IRIX 6.5 and mingw).
|
||||||
|
AC_DEFUN([gl_FUNC_FREXPL_WORKS],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
||||||
|
AC_CACHE_CHECK([whether frexpl works], [gl_cv_func_frexpl_works],
|
||||||
|
[
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#include <float.h>
|
||||||
|
#include <math.h>
|
||||||
|
/* Override the values of <float.h>, like done in float.in.h. */
|
||||||
|
#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
|
||||||
|
# undef LDBL_MIN_EXP
|
||||||
|
# define LDBL_MIN_EXP (-16381)
|
||||||
|
#endif
|
||||||
|
#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
|
||||||
|
# undef LDBL_MIN_EXP
|
||||||
|
# define LDBL_MIN_EXP (-16381)
|
||||||
|
#endif
|
||||||
|
#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
|
||||||
|
#endif
|
||||||
|
#if defined __sgi && (LDBL_MANT_DIG >= 106)
|
||||||
|
# if defined __GNUC__
|
||||||
|
# undef LDBL_MIN_EXP
|
||||||
|
# define LDBL_MIN_EXP DBL_MIN_EXP
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
extern
|
||||||
|
#ifdef __cplusplus
|
||||||
|
"C"
|
||||||
|
#endif
|
||||||
|
long double frexpl (long double, int *);
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
volatile long double x;
|
||||||
|
/* Test on finite numbers that fails on AIX 5.1. */
|
||||||
|
x = 16.0L;
|
||||||
|
{
|
||||||
|
int exp = -9999;
|
||||||
|
frexpl (x, &exp);
|
||||||
|
if (exp != 5)
|
||||||
|
result |= 1;
|
||||||
|
}
|
||||||
|
/* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
|
||||||
|
function returns an invalid (incorrectly normalized) value: it returns
|
||||||
|
y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
|
||||||
|
but the correct result is
|
||||||
|
0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */
|
||||||
|
x = 1.01L;
|
||||||
|
{
|
||||||
|
int exp = -9999;
|
||||||
|
long double y = frexpl (x, &exp);
|
||||||
|
if (!(exp == 1 && y == 0.505L))
|
||||||
|
result |= 2;
|
||||||
|
}
|
||||||
|
/* Test on large finite numbers. This fails on BeOS at i = 16322, while
|
||||||
|
LDBL_MAX_EXP = 16384.
|
||||||
|
In the loop end test, we test x against Infinity, rather than comparing
|
||||||
|
i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP. */
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
|
||||||
|
{
|
||||||
|
int exp = -9999;
|
||||||
|
frexpl (x, &exp);
|
||||||
|
if (exp != i)
|
||||||
|
{
|
||||||
|
result |= 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Test on denormalized numbers. */
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
|
||||||
|
;
|
||||||
|
if (x > 0.0L)
|
||||||
|
{
|
||||||
|
int exp;
|
||||||
|
long double y = frexpl (x, &exp);
|
||||||
|
/* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
|
||||||
|
exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */
|
||||||
|
if (exp != LDBL_MIN_EXP - 1)
|
||||||
|
result |= 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Test on infinite numbers. */
|
||||||
|
x = 1.0L / 0.0L;
|
||||||
|
{
|
||||||
|
int exp;
|
||||||
|
long double y = frexpl (x, &exp);
|
||||||
|
if (y != x)
|
||||||
|
result |= 16;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}]])],
|
||||||
|
[gl_cv_func_frexpl_works=yes],
|
||||||
|
[gl_cv_func_frexpl_works=no],
|
||||||
|
[
|
||||||
|
changequote(,)dnl
|
||||||
|
case "$host_os" in
|
||||||
|
aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*)
|
||||||
|
gl_cv_func_frexpl_works="guessing no";;
|
||||||
|
*) gl_cv_func_frexpl_works="guessing yes";;
|
||||||
|
esac
|
||||||
|
changequote([,])dnl
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
10
m4/fseterr.m4
Normal file
10
m4/fseterr.m4
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# fseterr.m4 serial 1
|
||||||
|
dnl Copyright (C) 2012-2018 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_FUNC_FSETERR],
|
||||||
|
[
|
||||||
|
AC_CHECK_FUNCS_ONCE([__fseterr])
|
||||||
|
])
|
14
m4/getrusage.m4
Normal file
14
m4/getrusage.m4
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# getrusage.m4 serial 1
|
||||||
|
dnl Copyright (C) 2012-2018 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_FUNC_GETRUSAGE],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_SYS_RESOURCE_H_DEFAULTS])
|
||||||
|
AC_CHECK_FUNCS_ONCE([getrusage])
|
||||||
|
if test $ac_cv_func_getrusage = no; then
|
||||||
|
HAVE_GETRUSAGE=0
|
||||||
|
fi
|
||||||
|
])
|
52
m4/gnulib-cache.m4
Normal file
52
m4/gnulib-cache.m4
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
# Copyright (C) 2002-2018 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 <https://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 --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=autotools --no-conditional-dependencies --libtool --macro-prefix=gl --no-vc-files fprintf-posix getrusage sys_resource sys_time
|
||||||
|
|
||||||
|
# Specification in the form of a few gnulib-tool.m4 macro invocations:
|
||||||
|
gl_LOCAL_DIR([])
|
||||||
|
gl_MODULES([
|
||||||
|
fprintf-posix
|
||||||
|
getrusage
|
||||||
|
sys_resource
|
||||||
|
sys_time
|
||||||
|
])
|
||||||
|
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_LIBTOOL
|
||||||
|
gl_MACRO_PREFIX([gl])
|
||||||
|
gl_PO_DOMAIN([])
|
||||||
|
gl_WITNESS_C_MACRO([])
|
||||||
|
gl_VC_FILES([false])
|
474
m4/gnulib-common.m4
Normal file
474
m4/gnulib-common.m4
Normal file
|
@ -0,0 +1,474 @@
|
||||||
|
# gnulib-common.m4 serial 39
|
||||||
|
dnl Copyright (C) 2007-2018 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
|
||||||
|
|
||||||
|
/* gcc supports the "unused" attribute on possibly unused labels, and
|
||||||
|
g++ has since version 4.5. Note to support C++ as well as C,
|
||||||
|
_GL_UNUSED_LABEL should be used with a trailing ; */
|
||||||
|
#if !defined __cplusplus || __GNUC__ > 4 \
|
||||||
|
|| (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
|
||||||
|
# define _GL_UNUSED_LABEL _GL_UNUSED
|
||||||
|
#else
|
||||||
|
# define _GL_UNUSED_LABEL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 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
|
||||||
|
|
||||||
|
/* The __malloc__ attribute was added in gcc 3. */
|
||||||
|
#if 3 <= __GNUC__
|
||||||
|
# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_MALLOC /* 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
|
||||||
|
# <https://lists.gnu.org/r/bug-gnulib/2011-09/msg00367.html>,
|
||||||
|
# but many more packages use AC_PROG_CC_STDC than AC_PROG_CC_C99
|
||||||
|
# <https://lists.gnu.org/r/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
|
||||||
|
# <https://lists.gnu.org/r/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 and ranlib
|
||||||
|
dnl produce libraries that work only with gcc, not with cc.
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
dnl The '][' hides this use from 'aclocal'.
|
||||||
|
AC_BEFORE([$0], [A][M_PROG_AR])
|
||||||
|
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])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Don't compete with AM_PROG_AR's decision about AR/ARFLAGS if we are not
|
||||||
|
dnl building with __ACK__.
|
||||||
|
if test $gl_cv_c_amsterdam_compiler = yes; then
|
||||||
|
if test -z "$AR"; then
|
||||||
|
AR='cc -c.a'
|
||||||
|
fi
|
||||||
|
if test -z "$ARFLAGS"; then
|
||||||
|
ARFLAGS='-o'
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
dnl AM_PROG_AR was added in automake v1.11.2. AM_PROG_AR does not AC_SUBST
|
||||||
|
dnl ARFLAGS variable (it is filed into Makefile.in directly by automake
|
||||||
|
dnl script on-demand, if not specified by ./configure of course).
|
||||||
|
dnl Don't AC_REQUIRE the AM_PROG_AR otherwise the code for __ACK__ above
|
||||||
|
dnl will be ignored. Also, pay attention to call AM_PROG_AR in else block
|
||||||
|
dnl because AM_PROG_AR is written so it could re-set AR variable even for
|
||||||
|
dnl __ACK__. It may seem like its easier to avoid calling the macro here,
|
||||||
|
dnl but we need to AC_SUBST both AR/ARFLAGS (thus those must have some good
|
||||||
|
dnl default value and automake should usually know them).
|
||||||
|
dnl
|
||||||
|
dnl The '][' hides this use from 'aclocal'.
|
||||||
|
m4_ifdef([A][M_PROG_AR], [A][M_PROG_AR], [:])
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl In case the code above has not helped with setting AR/ARFLAGS, use
|
||||||
|
dnl Automake-documented default values for AR and ARFLAGS, but prefer
|
||||||
|
dnl ${host}-ar over ar (useful for cross-compiling).
|
||||||
|
AC_CHECK_TOOL([AR], [ar], [ar])
|
||||||
|
if test -z "$ARFLAGS"; then
|
||||||
|
ARFLAGS='cr'
|
||||||
|
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.
|
||||||
|
# AC_AUTOCONF_VERSION was introduced in 2.62, so use that as the witness.
|
||||||
|
m4_ifndef([AC_AUTOCONF_VERSION],[
|
||||||
|
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 is copied from post-2.69 Autoconf and overrides the
|
||||||
|
# AC_C_RESTRICT macro from autoconf 2.60..2.69. It can be removed
|
||||||
|
# once autoconf >= 2.70 can be assumed. It's painful to check version
|
||||||
|
# numbers, and in practice this macro is more up-to-date than Autoconf
|
||||||
|
# is, so override Autoconf unconditionally.
|
||||||
|
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 bar (int [$ac_kw]); /* Catch GCC bug 14050. */
|
||||||
|
int bar (int ip[$ac_kw]) { return ip[0]; }
|
||||||
|
]],
|
||||||
|
[[int s[1];
|
||||||
|
int *$ac_kw t = s;
|
||||||
|
t[0] = 0;
|
||||||
|
return foo (t) + bar (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 or
|
||||||
|
__restrict__, even though the corresponding Sun C compiler ends up with
|
||||||
|
"#define restrict _Restrict" or "#define restrict __restrict__" in the
|
||||||
|
previous line. Perhaps some future version of Sun C++ will work with
|
||||||
|
restrict; if so, hopefully it defines __RESTRICT like Sun C does. */
|
||||||
|
#if defined __SUNPRO_CC && !defined __RESTRICT
|
||||||
|
# define _Restrict
|
||||||
|
# define __restrict__
|
||||||
|
#endif])
|
||||||
|
case $ac_cv_c_restrict in
|
||||||
|
restrict) ;;
|
||||||
|
no) AC_DEFINE([restrict], []) ;;
|
||||||
|
*) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
|
||||||
|
esac
|
||||||
|
])# AC_C_RESTRICT
|
||||||
|
|
||||||
|
# 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"
|
||||||
|
])
|
||||||
|
|
||||||
|
# AS_VAR_COPY was added in autoconf 2.63b
|
||||||
|
m4_define_default([AS_VAR_COPY],
|
||||||
|
[AS_LITERAL_IF([$1[]$2], [$1=$$2], [eval $1=\$$2])])
|
||||||
|
|
||||||
|
# AC_PROG_SED was added in autoconf 2.59b
|
||||||
|
m4_ifndef([AC_PROG_SED],
|
||||||
|
[AC_DEFUN([AC_PROG_SED],
|
||||||
|
[AC_CACHE_CHECK([for a sed that does not truncate output], ac_cv_path_SED,
|
||||||
|
[dnl ac_script should not contain more than 99 commands (for HP-UX sed),
|
||||||
|
dnl but more than about 7000 bytes, to catch a limit in Solaris 8 /usr/ucb/sed.
|
||||||
|
ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
|
||||||
|
for ac_i in 1 2 3 4 5 6 7; do
|
||||||
|
ac_script="$ac_script$as_nl$ac_script"
|
||||||
|
done
|
||||||
|
echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
|
||||||
|
AS_UNSET([ac_script])
|
||||||
|
if test -z "$SED"; then
|
||||||
|
ac_path_SED_found=false
|
||||||
|
_AS_PATH_WALK([], [
|
||||||
|
for ac_prog in sed gsed; do
|
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do
|
||||||
|
ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
|
||||||
|
AS_EXECUTABLE_P(["$ac_path_SED"]) || continue
|
||||||
|
case `"$ac_path_SED" --version 2>&1` in
|
||||||
|
*GNU*) ac_cv_path_SED=$ac_path_SED ac_path_SED_found=:;;
|
||||||
|
*)
|
||||||
|
ac_count=0
|
||||||
|
_AS_ECHO_N([0123456789]) >conftest.in
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
cat conftest.in conftest.in >conftest.tmp
|
||||||
|
mv conftest.tmp conftest.in
|
||||||
|
cp conftest.in conftest.nl
|
||||||
|
echo >> conftest.nl
|
||||||
|
"$ac_path_SED" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
|
||||||
|
diff conftest.out conftest.nl >/dev/null 2>&1 || break
|
||||||
|
ac_count=`expr $ac_count + 1`
|
||||||
|
if test $ac_count -gt ${ac_path_SED_max-0}; then
|
||||||
|
# Best so far, but keep looking for better
|
||||||
|
ac_cv_path_SED=$ac_path_SED
|
||||||
|
ac_path_SED_max=$ac_count
|
||||||
|
fi
|
||||||
|
test $ac_count -gt 10 && break
|
||||||
|
done
|
||||||
|
rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
|
||||||
|
esac
|
||||||
|
$ac_path_SED_found && break 3
|
||||||
|
done
|
||||||
|
done])
|
||||||
|
if test -z "$ac_cv_path_SED"; then
|
||||||
|
AC_ERROR([no acceptable sed could be found in \$PATH])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
ac_cv_path_SED=$SED
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
SED="$ac_cv_path_SED"
|
||||||
|
AC_SUBST([SED])dnl
|
||||||
|
rm -f conftest.sed
|
||||||
|
])
|
||||||
|
])
|
428
m4/gnulib-comp.m4
Normal file
428
m4/gnulib-comp.m4
Normal file
|
@ -0,0 +1,428 @@
|
||||||
|
# DO NOT EDIT! GENERATED AUTOMATICALLY!
|
||||||
|
# Copyright (C) 2002-2018 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 <https://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
|
||||||
|
|
||||||
|
# Pre-early section.
|
||||||
|
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
||||||
|
AC_REQUIRE([gl_PROG_AR_RANLIB])
|
||||||
|
|
||||||
|
# Code from module absolute-header:
|
||||||
|
# Code from module alloca-opt:
|
||||||
|
# Code from module errno:
|
||||||
|
# Code from module extensions:
|
||||||
|
# Code from module extern-inline:
|
||||||
|
# Code from module float:
|
||||||
|
# Code from module fpieee:
|
||||||
|
AC_REQUIRE([gl_FP_IEEE])
|
||||||
|
# Code from module fprintf-posix:
|
||||||
|
# Code from module fpucw:
|
||||||
|
# Code from module frexp-nolibm:
|
||||||
|
# Code from module frexpl-nolibm:
|
||||||
|
# Code from module fseterr:
|
||||||
|
# Code from module getrusage:
|
||||||
|
# Code from module include_next:
|
||||||
|
# Code from module isnand-nolibm:
|
||||||
|
# Code from module isnanf-nolibm:
|
||||||
|
# Code from module isnanl-nolibm:
|
||||||
|
# Code from module limits-h:
|
||||||
|
# Code from module math:
|
||||||
|
# Code from module memchr:
|
||||||
|
# Code from module multiarch:
|
||||||
|
# Code from module nocrash:
|
||||||
|
# Code from module printf-frexp:
|
||||||
|
# Code from module printf-frexpl:
|
||||||
|
# Code from module printf-safe:
|
||||||
|
# Code from module signbit:
|
||||||
|
# Code from module size_max:
|
||||||
|
# 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 stddef:
|
||||||
|
# Code from module stdint:
|
||||||
|
# Code from module stdio:
|
||||||
|
# Code from module string:
|
||||||
|
# Code from module sys_resource:
|
||||||
|
# Code from module sys_time:
|
||||||
|
# Code from module sys_types:
|
||||||
|
# Code from module vasnprintf:
|
||||||
|
# Code from module verify:
|
||||||
|
# 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], [true])
|
||||||
|
gl_cond_libtool=true
|
||||||
|
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_HEADER_ERRNO_H
|
||||||
|
AC_REQUIRE([gl_EXTERN_INLINE])
|
||||||
|
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_FPRINTF_POSIX
|
||||||
|
gl_STDIO_MODULE_INDICATOR([fprintf-posix])
|
||||||
|
gl_FUNC_FREXP_NO_LIBM
|
||||||
|
if test $gl_func_frexp_no_libm != yes; then
|
||||||
|
AC_LIBOBJ([frexp])
|
||||||
|
fi
|
||||||
|
gl_MATH_MODULE_INDICATOR([frexp])
|
||||||
|
gl_FUNC_FREXPL_NO_LIBM
|
||||||
|
if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl_no_libm = no; then
|
||||||
|
AC_LIBOBJ([frexpl])
|
||||||
|
fi
|
||||||
|
gl_MATH_MODULE_INDICATOR([frexpl])
|
||||||
|
gl_FUNC_FSETERR
|
||||||
|
if test $ac_cv_func___fseterr = no; then
|
||||||
|
AC_LIBOBJ([fseterr])
|
||||||
|
fi
|
||||||
|
gl_FUNC_GETRUSAGE
|
||||||
|
if test $HAVE_GETRUSAGE = 0; then
|
||||||
|
AC_LIBOBJ([getrusage])
|
||||||
|
fi
|
||||||
|
gl_SYS_RESOURCE_MODULE_INDICATOR([getrusage])
|
||||||
|
gl_FUNC_ISNAND_NO_LIBM
|
||||||
|
if test $gl_func_isnand_no_libm != yes; then
|
||||||
|
AC_LIBOBJ([isnand])
|
||||||
|
gl_PREREQ_ISNAND
|
||||||
|
fi
|
||||||
|
gl_FUNC_ISNANF_NO_LIBM
|
||||||
|
if test $gl_func_isnanf_no_libm != yes; then
|
||||||
|
AC_LIBOBJ([isnanf])
|
||||||
|
gl_PREREQ_ISNANF
|
||||||
|
fi
|
||||||
|
gl_FUNC_ISNANL_NO_LIBM
|
||||||
|
if test $gl_func_isnanl_no_libm != yes; then
|
||||||
|
AC_LIBOBJ([isnanl])
|
||||||
|
gl_PREREQ_ISNANL
|
||||||
|
fi
|
||||||
|
gl_LIMITS_H
|
||||||
|
gl_MATH_H
|
||||||
|
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_MULTIARCH
|
||||||
|
gl_FUNC_PRINTF_FREXP
|
||||||
|
gl_FUNC_PRINTF_FREXPL
|
||||||
|
m4_divert_text([INIT_PREPARE], [gl_printf_safe=yes])
|
||||||
|
gl_SIGNBIT
|
||||||
|
if test $REPLACE_SIGNBIT = 1; then
|
||||||
|
AC_LIBOBJ([signbitf])
|
||||||
|
AC_LIBOBJ([signbitd])
|
||||||
|
AC_LIBOBJ([signbitl])
|
||||||
|
fi
|
||||||
|
gl_MATH_MODULE_INDICATOR([signbit])
|
||||||
|
gl_SIZE_MAX
|
||||||
|
gt_TYPE_SSIZE_T
|
||||||
|
gl_STDDEF_H
|
||||||
|
gl_STDINT_H
|
||||||
|
gl_STDIO_H
|
||||||
|
gl_HEADER_STRING_H
|
||||||
|
gl_HEADER_SYS_RESOURCE
|
||||||
|
AC_PROG_MKDIR_P
|
||||||
|
gl_HEADER_SYS_TIME_H
|
||||||
|
AC_PROG_MKDIR_P
|
||||||
|
gl_SYS_TYPES_H
|
||||||
|
AC_PROG_MKDIR_P
|
||||||
|
gl_FUNC_VASNPRINTF
|
||||||
|
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])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
# 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], [
|
||||||
|
lib/alloca.in.h
|
||||||
|
lib/arg-nonnull.h
|
||||||
|
lib/asnprintf.c
|
||||||
|
lib/c++defs.h
|
||||||
|
lib/errno.in.h
|
||||||
|
lib/float+.h
|
||||||
|
lib/float.c
|
||||||
|
lib/float.in.h
|
||||||
|
lib/fprintf.c
|
||||||
|
lib/fpucw.h
|
||||||
|
lib/frexp.c
|
||||||
|
lib/frexpl.c
|
||||||
|
lib/fseterr.c
|
||||||
|
lib/fseterr.h
|
||||||
|
lib/getrusage.c
|
||||||
|
lib/isnan.c
|
||||||
|
lib/isnand-nolibm.h
|
||||||
|
lib/isnand.c
|
||||||
|
lib/isnanf-nolibm.h
|
||||||
|
lib/isnanf.c
|
||||||
|
lib/isnanl-nolibm.h
|
||||||
|
lib/isnanl.c
|
||||||
|
lib/itold.c
|
||||||
|
lib/limits.in.h
|
||||||
|
lib/math.c
|
||||||
|
lib/math.in.h
|
||||||
|
lib/memchr.c
|
||||||
|
lib/memchr.valgrind
|
||||||
|
lib/printf-args.c
|
||||||
|
lib/printf-args.h
|
||||||
|
lib/printf-frexp.c
|
||||||
|
lib/printf-frexp.h
|
||||||
|
lib/printf-frexpl.c
|
||||||
|
lib/printf-frexpl.h
|
||||||
|
lib/printf-parse.c
|
||||||
|
lib/printf-parse.h
|
||||||
|
lib/signbitd.c
|
||||||
|
lib/signbitf.c
|
||||||
|
lib/signbitl.c
|
||||||
|
lib/size_max.h
|
||||||
|
lib/stddef.in.h
|
||||||
|
lib/stdint.in.h
|
||||||
|
lib/stdio-impl.h
|
||||||
|
lib/stdio.in.h
|
||||||
|
lib/string.in.h
|
||||||
|
lib/sys_resource.in.h
|
||||||
|
lib/sys_time.in.h
|
||||||
|
lib/sys_types.in.h
|
||||||
|
lib/vasnprintf.c
|
||||||
|
lib/vasnprintf.h
|
||||||
|
lib/verify.h
|
||||||
|
lib/warn-on-use.h
|
||||||
|
lib/wchar.in.h
|
||||||
|
lib/xsize.c
|
||||||
|
lib/xsize.h
|
||||||
|
m4/00gnulib.m4
|
||||||
|
m4/absolute-header.m4
|
||||||
|
m4/alloca.m4
|
||||||
|
m4/errno_h.m4
|
||||||
|
m4/exponentd.m4
|
||||||
|
m4/exponentf.m4
|
||||||
|
m4/exponentl.m4
|
||||||
|
m4/extensions.m4
|
||||||
|
m4/extern-inline.m4
|
||||||
|
m4/float_h.m4
|
||||||
|
m4/fpieee.m4
|
||||||
|
m4/fprintf-posix.m4
|
||||||
|
m4/frexp.m4
|
||||||
|
m4/frexpl.m4
|
||||||
|
m4/fseterr.m4
|
||||||
|
m4/getrusage.m4
|
||||||
|
m4/gnulib-common.m4
|
||||||
|
m4/include_next.m4
|
||||||
|
m4/intmax_t.m4
|
||||||
|
m4/inttypes_h.m4
|
||||||
|
m4/isnand.m4
|
||||||
|
m4/isnanf.m4
|
||||||
|
m4/isnanl.m4
|
||||||
|
m4/ldexpl.m4
|
||||||
|
m4/limits-h.m4
|
||||||
|
m4/longlong.m4
|
||||||
|
m4/math_h.m4
|
||||||
|
m4/memchr.m4
|
||||||
|
m4/mmap-anon.m4
|
||||||
|
m4/multiarch.m4
|
||||||
|
m4/nocrash.m4
|
||||||
|
m4/off_t.m4
|
||||||
|
m4/printf-frexp.m4
|
||||||
|
m4/printf-frexpl.m4
|
||||||
|
m4/printf.m4
|
||||||
|
m4/signbit.m4
|
||||||
|
m4/size_max.m4
|
||||||
|
m4/ssize_t.m4
|
||||||
|
m4/stddef_h.m4
|
||||||
|
m4/stdint.m4
|
||||||
|
m4/stdint_h.m4
|
||||||
|
m4/stdio_h.m4
|
||||||
|
m4/string_h.m4
|
||||||
|
m4/sys_resource_h.m4
|
||||||
|
m4/sys_socket_h.m4
|
||||||
|
m4/sys_time_h.m4
|
||||||
|
m4/sys_types_h.m4
|
||||||
|
m4/vasnprintf.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-2018 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], [])
|
224
m4/include_next.m4
Normal file
224
m4/include_next.m4
Normal file
|
@ -0,0 +1,224 @@
|
||||||
|
# include_next.m4 serial 24
|
||||||
|
dnl Copyright (C) 2006-2018 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, INCLUDE_NEXT_AS_FIRST_DIRECTIVE, PRAGMA_SYSTEM_HEADER,
|
||||||
|
dnl and PRAGMA_COLUMNS.
|
||||||
|
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])
|
||||||
|
])
|
||||||
|
gl_ABSOLUTE_HEADER_ONE(gl_HEADER_NAME)
|
||||||
|
AS_VAR_COPY([gl_header], [gl_cv_absolute_]AS_TR_SH(gl_HEADER_NAME))
|
||||||
|
AS_VAR_SET(gl_next_header, ['"'$gl_header'"'])
|
||||||
|
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-2018 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-2018 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
|
||||||
|
])
|
96
m4/isnand.m4
Normal file
96
m4/isnand.m4
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
# isnand.m4 serial 11
|
||||||
|
dnl Copyright (C) 2007-2018 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 how to get or define isnand().
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FUNC_ISNAND],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_MATH_H_DEFAULTS])
|
||||||
|
ISNAND_LIBM=
|
||||||
|
gl_HAVE_ISNAND_NO_LIBM
|
||||||
|
if test $gl_cv_func_isnand_no_libm = no; then
|
||||||
|
gl_HAVE_ISNAND_IN_LIBM
|
||||||
|
if test $gl_cv_func_isnand_in_libm = yes; then
|
||||||
|
ISNAND_LIBM=-lm
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
dnl The variable gl_func_isnand set here is used by isnan.m4.
|
||||||
|
if test $gl_cv_func_isnand_no_libm = yes \
|
||||||
|
|| test $gl_cv_func_isnand_in_libm = yes; then
|
||||||
|
gl_func_isnand=yes
|
||||||
|
else
|
||||||
|
gl_func_isnand=no
|
||||||
|
HAVE_ISNAND=0
|
||||||
|
fi
|
||||||
|
AC_SUBST([ISNAND_LIBM])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Check how to get or define isnand() without linking with libm.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FUNC_ISNAND_NO_LIBM],
|
||||||
|
[
|
||||||
|
gl_HAVE_ISNAND_NO_LIBM
|
||||||
|
gl_func_isnand_no_libm=$gl_cv_func_isnand_no_libm
|
||||||
|
if test $gl_cv_func_isnand_no_libm = yes; then
|
||||||
|
AC_DEFINE([HAVE_ISNAND_IN_LIBC], [1],
|
||||||
|
[Define if the isnan(double) function is available in libc.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Prerequisites of replacement isnand definition. It does not need -lm.
|
||||||
|
AC_DEFUN([gl_PREREQ_ISNAND],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_DOUBLE_EXPONENT_LOCATION])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Test whether isnand() can be used with libm.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_HAVE_ISNAND_IN_LIBM],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([whether isnan(double) can be used with libm],
|
||||||
|
[gl_cv_func_isnand_in_libm],
|
||||||
|
[
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS -lm"
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
#if __GNUC__ >= 4
|
||||||
|
# undef isnand
|
||||||
|
# define isnand(x) __builtin_isnan ((double)(x))
|
||||||
|
#elif defined isnan
|
||||||
|
# undef isnand
|
||||||
|
# define isnand(x) isnan ((double)(x))
|
||||||
|
#endif
|
||||||
|
double x;]],
|
||||||
|
[[return isnand (x);]])],
|
||||||
|
[gl_cv_func_isnand_in_libm=yes],
|
||||||
|
[gl_cv_func_isnand_in_libm=no])
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_HAVE_ISNAND_NO_LIBM],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([whether isnan(double) can be used without linking with libm],
|
||||||
|
[gl_cv_func_isnand_no_libm],
|
||||||
|
[
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
#if __GNUC__ >= 4
|
||||||
|
# undef isnand
|
||||||
|
# define isnand(x) __builtin_isnan ((double)(x))
|
||||||
|
#else
|
||||||
|
# undef isnand
|
||||||
|
# define isnand(x) isnan ((double)(x))
|
||||||
|
#endif
|
||||||
|
double x;]],
|
||||||
|
[[return isnand (x);]])],
|
||||||
|
[gl_cv_func_isnand_no_libm=yes],
|
||||||
|
[gl_cv_func_isnand_no_libm=no])
|
||||||
|
])
|
||||||
|
])
|
197
m4/isnanf.m4
Normal file
197
m4/isnanf.m4
Normal file
|
@ -0,0 +1,197 @@
|
||||||
|
# isnanf.m4 serial 15
|
||||||
|
dnl Copyright (C) 2007-2018 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 how to get or define isnanf().
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FUNC_ISNANF],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_MATH_H_DEFAULTS])
|
||||||
|
ISNANF_LIBM=
|
||||||
|
gl_HAVE_ISNANF_NO_LIBM
|
||||||
|
if test $gl_cv_func_isnanf_no_libm = no; then
|
||||||
|
gl_HAVE_ISNANF_IN_LIBM
|
||||||
|
if test $gl_cv_func_isnanf_in_libm = yes; then
|
||||||
|
ISNANF_LIBM=-lm
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
dnl The variable gl_func_isnanf set here is used by isnan.m4.
|
||||||
|
if test $gl_cv_func_isnanf_no_libm = yes \
|
||||||
|
|| test $gl_cv_func_isnanf_in_libm = yes; then
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS $ISNANF_LIBM"
|
||||||
|
gl_ISNANF_WORKS
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
case "$gl_cv_func_isnanf_works" in
|
||||||
|
*yes) gl_func_isnanf=yes ;;
|
||||||
|
*) gl_func_isnanf=no; ISNANF_LIBM= ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
gl_func_isnanf=no
|
||||||
|
fi
|
||||||
|
if test $gl_func_isnanf != yes; then
|
||||||
|
HAVE_ISNANF=0
|
||||||
|
fi
|
||||||
|
AC_SUBST([ISNANF_LIBM])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Check how to get or define isnanf() without linking with libm.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FUNC_ISNANF_NO_LIBM],
|
||||||
|
[
|
||||||
|
gl_HAVE_ISNANF_NO_LIBM
|
||||||
|
if test $gl_cv_func_isnanf_no_libm = yes; then
|
||||||
|
gl_ISNANF_WORKS
|
||||||
|
fi
|
||||||
|
if test $gl_cv_func_isnanf_no_libm = yes \
|
||||||
|
&& { case "$gl_cv_func_isnanf_works" in
|
||||||
|
*yes) true;;
|
||||||
|
*) false;;
|
||||||
|
esac
|
||||||
|
}; then
|
||||||
|
gl_func_isnanf_no_libm=yes
|
||||||
|
AC_DEFINE([HAVE_ISNANF_IN_LIBC], [1],
|
||||||
|
[Define if the isnan(float) function is available in libc.])
|
||||||
|
else
|
||||||
|
gl_func_isnanf_no_libm=no
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Prerequisites of replacement isnanf definition. It does not need -lm.
|
||||||
|
AC_DEFUN([gl_PREREQ_ISNANF],
|
||||||
|
[
|
||||||
|
gl_FLOAT_EXPONENT_LOCATION
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Test whether isnanf() can be used without libm.
|
||||||
|
AC_DEFUN([gl_HAVE_ISNANF_NO_LIBM],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([whether isnan(float) can be used without linking with libm],
|
||||||
|
[gl_cv_func_isnanf_no_libm],
|
||||||
|
[
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
#if __GNUC__ >= 4
|
||||||
|
# undef isnanf
|
||||||
|
# define isnanf(x) __builtin_isnanf ((float)(x))
|
||||||
|
#elif defined isnan
|
||||||
|
# undef isnanf
|
||||||
|
# define isnanf(x) isnan ((float)(x))
|
||||||
|
#endif
|
||||||
|
float x;]],
|
||||||
|
[[return isnanf (x);]])],
|
||||||
|
[gl_cv_func_isnanf_no_libm=yes],
|
||||||
|
[gl_cv_func_isnanf_no_libm=no])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Test whether isnanf() can be used with libm.
|
||||||
|
AC_DEFUN([gl_HAVE_ISNANF_IN_LIBM],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([whether isnan(float) can be used with libm],
|
||||||
|
[gl_cv_func_isnanf_in_libm],
|
||||||
|
[
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS -lm"
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
#if __GNUC__ >= 4
|
||||||
|
# undef isnanf
|
||||||
|
# define isnanf(x) __builtin_isnanf ((float)(x))
|
||||||
|
#elif defined isnan
|
||||||
|
# undef isnanf
|
||||||
|
# define isnanf(x) isnan ((float)(x))
|
||||||
|
#endif
|
||||||
|
float x;]],
|
||||||
|
[[return isnanf (x);]])],
|
||||||
|
[gl_cv_func_isnanf_in_libm=yes],
|
||||||
|
[gl_cv_func_isnanf_in_libm=no])
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Test whether isnanf() rejects Infinity (this fails on Solaris 2.5.1),
|
||||||
|
dnl recognizes a NaN (this fails on IRIX 6.5 with cc), and recognizes a NaN
|
||||||
|
dnl with in-memory representation 0x7fbfffff (this fails on IRIX 6.5).
|
||||||
|
AC_DEFUN([gl_ISNANF_WORKS],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
||||||
|
AC_REQUIRE([gl_FLOAT_EXPONENT_LOCATION])
|
||||||
|
AC_CACHE_CHECK([whether isnan(float) works], [gl_cv_func_isnanf_works],
|
||||||
|
[
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#include <math.h>
|
||||||
|
#if __GNUC__ >= 4
|
||||||
|
# undef isnanf
|
||||||
|
# define isnanf(x) __builtin_isnanf ((float)(x))
|
||||||
|
#elif defined isnan
|
||||||
|
# undef isnanf
|
||||||
|
# define isnanf(x) isnan ((float)(x))
|
||||||
|
#endif
|
||||||
|
/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */
|
||||||
|
#ifdef __DECC
|
||||||
|
static float
|
||||||
|
NaN ()
|
||||||
|
{
|
||||||
|
static float zero = 0.0f;
|
||||||
|
return zero / zero;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define NaN() (0.0f / 0.0f)
|
||||||
|
#endif
|
||||||
|
#define NWORDS \
|
||||||
|
((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
|
||||||
|
typedef union { unsigned int word[NWORDS]; float value; } memory_float;
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
if (isnanf (1.0f / 0.0f))
|
||||||
|
result |= 1;
|
||||||
|
|
||||||
|
if (!isnanf (NaN ()))
|
||||||
|
result |= 2;
|
||||||
|
|
||||||
|
#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
|
||||||
|
/* The isnanf function should be immune against changes in the sign bit and
|
||||||
|
in the mantissa bits. The xor operation twiddles a bit that can only be
|
||||||
|
a sign bit or a mantissa bit. */
|
||||||
|
if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0)
|
||||||
|
{
|
||||||
|
memory_float m;
|
||||||
|
|
||||||
|
m.value = NaN ();
|
||||||
|
/* Set the bits below the exponent to 01111...111. */
|
||||||
|
m.word[0] &= -1U << FLT_EXPBIT0_BIT;
|
||||||
|
m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1;
|
||||||
|
if (!isnanf (m.value))
|
||||||
|
result |= 4;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}]])],
|
||||||
|
[gl_cv_func_isnanf_works=yes],
|
||||||
|
[gl_cv_func_isnanf_works=no],
|
||||||
|
[case "$host_os" in
|
||||||
|
irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;;
|
||||||
|
mingw*) # Guess yes on mingw, no on MSVC.
|
||||||
|
AC_EGREP_CPP([Known], [
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
Known
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
[gl_cv_func_isnanf_works="guessing yes"],
|
||||||
|
[gl_cv_func_isnanf_works="guessing no"])
|
||||||
|
;;
|
||||||
|
*) gl_cv_func_isnanf_works="guessing yes" ;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
248
m4/isnanl.m4
Normal file
248
m4/isnanl.m4
Normal file
|
@ -0,0 +1,248 @@
|
||||||
|
# isnanl.m4 serial 20
|
||||||
|
dnl Copyright (C) 2007-2018 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_FUNC_ISNANL],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_MATH_H_DEFAULTS])
|
||||||
|
ISNANL_LIBM=
|
||||||
|
gl_HAVE_ISNANL_NO_LIBM
|
||||||
|
if test $gl_cv_func_isnanl_no_libm = no; then
|
||||||
|
gl_HAVE_ISNANL_IN_LIBM
|
||||||
|
if test $gl_cv_func_isnanl_in_libm = yes; then
|
||||||
|
ISNANL_LIBM=-lm
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
dnl The variable gl_func_isnanl set here is used by isnan.m4.
|
||||||
|
if test $gl_cv_func_isnanl_no_libm = yes \
|
||||||
|
|| test $gl_cv_func_isnanl_in_libm = yes; then
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS $ISNANL_LIBM"
|
||||||
|
gl_FUNC_ISNANL_WORKS
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
case "$gl_cv_func_isnanl_works" in
|
||||||
|
*yes) gl_func_isnanl=yes ;;
|
||||||
|
*) gl_func_isnanl=no; ISNANL_LIBM= ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
gl_func_isnanl=no
|
||||||
|
fi
|
||||||
|
if test $gl_func_isnanl != yes; then
|
||||||
|
HAVE_ISNANL=0
|
||||||
|
fi
|
||||||
|
AC_SUBST([ISNANL_LIBM])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FUNC_ISNANL_NO_LIBM],
|
||||||
|
[
|
||||||
|
gl_HAVE_ISNANL_NO_LIBM
|
||||||
|
gl_func_isnanl_no_libm=$gl_cv_func_isnanl_no_libm
|
||||||
|
if test $gl_func_isnanl_no_libm = yes; then
|
||||||
|
gl_FUNC_ISNANL_WORKS
|
||||||
|
case "$gl_cv_func_isnanl_works" in
|
||||||
|
*yes) ;;
|
||||||
|
*) gl_func_isnanl_no_libm=no ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if test $gl_func_isnanl_no_libm = yes; then
|
||||||
|
AC_DEFINE([HAVE_ISNANL_IN_LIBC], [1],
|
||||||
|
[Define if the isnan(long double) function is available in libc.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Prerequisites of replacement isnanl definition. It does not need -lm.
|
||||||
|
AC_DEFUN([gl_PREREQ_ISNANL],
|
||||||
|
[
|
||||||
|
gl_LONG_DOUBLE_EXPONENT_LOCATION
|
||||||
|
AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Test whether isnanl() can be used without libm.
|
||||||
|
AC_DEFUN([gl_HAVE_ISNANL_NO_LIBM],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([whether isnan(long double) can be used without linking with libm],
|
||||||
|
[gl_cv_func_isnanl_no_libm],
|
||||||
|
[
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
#if __GNUC__ >= 4
|
||||||
|
# undef isnanl
|
||||||
|
# define isnanl(x) __builtin_isnanl ((long double)(x))
|
||||||
|
#elif defined isnan
|
||||||
|
# undef isnanl
|
||||||
|
# define isnanl(x) isnan ((long double)(x))
|
||||||
|
#endif
|
||||||
|
long double x;]],
|
||||||
|
[[return isnanl (x);]])],
|
||||||
|
[gl_cv_func_isnanl_no_libm=yes],
|
||||||
|
[gl_cv_func_isnanl_no_libm=no])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Test whether isnanl() can be used with libm.
|
||||||
|
AC_DEFUN([gl_HAVE_ISNANL_IN_LIBM],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([whether isnan(long double) can be used with libm],
|
||||||
|
[gl_cv_func_isnanl_in_libm],
|
||||||
|
[
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS -lm"
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
#if __GNUC__ >= 4
|
||||||
|
# undef isnanl
|
||||||
|
# define isnanl(x) __builtin_isnanl ((long double)(x))
|
||||||
|
#elif defined isnan
|
||||||
|
# undef isnanl
|
||||||
|
# define isnanl(x) isnan ((long double)(x))
|
||||||
|
#endif
|
||||||
|
long double x;]],
|
||||||
|
[[return isnanl (x);]])],
|
||||||
|
[gl_cv_func_isnanl_in_libm=yes],
|
||||||
|
[gl_cv_func_isnanl_in_libm=no])
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Test whether isnanl() recognizes all canonical numbers which are neither
|
||||||
|
dnl finite nor infinite.
|
||||||
|
AC_DEFUN([gl_FUNC_ISNANL_WORKS],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_REQUIRE([gl_BIGENDIAN])
|
||||||
|
AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
||||||
|
AC_CACHE_CHECK([whether isnanl works], [gl_cv_func_isnanl_works],
|
||||||
|
[
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#include <float.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <math.h>
|
||||||
|
#if __GNUC__ >= 4
|
||||||
|
# undef isnanl
|
||||||
|
# define isnanl(x) __builtin_isnanl ((long double)(x))
|
||||||
|
#elif defined isnan
|
||||||
|
# undef isnanl
|
||||||
|
# define isnanl(x) isnan ((long double)(x))
|
||||||
|
#endif
|
||||||
|
#define NWORDS \
|
||||||
|
((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
|
||||||
|
typedef union { unsigned int word[NWORDS]; long double value; }
|
||||||
|
memory_long_double;
|
||||||
|
/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
|
||||||
|
runtime type conversion. */
|
||||||
|
#ifdef __sgi
|
||||||
|
static long double NaNl ()
|
||||||
|
{
|
||||||
|
double zero = 0.0;
|
||||||
|
return zero / zero;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define NaNl() (0.0L / 0.0L)
|
||||||
|
#endif
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
if (!isnanl (NaNl ()))
|
||||||
|
result |= 1;
|
||||||
|
|
||||||
|
{
|
||||||
|
memory_long_double m;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
/* The isnanl function should be immune against changes in the sign bit and
|
||||||
|
in the mantissa bits. The xor operation twiddles a bit that can only be
|
||||||
|
a sign bit or a mantissa bit (since the exponent never extends to
|
||||||
|
bit 31). */
|
||||||
|
m.value = NaNl ();
|
||||||
|
m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
|
||||||
|
for (i = 0; i < NWORDS; i++)
|
||||||
|
m.word[i] |= 1;
|
||||||
|
if (!isnanl (m.value))
|
||||||
|
result |= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
|
||||||
|
/* Representation of an 80-bit 'long double' as an initializer for a sequence
|
||||||
|
of 'unsigned int' words. */
|
||||||
|
# ifdef WORDS_BIGENDIAN
|
||||||
|
# define LDBL80_WORDS(exponent,manthi,mantlo) \
|
||||||
|
{ ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
|
||||||
|
((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \
|
||||||
|
(unsigned int) (mantlo) << 16 \
|
||||||
|
}
|
||||||
|
# else
|
||||||
|
# define LDBL80_WORDS(exponent,manthi,mantlo) \
|
||||||
|
{ mantlo, manthi, exponent }
|
||||||
|
# endif
|
||||||
|
{ /* Quiet NaN. */
|
||||||
|
static memory_long_double x =
|
||||||
|
{ LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
|
||||||
|
if (!isnanl (x.value))
|
||||||
|
result |= 2;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
/* Signalling NaN. */
|
||||||
|
static memory_long_double x =
|
||||||
|
{ LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
|
||||||
|
if (!isnanl (x.value))
|
||||||
|
result |= 2;
|
||||||
|
}
|
||||||
|
/* isnanl should return something even for noncanonical values. */
|
||||||
|
{ /* Pseudo-NaN. */
|
||||||
|
static memory_long_double x =
|
||||||
|
{ LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
|
||||||
|
if (isnanl (x.value) && !isnanl (x.value))
|
||||||
|
result |= 4;
|
||||||
|
}
|
||||||
|
{ /* Pseudo-Infinity. */
|
||||||
|
static memory_long_double x =
|
||||||
|
{ LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
|
||||||
|
if (isnanl (x.value) && !isnanl (x.value))
|
||||||
|
result |= 8;
|
||||||
|
}
|
||||||
|
{ /* Pseudo-Zero. */
|
||||||
|
static memory_long_double x =
|
||||||
|
{ LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
|
||||||
|
if (isnanl (x.value) && !isnanl (x.value))
|
||||||
|
result |= 16;
|
||||||
|
}
|
||||||
|
{ /* Unnormalized number. */
|
||||||
|
static memory_long_double x =
|
||||||
|
{ LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
|
||||||
|
if (isnanl (x.value) && !isnanl (x.value))
|
||||||
|
result |= 32;
|
||||||
|
}
|
||||||
|
{ /* Pseudo-Denormal. */
|
||||||
|
static memory_long_double x =
|
||||||
|
{ LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
|
||||||
|
if (isnanl (x.value) && !isnanl (x.value))
|
||||||
|
result |= 64;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}]])],
|
||||||
|
[gl_cv_func_isnanl_works=yes],
|
||||||
|
[gl_cv_func_isnanl_works=no],
|
||||||
|
[case "$host_os" in
|
||||||
|
mingw*) # Guess yes on mingw, no on MSVC.
|
||||||
|
AC_EGREP_CPP([Known], [
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
Known
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
[gl_cv_func_isnanl_works="guessing yes"],
|
||||||
|
[gl_cv_func_isnanl_works="guessing no"])
|
||||||
|
;;
|
||||||
|
*) gl_cv_func_isnanl_works="guessing yes" ;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
135
m4/ldexpl.m4
Normal file
135
m4/ldexpl.m4
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
# ldexpl.m4 serial 17
|
||||||
|
dnl Copyright (C) 2007-2018 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_FUNC_LDEXPL],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_MATH_H_DEFAULTS])
|
||||||
|
AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
|
||||||
|
AC_REQUIRE([gl_FUNC_ISNANL]) dnl for ISNANL_LIBM
|
||||||
|
|
||||||
|
dnl Persuade glibc <math.h> to declare ldexpl().
|
||||||
|
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
||||||
|
|
||||||
|
dnl Check whether it's declared.
|
||||||
|
dnl Mac OS X 10.3 has ldexpl() in libc but doesn't declare it in <math.h>.
|
||||||
|
AC_CHECK_DECL([ldexpl], , [HAVE_DECL_LDEXPL=0], [[#include <math.h>]])
|
||||||
|
|
||||||
|
LDEXPL_LIBM=
|
||||||
|
if test $HAVE_DECL_LDEXPL = 1; then
|
||||||
|
gl_CHECK_LDEXPL_NO_LIBM
|
||||||
|
if test $gl_cv_func_ldexpl_no_libm = no; then
|
||||||
|
AC_CACHE_CHECK([whether ldexpl() can be used with libm],
|
||||||
|
[gl_cv_func_ldexpl_in_libm],
|
||||||
|
[
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS -lm"
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
long double x;]],
|
||||||
|
[[return ldexpl (x, -1) > 0;]])],
|
||||||
|
[gl_cv_func_ldexpl_in_libm=yes],
|
||||||
|
[gl_cv_func_ldexpl_in_libm=no])
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
])
|
||||||
|
if test $gl_cv_func_ldexpl_in_libm = yes; then
|
||||||
|
LDEXPL_LIBM=-lm
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test $gl_cv_func_ldexpl_no_libm = yes \
|
||||||
|
|| test $gl_cv_func_ldexpl_in_libm = yes; then
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS $LDEXPL_LIBM"
|
||||||
|
gl_FUNC_LDEXPL_WORKS
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
case "$gl_cv_func_ldexpl_works" in
|
||||||
|
*yes) gl_func_ldexpl=yes ;;
|
||||||
|
*) gl_func_ldexpl=no; REPLACE_LDEXPL=1 ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
gl_func_ldexpl=no
|
||||||
|
fi
|
||||||
|
if test $gl_func_ldexpl = yes; then
|
||||||
|
AC_DEFINE([HAVE_LDEXPL], [1],
|
||||||
|
[Define if the ldexpl() function is available.])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test $HAVE_DECL_LDEXPL = 0 || test $gl_func_ldexpl = no; then
|
||||||
|
dnl Find libraries needed to link lib/ldexpl.c.
|
||||||
|
if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
|
||||||
|
AC_REQUIRE([gl_FUNC_LDEXP])
|
||||||
|
LDEXPL_LIBM="$LDEXP_LIBM"
|
||||||
|
else
|
||||||
|
LDEXPL_LIBM="$ISNANL_LIBM"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AC_SUBST([LDEXPL_LIBM])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Test whether ldexpl() can be used without linking with libm.
|
||||||
|
dnl Set gl_cv_func_ldexpl_no_libm to 'yes' or 'no' accordingly.
|
||||||
|
AC_DEFUN([gl_CHECK_LDEXPL_NO_LIBM],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([whether ldexpl() can be used without linking with libm],
|
||||||
|
[gl_cv_func_ldexpl_no_libm],
|
||||||
|
[
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
long double x;]],
|
||||||
|
[[return ldexpl (x, -1) > 0;]])],
|
||||||
|
[gl_cv_func_ldexpl_no_libm=yes],
|
||||||
|
[gl_cv_func_ldexpl_no_libm=no])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Test whether ldexpl() works on finite numbers (this fails on AIX 5.1
|
||||||
|
dnl and Mac OS X 10.4/PowerPC).
|
||||||
|
AC_DEFUN([gl_FUNC_LDEXPL_WORKS],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
||||||
|
AC_CACHE_CHECK([whether ldexpl works], [gl_cv_func_ldexpl_works],
|
||||||
|
[
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#include <math.h>
|
||||||
|
extern
|
||||||
|
#ifdef __cplusplus
|
||||||
|
"C"
|
||||||
|
#endif
|
||||||
|
long double ldexpl (long double, int);
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
{
|
||||||
|
volatile long double x = 1.0;
|
||||||
|
volatile long double y = ldexpl (x, -1);
|
||||||
|
if (y != 0.5L)
|
||||||
|
result |= 1;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
volatile long double x = 1.73205L;
|
||||||
|
volatile long double y = ldexpl (x, 0);
|
||||||
|
if (y != x)
|
||||||
|
result |= 2;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}]])],
|
||||||
|
[gl_cv_func_ldexpl_works=yes],
|
||||||
|
[gl_cv_func_ldexpl_works=no],
|
||||||
|
[
|
||||||
|
changequote(,)dnl
|
||||||
|
case "$host_os" in
|
||||||
|
aix | aix[3-6]*) gl_cv_func_ldexpl_works="guessing no" ;;
|
||||||
|
# Guess yes on native Windows.
|
||||||
|
mingw*) gl_cv_func_ldexpl_works="guessing yes" ;;
|
||||||
|
*) gl_cv_func_ldexpl_works="guessing yes" ;;
|
||||||
|
esac
|
||||||
|
changequote([,])dnl
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
31
m4/limits-h.m4
Normal file
31
m4/limits-h.m4
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
dnl Check whether limits.h has needed features.
|
||||||
|
|
||||||
|
dnl Copyright 2016-2018 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.
|
||||||
|
|
||||||
|
AC_DEFUN_ONCE([gl_LIMITS_H],
|
||||||
|
[
|
||||||
|
gl_CHECK_NEXT_HEADERS([limits.h])
|
||||||
|
|
||||||
|
AC_CACHE_CHECK([whether limits.h has ULLONG_WIDTH etc.],
|
||||||
|
[gl_cv_header_limits_width],
|
||||||
|
[AC_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([[#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
|
||||||
|
#define __STDC_WANT_IEC_60559_BFP_EXT__ 1
|
||||||
|
#endif
|
||||||
|
#include <limits.h>
|
||||||
|
int ullw = ULLONG_WIDTH;]])],
|
||||||
|
[gl_cv_header_limits_width=yes],
|
||||||
|
[gl_cv_header_limits_width=no])])
|
||||||
|
if test "$gl_cv_header_limits_width" = yes; then
|
||||||
|
LIMITS_H=
|
||||||
|
else
|
||||||
|
LIMITS_H=limits.h
|
||||||
|
fi
|
||||||
|
AC_SUBST([LIMITS_H])
|
||||||
|
AM_CONDITIONAL([GL_GENERATE_LIMITS_H], [test -n "$LIMITS_H"])
|
||||||
|
])
|
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-2018 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));]])
|
||||||
|
])
|
366
m4/math_h.m4
Normal file
366
m4/math_h.m4
Normal file
|
@ -0,0 +1,366 @@
|
||||||
|
# math_h.m4 serial 116
|
||||||
|
dnl Copyright (C) 2007-2018 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_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_ACOSF=0; AC_SUBST([REPLACE_ACOSF])
|
||||||
|
REPLACE_ASINF=0; AC_SUBST([REPLACE_ASINF])
|
||||||
|
REPLACE_ATANF=0; AC_SUBST([REPLACE_ATANF])
|
||||||
|
REPLACE_ATAN2F=0; AC_SUBST([REPLACE_ATAN2F])
|
||||||
|
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_COSF=0; AC_SUBST([REPLACE_COSF])
|
||||||
|
REPLACE_COSHF=0; AC_SUBST([REPLACE_COSHF])
|
||||||
|
REPLACE_EXPF=0; AC_SUBST([REPLACE_EXPF])
|
||||||
|
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_ILOGBL=0; AC_SUBST([REPLACE_ILOGBL])
|
||||||
|
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_SINF=0; AC_SUBST([REPLACE_SINF])
|
||||||
|
REPLACE_SINHF=0; AC_SUBST([REPLACE_SINHF])
|
||||||
|
REPLACE_SQRTF=0; AC_SUBST([REPLACE_SQRTF])
|
||||||
|
REPLACE_SQRTL=0; AC_SUBST([REPLACE_SQRTL])
|
||||||
|
REPLACE_TANF=0; AC_SUBST([REPLACE_TANF])
|
||||||
|
REPLACE_TANHF=0; AC_SUBST([REPLACE_TANHF])
|
||||||
|
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])
|
||||||
|
])
|
99
m4/memchr.m4
Normal file
99
m4/memchr.m4
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
# memchr.m4 serial 13
|
||||||
|
dnl Copyright (C) 2002-2004, 2009-2018 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],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
||||||
|
|
||||||
|
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
|
||||||
|
# https://bugzilla.redhat.com/show_bug.cgi?id=499689
|
||||||
|
# memchr should not dereference overestimated length after a match
|
||||||
|
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737
|
||||||
|
# https://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],
|
||||||
|
[case "$host_os" in
|
||||||
|
# Guess yes on native Windows.
|
||||||
|
mingw*) gl_cv_func_memchr_works="guessing yes" ;;
|
||||||
|
# Be pessimistic for now.
|
||||||
|
*) gl_cv_func_memchr_works="guessing no" ;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
])
|
||||||
|
case "$gl_cv_func_memchr_works" in
|
||||||
|
*yes) ;;
|
||||||
|
*) REPLACE_MEMCHR=1 ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# Prerequisites of lib/memchr.c.
|
||||||
|
AC_DEFUN([gl_PREREQ_MEMCHR], [
|
||||||
|
AC_CHECK_HEADERS([bp-sym.h])
|
||||||
|
])
|
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-2018 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-2018 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])
|
||||||
|
])
|
131
m4/nocrash.m4
Normal file
131
m4/nocrash.m4
Normal file
|
@ -0,0 +1,131 @@
|
||||||
|
# nocrash.m4 serial 5
|
||||||
|
dnl Copyright (C) 2005, 2009-2018 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 __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>
|
||||||
|
#include <unistd.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-2018 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])
|
||||||
|
])
|
38
m4/printf-frexp.m4
Normal file
38
m4/printf-frexp.m4
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
# printf-frexp.m4 serial 5
|
||||||
|
dnl Copyright (C) 2007, 2009-2018 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 how to define printf_frexp() without linking with libm.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FUNC_PRINTF_FREXP],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM])
|
||||||
|
if test $gl_cv_func_frexp_no_libm = yes; then
|
||||||
|
gl_FUNC_FREXP_WORKS
|
||||||
|
case "$gl_cv_func_frexp_works" in
|
||||||
|
*yes)
|
||||||
|
AC_DEFINE([HAVE_FREXP_IN_LIBC], [1],
|
||||||
|
[Define if the frexp function is available in libc.])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_CACHE_CHECK([whether ldexp can be used without linking with libm],
|
||||||
|
[gl_cv_func_ldexp_no_libm],
|
||||||
|
[
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
double x;
|
||||||
|
int y;]],
|
||||||
|
[[return ldexp (x, y) < 1;]])],
|
||||||
|
[gl_cv_func_ldexp_no_libm=yes],
|
||||||
|
[gl_cv_func_ldexp_no_libm=no])
|
||||||
|
])
|
||||||
|
if test $gl_cv_func_ldexp_no_libm = yes; then
|
||||||
|
AC_DEFINE([HAVE_LDEXP_IN_LIBC], [1],
|
||||||
|
[Define if the ldexp function is available in libc.])
|
||||||
|
fi
|
||||||
|
])
|
48
m4/printf-frexpl.m4
Normal file
48
m4/printf-frexpl.m4
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
# printf-frexpl.m4 serial 10
|
||||||
|
dnl Copyright (C) 2007, 2009-2018 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 how to define printf_frexpl() without linking with libm.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FUNC_PRINTF_FREXPL],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_MATH_H_DEFAULTS])
|
||||||
|
AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
|
||||||
|
|
||||||
|
dnl Subset of gl_FUNC_FREXPL_NO_LIBM.
|
||||||
|
gl_CHECK_FREXPL_NO_LIBM
|
||||||
|
if test $gl_cv_func_frexpl_no_libm = yes; then
|
||||||
|
gl_FUNC_FREXPL_WORKS
|
||||||
|
case "$gl_cv_func_frexpl_works" in
|
||||||
|
*yes) gl_func_frexpl_no_libm=yes ;;
|
||||||
|
*) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
gl_func_frexpl_no_libm=no
|
||||||
|
dnl Set REPLACE_FREXPL here because the system may have frexpl in libm.
|
||||||
|
REPLACE_FREXPL=1
|
||||||
|
fi
|
||||||
|
if test $gl_func_frexpl_no_libm = yes; then
|
||||||
|
AC_DEFINE([HAVE_FREXPL_IN_LIBC], [1],
|
||||||
|
[Define if the frexpl function is available in libc.])
|
||||||
|
dnl Also check whether it's declared.
|
||||||
|
dnl Mac OS X 10.3 has frexpl() in libc but doesn't declare it in <math.h>.
|
||||||
|
AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [[#include <math.h>]])
|
||||||
|
fi
|
||||||
|
|
||||||
|
gl_CHECK_LDEXPL_NO_LIBM
|
||||||
|
if test $gl_cv_func_ldexpl_no_libm = yes; then
|
||||||
|
gl_FUNC_LDEXPL_WORKS
|
||||||
|
case "$gl_cv_func_ldexpl_works" in
|
||||||
|
*yes)
|
||||||
|
AC_DEFINE([HAVE_LDEXPL_IN_LIBC], [1],
|
||||||
|
[Define if the ldexpl function is available in libc.])
|
||||||
|
dnl Also check whether it's declared.
|
||||||
|
dnl Mac OS X 10.3 has ldexpl() in libc but doesn't declare it in <math.h>.
|
||||||
|
AC_CHECK_DECL([ldexpl], , [HAVE_DECL_LDEXPL=0], [[#include <math.h>]])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
])
|
1631
m4/printf.m4
Normal file
1631
m4/printf.m4
Normal file
File diff suppressed because it is too large
Load diff
377
m4/signbit.m4
Normal file
377
m4/signbit.m4
Normal file
|
@ -0,0 +1,377 @@
|
||||||
|
# signbit.m4 serial 16
|
||||||
|
dnl Copyright (C) 2007-2018 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_SIGNBIT],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_MATH_H_DEFAULTS])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
||||||
|
AC_CACHE_CHECK([for signbit macro], [gl_cv_func_signbit],
|
||||||
|
[
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#include <math.h>
|
||||||
|
/* If signbit is defined as a function, don't use it, since calling it for
|
||||||
|
'float' or 'long double' arguments would involve conversions.
|
||||||
|
If signbit is not declared at all but exists as a library function, don't
|
||||||
|
use it, since the prototype may not match.
|
||||||
|
If signbit is not declared at all but exists as a compiler built-in, don't
|
||||||
|
use it, since it's preferable to use __builtin_signbit* (no warnings,
|
||||||
|
no conversions). */
|
||||||
|
#ifndef signbit
|
||||||
|
# error "signbit should be a macro"
|
||||||
|
#endif
|
||||||
|
#include <string.h>
|
||||||
|
]gl_SIGNBIT_TEST_PROGRAM
|
||||||
|
])],
|
||||||
|
[gl_cv_func_signbit=yes],
|
||||||
|
[gl_cv_func_signbit=no],
|
||||||
|
[case "$host_os" in
|
||||||
|
# Guess yes on glibc systems.
|
||||||
|
*-gnu* | gnu*) gl_cv_func_signbit="guessing yes" ;;
|
||||||
|
# Guess yes on native Windows.
|
||||||
|
mingw*) gl_cv_func_signbit="guessing yes" ;;
|
||||||
|
# If we don't know, assume the worst.
|
||||||
|
*) gl_cv_func_signbit="guessing no" ;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
])
|
||||||
|
dnl GCC 4.0 and newer provides three built-ins for signbit.
|
||||||
|
dnl They can be used without warnings, also in C++, regardless of <math.h>.
|
||||||
|
dnl But they may expand to calls to functions, which may or may not be in
|
||||||
|
dnl libc.
|
||||||
|
AC_CACHE_CHECK([for signbit compiler built-ins], [gl_cv_func_signbit_gcc],
|
||||||
|
[
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#if __GNUC__ >= 4
|
||||||
|
# define signbit(x) \
|
||||||
|
(sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
|
||||||
|
sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
|
||||||
|
__builtin_signbitf (x))
|
||||||
|
#else
|
||||||
|
# error "signbit should be three compiler built-ins"
|
||||||
|
#endif
|
||||||
|
#include <string.h>
|
||||||
|
]gl_SIGNBIT_TEST_PROGRAM
|
||||||
|
])],
|
||||||
|
[gl_cv_func_signbit_gcc=yes],
|
||||||
|
[gl_cv_func_signbit_gcc=no],
|
||||||
|
[case "$host_os" in
|
||||||
|
# Guess yes on glibc systems.
|
||||||
|
*-gnu* | gnu*) gl_cv_func_signbit_gcc="guessing yes" ;;
|
||||||
|
# Guess yes on mingw, no on MSVC.
|
||||||
|
mingw*) if test -n "$GCC"; then
|
||||||
|
gl_cv_func_signbit_gcc="guessing yes"
|
||||||
|
else
|
||||||
|
gl_cv_func_signbit_gcc="guessing no"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
# If we don't know, assume the worst.
|
||||||
|
*) gl_cv_func_signbit_gcc="guessing no" ;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
])
|
||||||
|
dnl Use the compiler built-ins whenever possible, because they are more
|
||||||
|
dnl efficient than the system library functions (if they exist).
|
||||||
|
case "$gl_cv_func_signbit_gcc" in
|
||||||
|
*yes)
|
||||||
|
REPLACE_SIGNBIT_USING_GCC=1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
case "$gl_cv_func_signbit" in
|
||||||
|
*yes) ;;
|
||||||
|
*)
|
||||||
|
dnl REPLACE_SIGNBIT=1 makes sure the signbit[fdl] functions get built.
|
||||||
|
REPLACE_SIGNBIT=1
|
||||||
|
gl_FLOAT_SIGN_LOCATION
|
||||||
|
gl_DOUBLE_SIGN_LOCATION
|
||||||
|
gl_LONG_DOUBLE_SIGN_LOCATION
|
||||||
|
if test "$gl_cv_cc_float_signbit" = unknown; then
|
||||||
|
dnl Test whether copysignf() is declared.
|
||||||
|
AC_CHECK_DECLS([copysignf], , , [[#include <math.h>]])
|
||||||
|
if test "$ac_cv_have_decl_copysignf" = yes; then
|
||||||
|
dnl Test whether copysignf() can be used without libm.
|
||||||
|
AC_CACHE_CHECK([whether copysignf can be used without linking with libm],
|
||||||
|
[gl_cv_func_copysignf_no_libm],
|
||||||
|
[
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
float x, y;]],
|
||||||
|
[[return copysignf (x, y) < 0;]])],
|
||||||
|
[gl_cv_func_copysignf_no_libm=yes],
|
||||||
|
[gl_cv_func_copysignf_no_libm=no])
|
||||||
|
])
|
||||||
|
if test $gl_cv_func_copysignf_no_libm = yes; then
|
||||||
|
AC_DEFINE([HAVE_COPYSIGNF_IN_LIBC], [1],
|
||||||
|
[Define if the copysignf function is declared in <math.h> and available in libc.])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test "$gl_cv_cc_double_signbit" = unknown; then
|
||||||
|
dnl Test whether copysign() is declared.
|
||||||
|
AC_CHECK_DECLS([copysign], , , [[#include <math.h>]])
|
||||||
|
if test "$ac_cv_have_decl_copysign" = yes; then
|
||||||
|
dnl Test whether copysign() can be used without libm.
|
||||||
|
AC_CACHE_CHECK([whether copysign can be used without linking with libm],
|
||||||
|
[gl_cv_func_copysign_no_libm],
|
||||||
|
[
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
double x, y;]],
|
||||||
|
[[return copysign (x, y) < 0;]])],
|
||||||
|
[gl_cv_func_copysign_no_libm=yes],
|
||||||
|
[gl_cv_func_copysign_no_libm=no])
|
||||||
|
])
|
||||||
|
if test $gl_cv_func_copysign_no_libm = yes; then
|
||||||
|
AC_DEFINE([HAVE_COPYSIGN_IN_LIBC], [1],
|
||||||
|
[Define if the copysign function is declared in <math.h> and available in libc.])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test "$gl_cv_cc_long_double_signbit" = unknown; then
|
||||||
|
dnl Test whether copysignl() is declared.
|
||||||
|
AC_CHECK_DECLS([copysignl], , , [[#include <math.h>]])
|
||||||
|
if test "$ac_cv_have_decl_copysignl" = yes; then
|
||||||
|
dnl Test whether copysignl() can be used without libm.
|
||||||
|
AC_CACHE_CHECK([whether copysignl can be used without linking with libm],
|
||||||
|
[gl_cv_func_copysignl_no_libm],
|
||||||
|
[
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <math.h>
|
||||||
|
long double x, y;]],
|
||||||
|
[[return copysignl (x, y) < 0;]])],
|
||||||
|
[gl_cv_func_copysignl_no_libm=yes],
|
||||||
|
[gl_cv_func_copysignl_no_libm=no])
|
||||||
|
])
|
||||||
|
if test $gl_cv_func_copysignl_no_libm = yes; then
|
||||||
|
AC_DEFINE([HAVE_COPYSIGNL_IN_LIBC], [1],
|
||||||
|
[Define if the copysignl function is declared in <math.h> and available in libc.])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_SIGNBIT_TEST_PROGRAM], [[
|
||||||
|
/* Global variables.
|
||||||
|
Needed because GCC 4 constant-folds __builtin_signbitl (literal)
|
||||||
|
but cannot constant-fold __builtin_signbitl (variable). */
|
||||||
|
float vf;
|
||||||
|
double vd;
|
||||||
|
long double vl;
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
|
||||||
|
So we use -p0f and -p0d instead. */
|
||||||
|
float p0f = 0.0f;
|
||||||
|
float m0f = -p0f;
|
||||||
|
double p0d = 0.0;
|
||||||
|
double m0d = -p0d;
|
||||||
|
/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
|
||||||
|
So we use another constant expression instead.
|
||||||
|
But that expression does not work on other platforms, such as when
|
||||||
|
cross-compiling to PowerPC on Mac OS X 10.5. */
|
||||||
|
long double p0l = 0.0L;
|
||||||
|
#if defined __hpux || defined __sgi
|
||||||
|
long double m0l = -LDBL_MIN * LDBL_MIN;
|
||||||
|
#else
|
||||||
|
long double m0l = -p0l;
|
||||||
|
#endif
|
||||||
|
int result = 0;
|
||||||
|
if (signbit (vf)) /* link check */
|
||||||
|
vf++;
|
||||||
|
{
|
||||||
|
float plus_inf = 1.0f / p0f;
|
||||||
|
float minus_inf = -1.0f / p0f;
|
||||||
|
if (!(!signbit (255.0f)
|
||||||
|
&& signbit (-255.0f)
|
||||||
|
&& !signbit (p0f)
|
||||||
|
&& (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f))
|
||||||
|
&& !signbit (plus_inf)
|
||||||
|
&& signbit (minus_inf)))
|
||||||
|
result |= 1;
|
||||||
|
}
|
||||||
|
if (signbit (vd)) /* link check */
|
||||||
|
vd++;
|
||||||
|
{
|
||||||
|
double plus_inf = 1.0 / p0d;
|
||||||
|
double minus_inf = -1.0 / p0d;
|
||||||
|
if (!(!signbit (255.0)
|
||||||
|
&& signbit (-255.0)
|
||||||
|
&& !signbit (p0d)
|
||||||
|
&& (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d))
|
||||||
|
&& !signbit (plus_inf)
|
||||||
|
&& signbit (minus_inf)))
|
||||||
|
result |= 2;
|
||||||
|
}
|
||||||
|
if (signbit (vl)) /* link check */
|
||||||
|
vl++;
|
||||||
|
{
|
||||||
|
long double plus_inf = 1.0L / p0l;
|
||||||
|
long double minus_inf = -1.0L / p0l;
|
||||||
|
if (signbit (255.0L))
|
||||||
|
result |= 4;
|
||||||
|
if (!signbit (-255.0L))
|
||||||
|
result |= 4;
|
||||||
|
if (signbit (p0l))
|
||||||
|
result |= 8;
|
||||||
|
if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l)))
|
||||||
|
result |= 16;
|
||||||
|
if (signbit (plus_inf))
|
||||||
|
result |= 32;
|
||||||
|
if (!signbit (minus_inf))
|
||||||
|
result |= 64;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
]])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FLOAT_SIGN_LOCATION],
|
||||||
|
[
|
||||||
|
gl_FLOATTYPE_SIGN_LOCATION([float], [gl_cv_cc_float_signbit], [f], [FLT])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_DOUBLE_SIGN_LOCATION],
|
||||||
|
[
|
||||||
|
gl_FLOATTYPE_SIGN_LOCATION([double], [gl_cv_cc_double_signbit], [], [DBL])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_LONG_DOUBLE_SIGN_LOCATION],
|
||||||
|
[
|
||||||
|
gl_FLOATTYPE_SIGN_LOCATION([long double], [gl_cv_cc_long_double_signbit], [L], [LDBL])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FLOATTYPE_SIGN_LOCATION],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([where to find the sign bit in a '$1'],
|
||||||
|
[$2],
|
||||||
|
[
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#define NWORDS \
|
||||||
|
((sizeof ($1) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
|
||||||
|
typedef union { $1 value; unsigned int word[NWORDS]; }
|
||||||
|
memory_float;
|
||||||
|
static memory_float plus = { 1.0$3 };
|
||||||
|
static memory_float minus = { -1.0$3 };
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
size_t j, k, i;
|
||||||
|
unsigned int m;
|
||||||
|
FILE *fp = fopen ("conftest.out", "w");
|
||||||
|
if (fp == NULL)
|
||||||
|
return 1;
|
||||||
|
/* Find the different bit. */
|
||||||
|
k = 0; m = 0;
|
||||||
|
for (j = 0; j < NWORDS; j++)
|
||||||
|
{
|
||||||
|
unsigned int x = plus.word[j] ^ minus.word[j];
|
||||||
|
if ((x & (x - 1)) || (x && m))
|
||||||
|
{
|
||||||
|
/* More than one bit difference. */
|
||||||
|
fprintf (fp, "unknown");
|
||||||
|
fclose (fp);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
if (x)
|
||||||
|
{
|
||||||
|
k = j;
|
||||||
|
m = x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (m == 0)
|
||||||
|
{
|
||||||
|
/* No difference. */
|
||||||
|
fprintf (fp, "unknown");
|
||||||
|
fclose (fp);
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
/* Now m = plus.word[k] ^ ~minus.word[k]. */
|
||||||
|
if (plus.word[k] & ~minus.word[k])
|
||||||
|
{
|
||||||
|
/* Oh? The sign bit is set in the positive and cleared in the negative
|
||||||
|
numbers? */
|
||||||
|
fprintf (fp, "unknown");
|
||||||
|
fclose (fp);
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
for (i = 0; ; i++)
|
||||||
|
if ((m >> i) & 1)
|
||||||
|
break;
|
||||||
|
fprintf (fp, "word %d bit %d", (int) k, (int) i);
|
||||||
|
if (fclose (fp) != 0)
|
||||||
|
return 5;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
]])],
|
||||||
|
[$2=`cat conftest.out`],
|
||||||
|
[$2="unknown"],
|
||||||
|
[
|
||||||
|
dnl When cross-compiling, we don't know. It depends on the
|
||||||
|
dnl ABI and compiler version. There are too many cases.
|
||||||
|
$2="unknown"
|
||||||
|
])
|
||||||
|
rm -f conftest.out
|
||||||
|
])
|
||||||
|
case "$]$2[" in
|
||||||
|
word*bit*)
|
||||||
|
word=`echo "$]$2[" | sed -e 's/word //' -e 's/ bit.*//'`
|
||||||
|
bit=`echo "$]$2[" | sed -e 's/word.*bit //'`
|
||||||
|
AC_DEFINE_UNQUOTED([$4][_SIGNBIT_WORD], [$word],
|
||||||
|
[Define as the word index where to find the sign of '$1'.])
|
||||||
|
AC_DEFINE_UNQUOTED([$4][_SIGNBIT_BIT], [$bit],
|
||||||
|
[Define as the bit index in the word where to find the sign of '$1'.])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
|
||||||
|
# Expands to code that defines a function signbitf(float).
|
||||||
|
# It extracts the sign bit of a non-NaN value.
|
||||||
|
AC_DEFUN([gl_FLOAT_SIGNBIT_CODE],
|
||||||
|
[
|
||||||
|
gl_FLOATTYPE_SIGNBIT_CODE([float], [f], [f])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Expands to code that defines a function signbitd(double).
|
||||||
|
# It extracts the sign bit of a non-NaN value.
|
||||||
|
AC_DEFUN([gl_DOUBLE_SIGNBIT_CODE],
|
||||||
|
[
|
||||||
|
gl_FLOATTYPE_SIGNBIT_CODE([double], [d], [])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Expands to code that defines a function signbitl(long double).
|
||||||
|
# It extracts the sign bit of a non-NaN value.
|
||||||
|
AC_DEFUN([gl_LONG_DOUBLE_SIGNBIT_CODE],
|
||||||
|
[
|
||||||
|
gl_FLOATTYPE_SIGNBIT_CODE([long double], [l], [L])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FLOATTYPE_SIGNBIT_CODE],
|
||||||
|
[[
|
||||||
|
static int
|
||||||
|
signbit$2 ($1 value)
|
||||||
|
{
|
||||||
|
typedef union { $1 f; unsigned char b[sizeof ($1)]; } float_union;
|
||||||
|
static float_union plus_one = { 1.0$3 }; /* unused bits are zero here */
|
||||||
|
static float_union minus_one = { -1.0$3 }; /* unused bits are zero here */
|
||||||
|
/* Compute the sign bit mask as the XOR of plus_one and minus_one. */
|
||||||
|
float_union u;
|
||||||
|
unsigned int i;
|
||||||
|
u.f = value;
|
||||||
|
for (i = 0; i < sizeof ($1); i++)
|
||||||
|
if (u.b[i] & (plus_one.b[i] ^ minus_one.b[i]))
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
]])
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue