diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2014-10-11 23:04:04 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2014-10-11 23:04:04 +0200 |
commit | 9be540c23830a31c22d123a14c513f2a247a6781 (patch) | |
tree | b91728603e0720969fddd326ad9acdcc8b569e25 /src/libopts | |
parent | a27c20c45e03c3335d080f056835cd6d2f05bf01 (diff) | |
download | gnutls-9be540c23830a31c22d123a14c513f2a247a6781.tar.gz |
updated to libopts 5.18.4
Diffstat (limited to 'src/libopts')
-rw-r--r-- | src/libopts/Makefile.am | 58 | ||||
-rw-r--r-- | src/libopts/ag-char-map.h | 2 | ||||
-rw-r--r-- | src/libopts/ao-strs.c | 2 | ||||
-rw-r--r-- | src/libopts/ao-strs.h | 2 | ||||
-rw-r--r-- | src/libopts/autoopts.h | 9 | ||||
-rw-r--r-- | src/libopts/autoopts/options.h | 35 | ||||
-rw-r--r-- | src/libopts/autoopts/usage-txt.h | 2 | ||||
-rw-r--r-- | src/libopts/compat/_Noreturn.h | 10 | ||||
-rw-r--r-- | src/libopts/genshell.c | 4 | ||||
-rw-r--r-- | src/libopts/genshell.h | 6 | ||||
-rw-r--r-- | src/libopts/intprops.h | 320 | ||||
-rw-r--r-- | src/libopts/m4/libopts.m4 | 3 | ||||
-rw-r--r-- | src/libopts/m4/stdnoreturn.m4 | 41 | ||||
-rw-r--r-- | src/libopts/option-value-type.c | 2 | ||||
-rw-r--r-- | src/libopts/option-value-type.h | 2 | ||||
-rw-r--r-- | src/libopts/option-xat-attribute.c | 2 | ||||
-rw-r--r-- | src/libopts/option-xat-attribute.h | 2 | ||||
-rw-r--r-- | src/libopts/parse-duration.c | 9 | ||||
-rw-r--r-- | src/libopts/proto.h | 2 | ||||
-rw-r--r-- | src/libopts/stdnoreturn.in.h | 50 | ||||
-rw-r--r-- | src/libopts/version.c | 28 |
21 files changed, 536 insertions, 55 deletions
diff --git a/src/libopts/Makefile.am b/src/libopts/Makefile.am index 61706df1c4..5dc5a30c76 100644 --- a/src/libopts/Makefile.am +++ b/src/libopts/Makefile.am @@ -6,25 +6,47 @@ noinst_LTLIBRARIES = libopts.la libopts_la_SOURCES = libopts.c libopts_la_CPPFLAGS = -I$(top_srcdir) libopts_la_LIBADD = $(LTLIBINTL) +EXTRA_DIST = +BUILT_SOURCES = +MOSTLYCLEANFILES = + ++_NORETURN_H=$(srcdir)/compat/_Noreturn.h +EXTRA_DIST += $(srcdir)/compat/_Noreturn.h +BUILT_SOURCES += $(STDNORETURN_H) +if GL_GENERATE_STDNORETURN_H +stdnoreturn.h: stdnoreturn.in.h $(top_builddir)/config.status $(_NORETURN_H) + $(AM_V_GEN)rm -f $@-t $@ && \ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e '/definition of _Noreturn/r $(_NORETURN_H)' \ + < $(srcdir)/stdnoreturn.in.h; \ + } > $@-t && \ + mv $@-t $@ +else +stdnoreturn.h: $(top_builddir)/config.status + rm -f $@ +endif +MOSTLYCLEANFILES += stdnoreturn.h stdnoreturn.h-t +EXTRA_DIST += stdnoreturn.in.h -EXTRA_DIST = \ - ag-char-map.h alias.c ao-strs.c \ - ao-strs.h autoopts/options.h autoopts/usage-txt.h \ - autoopts/project.h autoopts.c autoopts.h \ - boolean.c check.c compat/strdup.c \ - compat/strchr.c compat/snprintf.c compat/compat.h \ - compat/pathfind.c compat/windows-config.h configfile.c \ - cook.c COPYING.gplv3 COPYING.lgplv3 \ - COPYING.mbsd enum.c env.c \ +EXTRA_DIST += \ + COPYING.gplv3 COPYING.lgplv3 COPYING.mbsd \ + MakeDefs.inc README ag-char-map.h \ + alias.c ao-strs.c ao-strs.h \ + autoopts/options.h autoopts/project.h autoopts/usage-txt.h \ + autoopts.c autoopts.h boolean.c \ + check.c compat/strdup.c compat/snprintf.c \ + compat/compat.h compat/_Noreturn.h compat/pathfind.c \ + compat/windows-config.h compat/strchr.c configfile.c \ + cook.c enum.c env.c \ file.c find.c genshell.c \ genshell.h gettext.h init.c \ - load.c m4/liboptschk.m4 m4/libopts.m4 \ - MakeDefs.inc makeshell.c nested.c \ - numeric.c option-value-type.c option-value-type.h \ - option-xat-attribute.c option-xat-attribute.h parse-duration.c \ - parse-duration.h pgusage.c proto.h \ - putshell.c README reset.c \ + intprops.h load.c m4/libopts.m4 \ + m4/liboptschk.m4 m4/stdnoreturn.m4 makeshell.c \ + nested.c numeric.c option-value-type.c \ + option-value-type.h option-xat-attribute.c option-xat-attribute.h \ + parse-duration.c parse-duration.h pgusage.c \ + proto.h putshell.c reset.c \ restore.c save.c sort.c \ - stack.c streqvcmp.c text_mmap.c \ - time.c tokenize.c usage.c \ - version.c + stack.c stdnoreturn.in.h streqvcmp.c \ + text_mmap.c time.c tokenize.c \ + usage.c version.c diff --git a/src/libopts/ag-char-map.h b/src/libopts/ag-char-map.h index 45235b9fe4..d50e66511b 100644 --- a/src/libopts/ag-char-map.h +++ b/src/libopts/ag-char-map.h @@ -1,6 +1,6 @@ /* * 29 bits for 46 character classifications - * generated by char-mapper on 05/17/14 at 07:49:44 + * generated by char-mapper on 08/30/14 at 10:36:23 * * This file contains the character classifications * used by AutoGen and AutoOpts for identifying tokens. diff --git a/src/libopts/ao-strs.c b/src/libopts/ao-strs.c index c4c5fe3b56..c385a4d340 100644 --- a/src/libopts/ao-strs.c +++ b/src/libopts/ao-strs.c @@ -2,7 +2,7 @@ * * DO NOT EDIT THIS FILE (ao-strs.c) * - * It has been AutoGen-ed May 17, 2014 at 07:49:44 AM by AutoGen 5.18.3 + * It has been AutoGen-ed * From the definitions ao-strs.def * and the template file strings * diff --git a/src/libopts/ao-strs.h b/src/libopts/ao-strs.h index e7bbc0aa75..812186a879 100644 --- a/src/libopts/ao-strs.h +++ b/src/libopts/ao-strs.h @@ -2,7 +2,7 @@ * * DO NOT EDIT THIS FILE (ao-strs.h) * - * It has been AutoGen-ed May 17, 2014 at 07:49:44 AM by AutoGen 5.18.3 + * It has been AutoGen-ed * From the definitions ao-strs.def * and the template file strings * diff --git a/src/libopts/autoopts.h b/src/libopts/autoopts.h index 634a60c36b..27a907c35c 100644 --- a/src/libopts/autoopts.h +++ b/src/libopts/autoopts.h @@ -32,14 +32,7 @@ #ifndef AUTOGEN_AUTOOPTS_H #define AUTOGEN_AUTOOPTS_H - -#ifdef HAVE_STDNORETURN_H -# include <stdnoreturn.h> -#else -# ifndef noreturn -# define noreturn -# endif -#endif +#include <stdnoreturn.h> #define AO_NAME_LIMIT 127 #define AO_NAME_SIZE ((size_t)(AO_NAME_LIMIT + 1)) diff --git a/src/libopts/autoopts/options.h b/src/libopts/autoopts/options.h index 3418b7ea4f..6a5c9e5978 100644 --- a/src/libopts/autoopts/options.h +++ b/src/libopts/autoopts/options.h @@ -2,7 +2,7 @@ * * DO NOT EDIT THIS FILE (options.h) * - * It has been AutoGen-ed May 17, 2014 at 07:49:51 AM by AutoGen 5.18.3 + * It has been AutoGen-ed * From the definitions funcs.def * and the template file options_h * @@ -101,15 +101,15 @@ * @{ */ /// autoopts structure version -#define OPTIONS_STRUCT_VERSION 163842 +#define OPTIONS_STRUCT_VERSION 167936 /// autoopts structure version string -#define OPTIONS_VERSION_STRING "40:2:15" +#define OPTIONS_VERSION_STRING "41:0:16" /// minimum version the autoopts library supports #define OPTIONS_MINIMUM_VERSION 102400 /// minimum version the autoopts library supports as a string #define OPTIONS_MIN_VER_STRING "25:0:0" /// the display version of the autoopts library, as a string -#define OPTIONS_DOTTED_VERSION "40.2" +#define OPTIONS_DOTTED_VERSION "41.0" /// convert a version/release number pair to an integer value #define OPTIONS_VER_TO_NUM(_v, _r) (((_v) * 4096) + (_r)) /// @} @@ -958,6 +958,31 @@ extern void optionOnlyUsage(tOptions*, int); /** + * optionPrintVersion - Print the program version + * + * This routine will print the version to stdout. + * + * @param opts program options descriptor + * @param od the descriptor for this arg + */ +extern void optionPrintVersion(tOptions*, tOptDesc*); + + +/** + * optionPrintVersionAndReturn - Print the program version + * + * This routine will print the version to stdout and return + * instead of exiting. Please see the source for the + * @code{print_ver} funtion for details on selecting how + * verbose to be after this function returns. + * + * @param opts program options descriptor + * @param od the descriptor for this arg + */ +extern void optionPrintVersionAndReturn(tOptions*, tOptDesc*); + + +/** * optionProcess - this is the main option processing routine * * This is the main entry point for processing options. It is intended @@ -1189,8 +1214,6 @@ extern void optionParseShell(tOptions*); extern void optionPrintParagraphs(char const *, bool, FILE *); -extern void optionPrintVersion(tOptions*, tOptDesc*); - extern void optionPutShell(tOptions*); extern char const * optionQuoteString(char const *, char const *); diff --git a/src/libopts/autoopts/usage-txt.h b/src/libopts/autoopts/usage-txt.h index 9ef5d7f079..0307a3172c 100644 --- a/src/libopts/autoopts/usage-txt.h +++ b/src/libopts/autoopts/usage-txt.h @@ -2,7 +2,7 @@ * * DO NOT EDIT THIS FILE (usage-txt.h) * - * It has been AutoGen-ed May 17, 2014 at 07:49:49 AM by AutoGen 5.18.3 + * It has been AutoGen-ed * From the definitions usage-txt.def * and the template file usage-txt.tpl * diff --git a/src/libopts/compat/_Noreturn.h b/src/libopts/compat/_Noreturn.h new file mode 100644 index 0000000000..c44ad89b7c --- /dev/null +++ b/src/libopts/compat/_Noreturn.h @@ -0,0 +1,10 @@ +#if !defined _Noreturn && __STDC_VERSION__ < 201112 +# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \ + || 0x5110 <= __SUNPRO_C) +# define _Noreturn __attribute__ ((__noreturn__)) +# elif 1200 <= _MSC_VER +# define _Noreturn __declspec (noreturn) +# else +# define _Noreturn +# endif +#endif diff --git a/src/libopts/genshell.c b/src/libopts/genshell.c index 79bb5a9ffc..20e6c15c9f 100644 --- a/src/libopts/genshell.c +++ b/src/libopts/genshell.c @@ -2,11 +2,11 @@ * * DO NOT EDIT THIS FILE (genshell.c) * - * It has been AutoGen-ed May 17, 2014 at 07:49:48 AM by AutoGen 5.18.3 + * It has been AutoGen-ed * From the definitions genshell.def * and the template file options * - * Generated from AutoOpts 40:2:15 templates. + * Generated from AutoOpts 41:0:16 templates. * * AutoOpts is a copyrighted work. This source file is not encumbered * by AutoOpts licensing, but is provided under the licensing terms chosen diff --git a/src/libopts/genshell.h b/src/libopts/genshell.h index 3a24e46f8f..1c18735741 100644 --- a/src/libopts/genshell.h +++ b/src/libopts/genshell.h @@ -2,11 +2,11 @@ * * DO NOT EDIT THIS FILE (genshell.h) * - * It has been AutoGen-ed May 17, 2014 at 07:49:48 AM by AutoGen 5.18.3 + * It has been AutoGen-ed * From the definitions genshell.def * and the template file options * - * Generated from AutoOpts 40:2:15 templates. + * Generated from AutoOpts 41:0:16 templates. * * AutoOpts is a copyrighted work. This header file is not encumbered * by AutoOpts licensing, but is provided under the licensing terms chosen @@ -55,7 +55,7 @@ * tolerable version is at least as old as what was current when the header * template was released. */ -#define AO_TEMPLATE_VERSION 163842 +#define AO_TEMPLATE_VERSION 167936 #if (AO_TEMPLATE_VERSION < OPTIONS_MINIMUM_VERSION) \ || (AO_TEMPLATE_VERSION > OPTIONS_STRUCT_VERSION) # error option template version mismatches autoopts/options.h header diff --git a/src/libopts/intprops.h b/src/libopts/intprops.h new file mode 100644 index 0000000000..6936ad572f --- /dev/null +++ b/src/libopts/intprops.h @@ -0,0 +1,320 @@ +/* intprops.h -- properties of integer types + + Copyright (C) 2001-2005, 2009-2014 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +/* Written by Paul Eggert. */ + +#ifndef _GL_INTPROPS_H +#define _GL_INTPROPS_H + +#include <limits.h> + +/* Return an integer value, converted to the same type as the integer + expression E after integer type promotion. V is the unconverted value. */ +#define _GL_INT_CONVERT(e, v) (0 * (e) + (v)) + +/* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see + <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00406.html>. */ +#define _GL_INT_NEGATE_CONVERT(e, v) (0 * (e) - (v)) + +/* The extra casts in the following macros work around compiler bugs, + e.g., in Cray C 5.0.3.0. */ + +/* True if the arithmetic type T is an integer type. bool counts as + an integer. */ +#define TYPE_IS_INTEGER(t) ((t) 1.5 == 1) + +/* True if negative values of the signed integer type T use two's + complement, ones' complement, or signed magnitude representation, + respectively. Much GNU code assumes two's complement, but some + people like to be portable to all possible C hosts. */ +#define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1) +#define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0) +#define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1) + +/* True if the signed integer expression E uses two's complement. */ +#define _GL_INT_TWOS_COMPLEMENT(e) (~ _GL_INT_CONVERT (e, 0) == -1) + +/* True if the arithmetic type T is signed. */ +#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) + +/* Return 1 if the integer expression E, after integer promotion, has + a signed type. */ +#define _GL_INT_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0) + + +/* Minimum and maximum values for integer types and expressions. These + macros have undefined behavior if T is signed and has padding bits. + If this is a problem for you, please let us know how to fix it for + your host. */ + +/* The maximum and minimum values for the integer type T. */ +#define TYPE_MINIMUM(t) \ + ((t) (! TYPE_SIGNED (t) \ + ? (t) 0 \ + : TYPE_SIGNED_MAGNITUDE (t) \ + ? ~ (t) 0 \ + : ~ TYPE_MAXIMUM (t))) +#define TYPE_MAXIMUM(t) \ + ((t) (! TYPE_SIGNED (t) \ + ? (t) -1 \ + : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) + +/* The maximum and minimum values for the type of the expression E, + after integer promotion. E should not have side effects. */ +#define _GL_INT_MINIMUM(e) \ + (_GL_INT_SIGNED (e) \ + ? - _GL_INT_TWOS_COMPLEMENT (e) - _GL_SIGNED_INT_MAXIMUM (e) \ + : _GL_INT_CONVERT (e, 0)) +#define _GL_INT_MAXIMUM(e) \ + (_GL_INT_SIGNED (e) \ + ? _GL_SIGNED_INT_MAXIMUM (e) \ + : _GL_INT_NEGATE_CONVERT (e, 1)) +#define _GL_SIGNED_INT_MAXIMUM(e) \ + (((_GL_INT_CONVERT (e, 1) << (sizeof ((e) + 0) * CHAR_BIT - 2)) - 1) * 2 + 1) + + +/* Return 1 if the __typeof__ keyword works. This could be done by + 'configure', but for now it's easier to do it by hand. */ +#if (2 <= __GNUC__ || defined __IBM__TYPEOF__ \ + || (0x5110 <= __SUNPRO_C && !__STDC__)) +# define _GL_HAVE___TYPEOF__ 1 +#else +# define _GL_HAVE___TYPEOF__ 0 +#endif + +/* Return 1 if the integer type or expression T might be signed. Return 0 + if it is definitely unsigned. This macro does not evaluate its argument, + and expands to an integer constant expression. */ +#if _GL_HAVE___TYPEOF__ +# define _GL_SIGNED_TYPE_OR_EXPR(t) TYPE_SIGNED (__typeof__ (t)) +#else +# define _GL_SIGNED_TYPE_OR_EXPR(t) 1 +#endif + +/* Bound on length of the string representing an unsigned integer + value representable in B bits. log10 (2.0) < 146/485. The + smallest value of B where this bound is not tight is 2621. */ +#define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485) + +/* Bound on length of the string representing an integer type or expression T. + Subtract 1 for the sign bit if T is signed, and then add 1 more for + a minus sign if needed. + + Because _GL_SIGNED_TYPE_OR_EXPR sometimes returns 0 when its argument is + signed, this macro may overestimate the true bound by one byte when + applied to unsigned types of size 2, 4, 16, ... bytes. */ +#define INT_STRLEN_BOUND(t) \ + (INT_BITS_STRLEN_BOUND (sizeof (t) * CHAR_BIT \ + - _GL_SIGNED_TYPE_OR_EXPR (t)) \ + + _GL_SIGNED_TYPE_OR_EXPR (t)) + +/* Bound on buffer size needed to represent an integer type or expression T, + including the terminating null. */ +#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1) + + +/* Range overflow checks. + + The INT_<op>_RANGE_OVERFLOW macros return 1 if the corresponding C + operators might not yield numerically correct answers due to + arithmetic overflow. They do not rely on undefined or + implementation-defined behavior. Their implementations are simple + and straightforward, but they are a bit harder to use than the + INT_<op>_OVERFLOW macros described below. + + Example usage: + + long int i = ...; + long int j = ...; + if (INT_MULTIPLY_RANGE_OVERFLOW (i, j, LONG_MIN, LONG_MAX)) + printf ("multiply would overflow"); + else + printf ("product is %ld", i * j); + + Restrictions on *_RANGE_OVERFLOW macros: + + These macros do not check for all possible numerical problems or + undefined or unspecified behavior: they do not check for division + by zero, for bad shift counts, or for shifting negative numbers. + + These macros may evaluate their arguments zero or multiple times, + so the arguments should not have side effects. The arithmetic + arguments (including the MIN and MAX arguments) must be of the same + integer type after the usual arithmetic conversions, and the type + must have minimum value MIN and maximum MAX. Unsigned types should + use a zero MIN of the proper type. + + These macros are tuned for constant MIN and MAX. For commutative + operations such as A + B, they are also tuned for constant B. */ + +/* Return 1 if A + B would overflow in [MIN,MAX] arithmetic. + See above for restrictions. */ +#define INT_ADD_RANGE_OVERFLOW(a, b, min, max) \ + ((b) < 0 \ + ? (a) < (min) - (b) \ + : (max) - (b) < (a)) + +/* Return 1 if A - B would overflow in [MIN,MAX] arithmetic. + See above for restrictions. */ +#define INT_SUBTRACT_RANGE_OVERFLOW(a, b, min, max) \ + ((b) < 0 \ + ? (max) + (b) < (a) \ + : (a) < (min) + (b)) + +/* Return 1 if - A would overflow in [MIN,MAX] arithmetic. + See above for restrictions. */ +#define INT_NEGATE_RANGE_OVERFLOW(a, min, max) \ + ((min) < 0 \ + ? (a) < - (max) \ + : 0 < (a)) + +/* Return 1 if A * B would overflow in [MIN,MAX] arithmetic. + See above for restrictions. Avoid && and || as they tickle + bugs in Sun C 5.11 2010/08/13 and other compilers; see + <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00401.html>. */ +#define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max) \ + ((b) < 0 \ + ? ((a) < 0 \ + ? (a) < (max) / (b) \ + : (b) == -1 \ + ? 0 \ + : (min) / (b) < (a)) \ + : (b) == 0 \ + ? 0 \ + : ((a) < 0 \ + ? (a) < (min) / (b) \ + : (max) / (b) < (a))) + +/* Return 1 if A / B would overflow in [MIN,MAX] arithmetic. + See above for restrictions. Do not check for division by zero. */ +#define INT_DIVIDE_RANGE_OVERFLOW(a, b, min, max) \ + ((min) < 0 && (b) == -1 && (a) < - (max)) + +/* Return 1 if A % B would overflow in [MIN,MAX] arithmetic. + See above for restrictions. Do not check for division by zero. + Mathematically, % should never overflow, but on x86-like hosts + INT_MIN % -1 traps, and the C standard permits this, so treat this + as an overflow too. */ +#define INT_REMAINDER_RANGE_OVERFLOW(a, b, min, max) \ + INT_DIVIDE_RANGE_OVERFLOW (a, b, min, max) + +/* Return 1 if A << B would overflow in [MIN,MAX] arithmetic. + See above for restrictions. Here, MIN and MAX are for A only, and B need + not be of the same type as the other arguments. The C standard says that + behavior is undefined for shifts unless 0 <= B < wordwidth, and that when + A is negative then A << B has undefined behavior and A >> B has + implementation-defined behavior, but do not check these other + restrictions. */ +#define INT_LEFT_SHIFT_RANGE_OVERFLOW(a, b, min, max) \ + ((a) < 0 \ + ? (a) < (min) >> (b) \ + : (max) >> (b) < (a)) + + +/* The _GL*_OVERFLOW macros have the same restrictions as the + *_RANGE_OVERFLOW macros, except that they do not assume that operands + (e.g., A and B) have the same type as MIN and MAX. Instead, they assume + that the result (e.g., A + B) has that type. */ +#define _GL_ADD_OVERFLOW(a, b, min, max) \ + ((min) < 0 ? INT_ADD_RANGE_OVERFLOW (a, b, min, max) \ + : (a) < 0 ? (b) <= (a) + (b) \ + : (b) < 0 ? (a) <= (a) + (b) \ + : (a) + (b) < (b)) +#define _GL_SUBTRACT_OVERFLOW(a, b, min, max) \ + ((min) < 0 ? INT_SUBTRACT_RANGE_OVERFLOW (a, b, min, max) \ + : (a) < 0 ? 1 \ + : (b) < 0 ? (a) - (b) <= (a) \ + : (a) < (b)) +#define _GL_MULTIPLY_OVERFLOW(a, b, min, max) \ + (((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a)))) \ + || INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max)) +#define _GL_DIVIDE_OVERFLOW(a, b, min, max) \ + ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \ + : (a) < 0 ? (b) <= (a) + (b) - 1 \ + : (b) < 0 && (a) + (b) <= (a)) +#define _GL_REMAINDER_OVERFLOW(a, b, min, max) \ + ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \ + : (a) < 0 ? (a) % (b) != ((max) - (b) + 1) % (b) \ + : (b) < 0 && ! _GL_UNSIGNED_NEG_MULTIPLE (a, b, max)) + +/* Return a nonzero value if A is a mathematical multiple of B, where + A is unsigned, B is negative, and MAX is the maximum value of A's + type. A's type must be the same as (A % B)'s type. Normally (A % + -B == 0) suffices, but things get tricky if -B would overflow. */ +#define _GL_UNSIGNED_NEG_MULTIPLE(a, b, max) \ + (((b) < -_GL_SIGNED_INT_MAXIMUM (b) \ + ? (_GL_SIGNED_INT_MAXIMUM (b) == (max) \ + ? (a) \ + : (a) % (_GL_INT_CONVERT (a, _GL_SIGNED_INT_MAXIMUM (b)) + 1)) \ + : (a) % - (b)) \ + == 0) + + +/* Integer overflow checks. + + The INT_<op>_OVERFLOW macros return 1 if the corresponding C operators + might not yield numerically correct answers due to arithmetic overflow. + They work correctly on all known practical hosts, and do not rely + on undefined behavior due to signed arithmetic overflow. + + Example usage: + + long int i = ...; + long int j = ...; + if (INT_MULTIPLY_OVERFLOW (i, j)) + printf ("multiply would overflow"); + else + printf ("product is %ld", i * j); + + These macros do not check for all possible numerical problems or + undefined or unspecified behavior: they do not check for division + by zero, for bad shift counts, or for shifting negative numbers. + + These macros may evaluate their arguments zero or multiple times, so the + arguments should not have side effects. + + These macros are tuned for their last argument being a constant. + + Return 1 if the integer expressions A * B, A - B, -A, A * B, A / B, + A % B, and A << B would overflow, respectively. */ + +#define INT_ADD_OVERFLOW(a, b) \ + _GL_BINARY_OP_OVERFLOW (a, b, _GL_ADD_OVERFLOW) +#define INT_SUBTRACT_OVERFLOW(a, b) \ + _GL_BINARY_OP_OVERFLOW (a, b, _GL_SUBTRACT_OVERFLOW) +#define INT_NEGATE_OVERFLOW(a) \ + INT_NEGATE_RANGE_OVERFLOW (a, _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a)) +#define INT_MULTIPLY_OVERFLOW(a, b) \ + _GL_BINARY_OP_OVERFLOW (a, b, _GL_MULTIPLY_OVERFLOW) +#define INT_DIVIDE_OVERFLOW(a, b) \ + _GL_BINARY_OP_OVERFLOW (a, b, _GL_DIVIDE_OVERFLOW) +#define INT_REMAINDER_OVERFLOW(a, b) \ + _GL_BINARY_OP_OVERFLOW (a, b, _GL_REMAINDER_OVERFLOW) +#define INT_LEFT_SHIFT_OVERFLOW(a, b) \ + INT_LEFT_SHIFT_RANGE_OVERFLOW (a, b, \ + _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a)) + +/* Return 1 if the expression A <op> B would overflow, + where OP_RESULT_OVERFLOW (A, B, MIN, MAX) does the actual test, + assuming MIN and MAX are the minimum and maximum for the result type. + Arguments should be free of side effects. */ +#define _GL_BINARY_OP_OVERFLOW(a, b, op_result_overflow) \ + op_result_overflow (a, b, \ + _GL_INT_MINIMUM (0 * (b) + (a)), \ + _GL_INT_MAXIMUM (0 * (b) + (a))) + +#endif /* _GL_INTPROPS_H */ diff --git a/src/libopts/m4/libopts.m4 b/src/libopts/m4/libopts.m4 index 7f2a9bb877..1f3b3cec96 100644 --- a/src/libopts/m4/libopts.m4 +++ b/src/libopts/m4/libopts.m4 @@ -2,7 +2,7 @@ dnl -*- buffer-read-only: t -*- vi: set ro: dnl dnl DO NOT EDIT THIS FILE (libopts.m4) dnl -dnl It has been AutoGen-ed May 17, 2014 at 07:49:39 AM by AutoGen 5.18.3 +dnl It has been AutoGen-ed dnl From the definitions libopts.def dnl and the template file conftest.tpl dnl @@ -38,6 +38,7 @@ AC_DEFUN([INVOKE_LIBOPTS_MACROS_FIRST],[ AC_CHECK_HEADERS([inttypes.h stdint.h], [lo_have_typ_hdr=true;break], [lo_have_typ_hdr=false]) + gl_STDNORETURN_H # ---------------------------------------------------------------------- # check for various programs used during the build. diff --git a/src/libopts/m4/stdnoreturn.m4 b/src/libopts/m4/stdnoreturn.m4 new file mode 100644 index 0000000000..eea2c1e21d --- /dev/null +++ b/src/libopts/m4/stdnoreturn.m4 @@ -0,0 +1,41 @@ +# Check for stdnoreturn.h that conforms to C11. + +dnl Copyright 2012-2014 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. + +# Prepare for substituting <stdnoreturn.h> if it is not supported. + +AC_DEFUN([gl_STDNORETURN_H], +[ + AC_CACHE_CHECK([for working stdnoreturn.h], + [gl_cv_header_working_stdnoreturn_h], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include <stdlib.h> + #include <stdnoreturn.h> + /* Do not check for 'noreturn' after the return type. + C11 allows it, but it's rarely done that way + and circa-2012 bleeding-edge GCC rejects it when given + -Werror=old-style-declaration. */ + noreturn void foo1 (void) { exit (0); } + _Noreturn void foo2 (void) { exit (0); } + int testit (int argc, char **argv) { + if (argc & 1) + return 0; + (argv[0][0] ? foo1 : foo2) (); + } + ]])], + [gl_cv_header_working_stdnoreturn_h=yes], + [gl_cv_header_working_stdnoreturn_h=no])]) + + if test $gl_cv_header_working_stdnoreturn_h = yes; then + STDNORETURN_H='' + else + STDNORETURN_H='stdnoreturn.h' + fi + + AC_SUBST([STDNORETURN_H]) + AM_CONDITIONAL([GL_GENERATE_STDNORETURN_H], [test -n "$STDNORETURN_H"]) +]) diff --git a/src/libopts/option-value-type.c b/src/libopts/option-value-type.c index 68370da9bc..e4b4ea108e 100644 --- a/src/libopts/option-value-type.c +++ b/src/libopts/option-value-type.c @@ -2,7 +2,7 @@ * * DO NOT EDIT THIS FILE (stdin.c) * - * It has been AutoGen-ed May 17, 2014 at 07:49:46 AM by AutoGen 5.18.3 + * It has been AutoGen-ed * From the definitions stdin * and the template file str2enum * diff --git a/src/libopts/option-value-type.h b/src/libopts/option-value-type.h index 4688f7a55b..cf6dcaadb8 100644 --- a/src/libopts/option-value-type.h +++ b/src/libopts/option-value-type.h @@ -2,7 +2,7 @@ * * DO NOT EDIT THIS FILE (stdin.h) * - * It has been AutoGen-ed May 17, 2014 at 07:49:46 AM by AutoGen 5.18.3 + * It has been AutoGen-ed * From the definitions stdin * and the template file str2enum * diff --git a/src/libopts/option-xat-attribute.c b/src/libopts/option-xat-attribute.c index c97bf5edc4..0fffd3059b 100644 --- a/src/libopts/option-xat-attribute.c +++ b/src/libopts/option-xat-attribute.c @@ -2,7 +2,7 @@ * * DO NOT EDIT THIS FILE (stdin.c) * - * It has been AutoGen-ed May 17, 2014 at 07:49:45 AM by AutoGen 5.18.3 + * It has been AutoGen-ed * From the definitions stdin * and the template file str2enum * diff --git a/src/libopts/option-xat-attribute.h b/src/libopts/option-xat-attribute.h index b260c7bf87..dde1617a44 100644 --- a/src/libopts/option-xat-attribute.h +++ b/src/libopts/option-xat-attribute.h @@ -2,7 +2,7 @@ * * DO NOT EDIT THIS FILE (stdin.h) * - * It has been AutoGen-ed May 17, 2014 at 07:49:45 AM by AutoGen 5.18.3 + * It has been AutoGen-ed * From the definitions stdin * and the template file str2enum * diff --git a/src/libopts/parse-duration.c b/src/libopts/parse-duration.c index 9efd881f62..ff3fe4228f 100644 --- a/src/libopts/parse-duration.c +++ b/src/libopts/parse-duration.c @@ -27,6 +27,8 @@ #include <stdlib.h> #include <string.h> +#include "intprops.h" + #ifndef NUL #define NUL '\0' #endif @@ -51,7 +53,8 @@ typedef enum { #define SEC_PER_MONTH (SEC_PER_DAY * 30) #define SEC_PER_YEAR (SEC_PER_DAY * 365) -#define TIME_MAX 0x7FFFFFFF +#undef MAX_DURATION +#define MAX_DURATION TYPE_MAXIMUM(time_t) /* Wrapper around strtoul that does not require a cast. */ static unsigned long @@ -80,14 +83,14 @@ scale_n_add (time_t base, time_t val, int scale) return BAD_TIME; } - if (val > TIME_MAX / scale) + if (val > MAX_DURATION / scale) { errno = ERANGE; return BAD_TIME; } val *= scale; - if (base > TIME_MAX - val) + if (base > MAX_DURATION - val) { errno = ERANGE; return BAD_TIME; diff --git a/src/libopts/proto.h b/src/libopts/proto.h index 8745b3c5f8..591999fce5 100644 --- a/src/libopts/proto.h +++ b/src/libopts/proto.h @@ -1,7 +1,7 @@ /* -*- buffer-read-only: t -*- vi: set ro: * * Prototypes for autoopts - * Generated Sat May 17 07:49:59 PDT 2014 + * Generated Sat Aug 30 10:36:38 PDT 2014 */ #ifndef AUTOOPTS_PROTO_H_GUARD #define AUTOOPTS_PROTO_H_GUARD 1 diff --git a/src/libopts/stdnoreturn.in.h b/src/libopts/stdnoreturn.in.h new file mode 100644 index 0000000000..d4ae183ce6 --- /dev/null +++ b/src/libopts/stdnoreturn.in.h @@ -0,0 +1,50 @@ +/* A substitute for ISO C11 <stdnoreturn.h>. + + Copyright 2012-2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1, 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see <http://www.gnu.org/licenses/>. */ + +/* Written by Paul Eggert. */ + +#ifndef noreturn + +/* ISO C11 <stdnoreturn.h> for platforms that lack it. + + References: + ISO C11 (latest free draft + <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf>) + section 7.23 */ + +/* The definition of _Noreturn is copied here. */ + +#if 1200 <= _MSC_VER +/* Standard include files on this platform contain declarations like + "__declspec (noreturn) void abort (void);". "#define noreturn + _Noreturn" would cause this declaration to be rewritten to the + invalid "__declspec (__declspec (noreturn)) void abort (void);". + Instead, define noreturn to empty, so that such declarations are + rewritten to "__declspec () void abort (void);", which is + equivalent to "void abort (void);"; this gives up on noreturn's + advice to the compiler but at least it is valid code. */ +# define noreturn /*empty*/ +#else +# define noreturn _Noreturn +#endif + +/* Did he ever return? + No he never returned + And his fate is still unlearn'd ... + -- Steiner J, Hawes BL. M.T.A. (1949) */ + +#endif /* noreturn */ diff --git a/src/libopts/version.c b/src/libopts/version.c index 3aaa288297..1516c147f8 100644 --- a/src/libopts/version.c +++ b/src/libopts/version.c @@ -135,7 +135,7 @@ emit_copy_note(tOptions * opts, FILE * fp) * is being requested and select the correct printing routine. */ static void -print_ver(tOptions * opts, tOptDesc * od, FILE * fp) +print_ver(tOptions * opts, tOptDesc * od, FILE * fp, bool call_exit) { char ch; @@ -174,11 +174,11 @@ print_ver(tOptions * opts, tOptDesc * od, FILE * fp) fserr_exit(opts->pzProgName, zwriting, (fp == stdout) ? zstdout_name : zstderr_name); - option_exits(EXIT_SUCCESS); + if (call_exit) + option_exits(EXIT_SUCCESS); } /*=export_func optionPrintVersion - * private: * * what: Print the program version * arg: + tOptions* + opts + program options descriptor + @@ -190,7 +190,25 @@ print_ver(tOptions * opts, tOptDesc * od, FILE * fp) void optionPrintVersion(tOptions * opts, tOptDesc * od) { - print_ver(opts, od, print_exit ? stderr : stdout); + print_ver(opts, od, print_exit ? stderr : stdout, true); +} + +/*=export_func optionPrintVersionAndReturn + * + * what: Print the program version + * arg: + tOptions* + opts + program options descriptor + + * arg: + tOptDesc* + od + the descriptor for this arg + + * + * doc: + * This routine will print the version to stdout and return + * instead of exiting. Please see the source for the + * @code{print_ver} funtion for details on selecting how + * verbose to be after this function returns. +=*/ +void +optionPrintVersionAndReturn(tOptions * opts, tOptDesc * od) +{ + print_ver(opts, od, print_exit ? stderr : stdout, false); } /*=export_func optionVersionStderr @@ -206,7 +224,7 @@ optionPrintVersion(tOptions * opts, tOptDesc * od) void optionVersionStderr(tOptions * opts, tOptDesc * od) { - print_ver(opts, od, stderr); + print_ver(opts, od, stderr, true); } /** @} |