From ca50ebd4dfd08dfd7e8c8bb087278e158cd67720 Mon Sep 17 00:00:00 2001 From: Mark Adler Date: Sat, 3 Dec 2016 10:27:14 -0800 Subject: [PATCH] Create z_size_t and z_ssize_t types. Normally these are set to size_t and ssize_t. But if they do not exist, then they are set to the smallest integer type that can contain a pointer. size_t is unsigned and ssize_t is signed. --- configure | 106 ++++++++++++++++++++++++++++++++++++++++++------ gzlib.c | 4 +- gzread.c | 2 +- gzwrite.c | 2 +- test/minigzip.c | 2 +- zconf.h | 15 +++++++ zconf.h.cmakein | 15 +++++++ zconf.h.in | 15 +++++++ 8 files changed, 144 insertions(+), 17 deletions(-) diff --git a/configure b/configure index 9f2e82e..f60585b 100755 --- a/configure +++ b/configure @@ -181,9 +181,12 @@ show $cc -c $test.c if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then echo ... using gcc >> configure.log CC="$cc" - CFLAGS="${CFLAGS--O3} ${ARCHS}" + CFLAGS="${CFLAGS--O3}" SFLAGS="${CFLAGS--O3} -fPIC" - LDFLAGS="${LDFLAGS} ${ARCHS}" + if test "$ARCHS"; then + CFLAGS="${CFLAGS} ${ARCHS}" + LDFLAGS="${LDFLAGS} ${ARCHS}" + fi if test $build64 -eq 1; then CFLAGS="${CFLAGS} -m64" SFLAGS="${SFLAGS} -m64" @@ -360,16 +363,16 @@ if ($CC -c $CFLAGS $test.c) 2>/dev/null; then } echo - using any output from compiler to indicate an error >> configure.log else -try() -{ - show $* - ( $* ) >> configure.log 2>&1 - ret=$? - if test $ret -ne 0; then - echo "(exit code "$ret")" >> configure.log - fi - return $ret -} + try() + { + show $* + ( $* ) >> configure.log 2>&1 + ret=$? + if test $ret -ne 0; then + echo "(exit code "$ret")" >> configure.log + fi + return $ret + } fi tryboth() @@ -445,6 +448,85 @@ esac echo >> configure.log +# check for size_t +cat > $test.c < +#include +size_t dummy = 0; +EOF +if try $CC -c $CFLAGS $test.c; then + echo "Checking for size_t... Yes." | tee -a configure.log + need_sizet=0 +else + echo "Checking for size_t... No." | tee -a configure.log + need_sizet=1 +fi + +echo >> configure.log + +# check for ssize_t +cat > $test.c < +ssize_t dummy = 0; +EOF +if try $CC -c $CFLAGS $test.c; then + echo "Checking for ssize_t... Yes." | tee -a configure.log + need_ssizet=0 +else + echo "Checking for ssize_t... No." | tee -a configure.log + need_ssizet=1 +fi + +echo >> configure.log + +# find the size_t integer type, if needed +if test $need_sizet -eq 1 -o $need_ssizet -eq 1; then + cat > $test.c < $test.c < +int main(void) { + if (sizeof(void *) <= sizeof(int)) puts("int"); + else if (sizeof(void *) <= sizeof(long)) puts("long"); + else puts("long long"); + return 0; +} +EOF + else + echo "Checking for long long... No." | tee -a configure.log + cat > $test.c < +int main(void) { + if (sizeof(void *) <= sizeof(int)) puts("int"); + else puts("long"); + return 0; +} +EOF + fi + if try $CC $CFLAGS -o $test $test.c; then + sizet=`./$test` + echo "Checking for a pointer-size integer type..." $sizet"." | tee -a configure.log + else + echo "Failed to find a pointer-size integer type." | tee -a configure.log + leave 1 + fi +fi + +if test $need_sizet -eq 1; then + CFLAGS="${CFLAGS} -DNO_SIZE_T=${sizet}" + SFLAGS="${SFLAGS} -DNO_SIZE_T=${sizet}" +fi + +if test $need_ssizet -eq 1; then + CFLAGS="${CFLAGS} -DNO_SSIZE_T=${sizet}" + SFLAGS="${SFLAGS} -DNO_SSIZE_T=${sizet}" +fi + +echo >> configure.log + # check for large file support, and if none, check for fseeko() cat > $test.c < diff --git a/gzlib.c b/gzlib.c index a52c55b..3b2b71b 100644 --- a/gzlib.c +++ b/gzlib.c @@ -94,7 +94,7 @@ local gzFile gz_open(path, fd, mode) const char *mode; { gz_statep state; - size_t len; + z_size_t len; int oflag; #ifdef O_CLOEXEC int cloexec = 0; @@ -191,7 +191,7 @@ local gzFile gz_open(path, fd, mode) #ifdef WIDECHAR if (fd == -2) { len = wcstombs(NULL, path, 0); - if (len == (size_t)-1) + if (len == (z_size_t)-1) len = 0; } else diff --git a/gzread.c b/gzread.c index d41704a..b05229e 100644 --- a/gzread.c +++ b/gzread.c @@ -23,7 +23,7 @@ local int gz_load(state, buf, len, have) unsigned len; unsigned *have; { - ssize_t ret; + z_ssize_t ret; *have = 0; do { diff --git a/gzwrite.c b/gzwrite.c index 61a4de7..eb73d9c 100644 --- a/gzwrite.c +++ b/gzwrite.c @@ -74,7 +74,7 @@ local int gz_comp(state, flush) int flush; { int ret; - ssize_t got; + z_ssize_t got; unsigned have; z_streamp strm = &(state->strm); diff --git a/test/minigzip.c b/test/minigzip.c index f4ffbe2..6c64cc7 100644 --- a/test/minigzip.c +++ b/test/minigzip.c @@ -500,7 +500,7 @@ void file_uncompress(file) char *infile, *outfile; FILE *out; gzFile in; - size_t len = strlen(file); + z_size_t len = strlen(file); if (len + strlen(GZ_SUFFIX) >= sizeof(buf)) { fprintf(stderr, "%s: filename too long\n", prog); diff --git a/zconf.h b/zconf.h index d09f186..2c22d32 100644 --- a/zconf.h +++ b/zconf.h @@ -224,6 +224,21 @@ # define z_const #endif +#ifndef Z_SOLO +# ifdef NO_SIZE_T + typedef unsigned NO_SIZE_T z_size_t; +# else +# include + typedef size_t z_size_t; +# endif +# ifdef NO_SSIZE_T + typedef NO_SSIZE_T z_ssize_t; +# else +# include + typedef ssize_t z_ssize_t; +# endif +#endif + /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K diff --git a/zconf.h.cmakein b/zconf.h.cmakein index 70942e4..662fc3d 100644 --- a/zconf.h.cmakein +++ b/zconf.h.cmakein @@ -226,6 +226,21 @@ # define z_const #endif +#ifndef Z_SOLO +# ifdef NO_SIZE_T + typedef unsigned NO_SIZE_T z_size_t; +# else +# include + typedef size_t z_size_t; +# endif +# ifdef NO_SSIZE_T + typedef NO_SSIZE_T z_ssize_t; +# else +# include + typedef ssize_t z_ssize_t; +# endif +#endif + /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K diff --git a/zconf.h.in b/zconf.h.in index d09f186..2c22d32 100644 --- a/zconf.h.in +++ b/zconf.h.in @@ -224,6 +224,21 @@ # define z_const #endif +#ifndef Z_SOLO +# ifdef NO_SIZE_T + typedef unsigned NO_SIZE_T z_size_t; +# else +# include + typedef size_t z_size_t; +# endif +# ifdef NO_SSIZE_T + typedef NO_SSIZE_T z_ssize_t; +# else +# include + typedef ssize_t z_ssize_t; +# endif +#endif + /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K -- GitLab