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.
diff --git a/configure b/configure
index 9f2e82e..f60585b 100755
--- a/configure
+++ b/configure
@@ -181,9 +181,12 @@
 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 @@
   }
   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 @@
 
 echo >> configure.log
 
+# check for size_t
+cat > $test.c <<EOF
+#include <stdio.h>
+#include <stdlib.h>
+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 <<EOF
+#include <sys/types.h>
+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 <<EOF
+long long dummy = 0;
+EOF
+  if try $CC -c $CFLAGS $test.c; then
+    echo "Checking for long long... Yes." | tee -a configure.log
+    cat > $test.c <<EOF
+#include <stdio.h>
+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 <<EOF
+#include <stdio.h>
+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 <<EOF
 #include <sys/types.h>
diff --git a/gzlib.c b/gzlib.c
index a52c55b..3b2b71b 100644
--- a/gzlib.c
+++ b/gzlib.c
@@ -94,7 +94,7 @@
     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 @@
 #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 @@
     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 @@
     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 @@
     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 <stddef.h>
+     typedef size_t z_size_t;
+#  endif
+#  ifdef NO_SSIZE_T
+     typedef NO_SSIZE_T z_ssize_t;
+#  else
+#    include <sys/types.h>
+     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 <stddef.h>
+     typedef size_t z_size_t;
+#  endif
+#  ifdef NO_SSIZE_T
+     typedef NO_SSIZE_T z_ssize_t;
+#  else
+#    include <sys/types.h>
+     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 <stddef.h>
+     typedef size_t z_size_t;
+#  endif
+#  ifdef NO_SSIZE_T
+     typedef NO_SSIZE_T z_ssize_t;
+#  else
+#    include <sys/types.h>
+     typedef ssize_t z_ssize_t;
+#  endif
+#endif
+
 /* Maximum value for memLevel in deflateInit2 */
 #ifndef MAX_MEM_LEVEL
 #  ifdef MAXSEG_64K