[Spread-cvs] commit: r255 - in vendor/stdutil/current/src: .
stdtest stdutil stdutil/private
jonathan at spread.org
jonathan at spread.org
Sat Aug 6 08:40:27 EDT 2005
Author: jonathan
Date: 2005-08-06 08:40:26 -0400 (Sat, 06 Aug 2005)
New Revision: 255
Added:
vendor/stdutil/current/src/stdtest/stdskl_test.cpp
Modified:
vendor/stdutil/current/src/Makefile.in
vendor/stdutil/current/src/configure
vendor/stdutil/current/src/configure.in
vendor/stdutil/current/src/stddll.c
vendor/stdutil/current/src/stderror.c
vendor/stdutil/current/src/stdfd.c
vendor/stdutil/current/src/stdhash.c
vendor/stdutil/current/src/stdit.c
vendor/stdutil/current/src/stdskl.c
vendor/stdutil/current/src/stdthread.c
vendor/stdutil/current/src/stdutil.c
vendor/stdutil/current/src/stdutil/private/stdarch.h.in
vendor/stdutil/current/src/stdutil/private/stdskl_p.h
vendor/stdutil/current/src/stdutil/private/stdthread_p.h
vendor/stdutil/current/src/stdutil/stddefines.h
vendor/stdutil/current/src/stdutil/stderror.h
vendor/stdutil/current/src/stdutil/stdfd.h
vendor/stdutil/current/src/stdutil/stdit.h
vendor/stdutil/current/src/stdutil/stdthread.h
vendor/stdutil/current/src/stdutil/stdtime.h
vendor/stdutil/current/src/stdutil/stdutil.h
Log:
Import stdutil 1.0.0-beta2 release 8/5/05
Modified: vendor/stdutil/current/src/Makefile.in
===================================================================
--- vendor/stdutil/current/src/Makefile.in 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/Makefile.in 2005-08-06 12:40:26 UTC (rev 255)
@@ -15,7 +15,7 @@
CFLAGS += -DSTDBOUNDS_CHECKS
# other flags
-CFLAGS += -fPIC -Wall -O2 -I ./
+CFLAGS += -fPIC -g -Wall -O2 -I ./
# add pthreads library if necessary
LIBS = @LIBS@
Modified: vendor/stdutil/current/src/configure
===================================================================
--- vendor/stdutil/current/src/configure 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/configure 2005-08-06 12:40:26 UTC (rev 255)
@@ -5725,15 +5725,12 @@
-echo "$as_me:$LINENO: checking checking all necessary integer types are defined" >&5
-echo $ECHO_N "checking checking all necessary integer types are defined... $ECHO_C" >&6
+echo "$as_me:$LINENO: checking checking all necessary integer types are available and appropriate" >&5
+echo $ECHO_N "checking checking all necessary integer types are available and appropriate... $ECHO_C" >&6
if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
+ { echo "$as_me:$LINENO: WARNING: Unable to check due to cross compiling! ASSUMING NECESSARY INTEGER TYPES EXIST! Please check that stdutil/private/stdarch.h is correct for your target platform!" >&5
+echo "$as_me: WARNING: Unable to check due to cross compiling! ASSUMING NECESSARY INTEGER TYPES EXIST! Please check that stdutil/private/stdarch.h is correct for your target platform!" >&2;}
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
@@ -5742,6 +5739,8 @@
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
+#include <stdlib.h>
+
#if (SIZEOF_CHAR != 1)
# error No 1 byte integer type found!
#endif
@@ -5754,7 +5753,7 @@
# error No 4 byte integer type found!
#endif
-#if (!defined(_WIN32) && SIZEOF_LONG != 8 && SIZEOF_LONG_LONG != 8)
+#if (!defined(_MSC_VER) && SIZEOF_LONG != 8 && SIZEOF_LONG_LONG != 8)
# error No 8 byte integeral type found!
#endif
@@ -5762,7 +5761,7 @@
# error No integral type of same size as size_t!
#endif
-int main() { return 0; }
+int main() { exit(0); return 0; }
_ACEOF
@@ -5785,13 +5784,227 @@
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: one or more required integer sizes not found or of really unexpected size please fix stdutil/private/stdarch.h.in!" >&5
-echo "$as_me: error: one or more required integer sizes not found or of really unexpected size please fix stdutil/private/stdarch.h.in!" >&2;}
+{ { echo "$as_me:$LINENO: error: test failed! Please fix stdutil/private/stdarch.h.in for your platform! Please note platform must have a built in 64b integer type! Alternatively, configure.in could be broken!" >&5
+echo "$as_me: error: test failed! Please fix stdutil/private/stdarch.h.in for your platform! Please note platform must have a built in 64b integer type! Alternatively, configure.in could be broken!" >&2;}
{ (exit 1); exit 1; }; }
fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+echo "$as_me:$LINENO: checking if NULL pointers are zeroes in memory" >&5
+echo $ECHO_N "checking if NULL pointers are zeroes in memory... $ECHO_C" >&6
+
+if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Unable to check due to cross compiling! ASSUMING NULL IS ZERO IN MEMORY! To change this please correct stdutil/private/stdarch.h!" >&5
+echo "$as_me: WARNING: Unable to check due to cross compiling! ASSUMING NULL IS ZERO IN MEMORY! To change this please correct stdutil/private/stdarch.h!" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef struct test_struct {
+ void * r;
+ int y;
+ double x;
+ long z;
+ char str[348];
+ struct test_struct * next;
+ struct test_struct * prev;
+
+} test_struct;
+
+int main()
+{
+ void * voidp = NULL;
+ char * charp = NULL;
+ short * shortp = NULL;
+ int * intp = NULL;
+ long * longp = NULL;
+ float * floatp = NULL;
+ double * doublep = NULL;
+ test_struct * structp = NULL;
+ char zeroes[sizeof(test_struct)];
+
+ memset(zeroes, 0, sizeof(zeroes));
+
+ if (memcmp(&voidp, zeroes, sizeof(voidp)) != 0 ||
+ memcmp(&charp, zeroes, sizeof(charp)) != 0 ||
+ memcmp(&shortp, zeroes, sizeof(shortp)) != 0 ||
+ memcmp(&intp, zeroes, sizeof(intp)) != 0 ||
+ memcmp(&longp, zeroes, sizeof(longp)) != 0 ||
+ memcmp(&floatp, zeroes, sizeof(floatp)) != 0 ||
+ memcmp(&doublep, zeroes, sizeof(doublep)) != 0 ||
+ memcmp(&structp, zeroes, sizeof(structp)) != 0) {
+ exit(100);
+ }
+
+ exit(0);
+ return 0;
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cat >>confdefs.h <<\_ACEOF
+#define STDARCH_NULL_IS_ZERO 1
+_ACEOF
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+
+if test $? -eq 100; then
+ echo "$as_me:$LINENO: result: no ... weird platform" >&5
+echo "${ECHO_T}no ... weird platform" >&6
+else
+ { { echo "$as_me:$LINENO: error: failed! Please fix configure.in!" >&5
+echo "$as_me: error: failed! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+echo "$as_me:$LINENO: checking byte alignment requirements" >&5
+echo $ECHO_N "checking byte alignment requirements... $ECHO_C" >&6
+
+if test "$cross_compiling" = yes; then
+ cat >>confdefs.h <<\_ACEOF
+#define STDARCH_MAX_BYTE_ALIGNMENT 4
+_ACEOF
+
+ { echo "$as_me:$LINENO: WARNING: Unable to check due to cross compiling! ASSUMING ALIGNMENT TO 4 BYTE BOUNDARY IS GOOD ENOUGH! To change this please correct stdutil/private/stdarch.h!" >&5
+echo "$as_me: WARNING: Unable to check due to cross compiling! ASSUMING ALIGNMENT TO 4 BYTE BOUNDARY IS GOOD ENOUGH! To change this please correct stdutil/private/stdarch.h!" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stddef.h>
+
+struct {
+ char x;
+ long y;
+
+} long_test;
+
+struct {
+ char x;
+#if defined(_MSC_VER)
+ __int64 y;
+#elif (SIZEOF_LONG == 8)
+ long y;
+#elif (SIZEOF_LONG_LONG == 8)
+ long long y;
+#endif
+
+} int64_test;
+
+struct {
+ char x;
+ long double y;
+
+} long_double_test;
+
+struct {
+ char x;
+ void * y;
+
+} voidp_test;
+
+int main()
+{
+ ptrdiff_t max = (char*) &long_test.y - (char*) &long_test.x;
+ ptrdiff_t tmp;
+
+ tmp = (char*) &int64_test.y - (char*) &int64_test.x;
+
+ if (tmp > max) {
+ max = tmp;
+ }
+
+ tmp = (char*) &voidp_test.y - (char*) &voidp_test.x;
+
+ if (tmp > max) {
+ max = tmp;
+ }
+
+ tmp = (char*) &long_double_test.y - (char*) &long_double_test.x;
+
+ if (tmp > max) {
+ max = tmp;
+ }
+
+ exit(100 + (int) max);
+ return 100 + (int) max;
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ { { echo "$as_me:$LINENO: error: test failed (returned 0)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (returned 0)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+
+tmp=$?
+if test $tmp -gt 100 && test $tmp -le 116; then
+ tmp=$(($tmp - 100))
+ cat >>confdefs.h <<_ACEOF
+#define STDARCH_MAX_BYTE_ALIGNMENT $tmp
+_ACEOF
+
+ echo "$as_me:$LINENO: result: $tmp" >&5
+echo "${ECHO_T}$tmp" >&6
+else
+ { { echo "$as_me:$LINENO: error: test failed (invalid/unexpected return value)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (invalid/unexpected return value)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
echo "$as_me:$LINENO: checking endianness of architecture" >&5
echo $ECHO_N "checking endianness of architecture... $ECHO_C" >&6
@@ -5815,8 +6028,8 @@
short x = 0x1;
char * xptr = (char*) &x;
- exit(xptr[0] == 1); /* return 1 if bytes are opposite of network order, else 0 */
- return xptr[0] == 1;
+ exit(100 + (xptr[0] == 1)); /* return 101 if bytes are opposite of network order, else 100 */
+ return 100 + (xptr[0] == 1);
}
_ACEOF
@@ -5831,21 +6044,30 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cat >>confdefs.h <<\_ACEOF
-#define STDENDIAN16_SWAP 0
-_ACEOF
-
+ { { echo "$as_me:$LINENO: error: test failed (returned 0)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (returned 0)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-cat >>confdefs.h <<\_ACEOF
-#define STDENDIAN16_SWAP 1
+
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 101; then
+ tmp=$(($tmp - 100))
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN16_SWAP $tmp
_ACEOF
+else
+ { { echo "$as_me:$LINENO: error: test failed (invalid return value)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (invalid return value)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
fi
+
+fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
@@ -5853,7 +6075,7 @@
cat >>confdefs.h <<_ACEOF
#define STDENDIAN32_NET0_FROM_HOST 3
_ACEOF
- cat >>confdefs.h <<_ACEOF
+ cat >>confdefs.h <<_ACEOF
#define STDENDIAN32_HOST3_FROM_NET 0
_ACEOF
@@ -5881,8 +6103,8 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
_ACEOF
@@ -5897,28 +6119,34 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_NET0_FROM_HOST 0
-_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_HOST0_FROM_NET 0
-_ACEOF
-
+ { { echo "$as_me:$LINENO: error: test failed (returned 0)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (returned 0)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-temp=$?;
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_NET0_FROM_HOST $temp
+
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 103; then
+ tmp=$(($tmp - 100))
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN32_NET0_FROM_HOST $tmp
_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_HOST${temp}_FROM_NET 0
+
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN32_HOST${tmp}_FROM_NET 0
_ACEOF
+else
+ { { echo "$as_me:$LINENO: error: test failed (invalid return value)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (invalid return value)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
fi
+
+fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
@@ -5926,7 +6154,7 @@
cat >>confdefs.h <<_ACEOF
#define STDENDIAN32_NET1_FROM_HOST 2
_ACEOF
- cat >>confdefs.h <<_ACEOF
+ cat >>confdefs.h <<_ACEOF
#define STDENDIAN32_HOST2_FROM_NET 1
_ACEOF
@@ -5954,8 +6182,8 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
_ACEOF
@@ -5970,28 +6198,34 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_NET1_FROM_HOST 0
-_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_HOST0_FROM_NET 1
-_ACEOF
-
+ { { echo "$as_me:$LINENO: error: test failed (returned 0)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (returned 0)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-temp=$?;
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_NET1_FROM_HOST $temp
+
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 103; then
+ tmp=$(($tmp - 100))
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN32_NET1_FROM_HOST $tmp
_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_HOST${temp}_FROM_NET 1
+
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN32_HOST${tmp}_FROM_NET 1
_ACEOF
+else
+ { { echo "$as_me:$LINENO: error: test failed (invalid return value)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (invalid return value)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
fi
+
+fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
@@ -5999,7 +6233,7 @@
cat >>confdefs.h <<_ACEOF
#define STDENDIAN32_NET2_FROM_HOST 1
_ACEOF
- cat >>confdefs.h <<_ACEOF
+ cat >>confdefs.h <<_ACEOF
#define STDENDIAN32_HOST1_FROM_NET 2
_ACEOF
@@ -6027,8 +6261,8 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
_ACEOF
@@ -6043,28 +6277,34 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_NET2_FROM_HOST 0
-_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_HOST0_FROM_NET 2
-_ACEOF
-
+ { { echo "$as_me:$LINENO: error: test failed (returned 0)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (returned 0)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-temp=$?;
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_NET2_FROM_HOST $temp
+
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 103; then
+ tmp=$(($tmp - 100))
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN32_NET2_FROM_HOST $tmp
_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_HOST${temp}_FROM_NET 2
+
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN32_HOST${tmp}_FROM_NET 2
_ACEOF
+else
+ { { echo "$as_me:$LINENO: error: test failed (invalid return value)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (invalid return value)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
fi
+
+fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
@@ -6072,7 +6312,7 @@
cat >>confdefs.h <<_ACEOF
#define STDENDIAN32_NET3_FROM_HOST 0
_ACEOF
- cat >>confdefs.h <<_ACEOF
+ cat >>confdefs.h <<_ACEOF
#define STDENDIAN32_HOST0_FROM_NET 3
_ACEOF
@@ -6100,8 +6340,8 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
_ACEOF
@@ -6116,28 +6356,34 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_NET3_FROM_HOST 0
-_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_HOST0_FROM_NET 3
-_ACEOF
-
+ { { echo "$as_me:$LINENO: error: test failed (returned 0)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (returned 0)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-temp=$?;
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_NET3_FROM_HOST $temp
+
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 103; then
+ tmp=$(($tmp - 100))
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN32_NET3_FROM_HOST $tmp
_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN32_HOST${temp}_FROM_NET 3
+
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN32_HOST${tmp}_FROM_NET 3
_ACEOF
+else
+ { { echo "$as_me:$LINENO: error: test failed (invalid return value)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (invalid return value)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
fi
+
+fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
@@ -6145,7 +6391,7 @@
cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_NET0_FROM_HOST 7
_ACEOF
- cat >>confdefs.h <<_ACEOF
+ cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_HOST7_FROM_NET 0
_ACEOF
@@ -6161,7 +6407,7 @@
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -6175,8 +6421,8 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
_ACEOF
@@ -6191,28 +6437,34 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET0_FROM_HOST 0
-_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST0_FROM_NET 0
-_ACEOF
-
+ { { echo "$as_me:$LINENO: error: test failed (returned 0)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (returned 0)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-temp=$?;
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET0_FROM_HOST $temp
+
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_NET0_FROM_HOST $tmp
_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST${temp}_FROM_NET 0
+
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_HOST${tmp}_FROM_NET 0
_ACEOF
+else
+ { { echo "$as_me:$LINENO: error: test failed (invalid return value)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (invalid return value)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
fi
+
+fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
@@ -6220,7 +6472,7 @@
cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_NET1_FROM_HOST 6
_ACEOF
- cat >>confdefs.h <<_ACEOF
+ cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_HOST6_FROM_NET 1
_ACEOF
@@ -6236,7 +6488,7 @@
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -6250,8 +6502,8 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
_ACEOF
@@ -6266,28 +6518,34 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET1_FROM_HOST 0
-_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST0_FROM_NET 1
-_ACEOF
-
+ { { echo "$as_me:$LINENO: error: test failed (returned 0)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (returned 0)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-temp=$?;
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET1_FROM_HOST $temp
+
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_NET1_FROM_HOST $tmp
_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST${temp}_FROM_NET 1
+
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_HOST${tmp}_FROM_NET 1
_ACEOF
+else
+ { { echo "$as_me:$LINENO: error: test failed (invalid return value)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (invalid return value)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
fi
+
+fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
@@ -6295,7 +6553,7 @@
cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_NET2_FROM_HOST 5
_ACEOF
- cat >>confdefs.h <<_ACEOF
+ cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_HOST5_FROM_NET 2
_ACEOF
@@ -6311,7 +6569,7 @@
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -6325,8 +6583,8 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
_ACEOF
@@ -6341,28 +6599,34 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET2_FROM_HOST 0
-_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST0_FROM_NET 2
-_ACEOF
-
+ { { echo "$as_me:$LINENO: error: test failed (returned 0)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (returned 0)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-temp=$?;
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET2_FROM_HOST $temp
+
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_NET2_FROM_HOST $tmp
_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST${temp}_FROM_NET 2
+
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_HOST${tmp}_FROM_NET 2
_ACEOF
+else
+ { { echo "$as_me:$LINENO: error: test failed (invalid return value)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (invalid return value)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
fi
+
+fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
@@ -6370,7 +6634,7 @@
cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_NET3_FROM_HOST 4
_ACEOF
- cat >>confdefs.h <<_ACEOF
+ cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_HOST4_FROM_NET 3
_ACEOF
@@ -6386,7 +6650,7 @@
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -6400,8 +6664,8 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
_ACEOF
@@ -6416,28 +6680,34 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET3_FROM_HOST 0
-_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST0_FROM_NET 3
-_ACEOF
-
+ { { echo "$as_me:$LINENO: error: test failed (returned 0)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (returned 0)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-temp=$?;
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET3_FROM_HOST $temp
+
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_NET3_FROM_HOST $tmp
_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST${temp}_FROM_NET 3
+
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_HOST${tmp}_FROM_NET 3
_ACEOF
+else
+ { { echo "$as_me:$LINENO: error: test failed (invalid return value)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (invalid return value)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
fi
+
+fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
@@ -6445,7 +6715,7 @@
cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_NET4_FROM_HOST 3
_ACEOF
- cat >>confdefs.h <<_ACEOF
+ cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_HOST3_FROM_NET 4
_ACEOF
@@ -6461,7 +6731,7 @@
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -6475,8 +6745,8 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
_ACEOF
@@ -6491,28 +6761,34 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET4_FROM_HOST 0
-_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST0_FROM_NET 4
-_ACEOF
-
+ { { echo "$as_me:$LINENO: error: test failed (returned 0)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (returned 0)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-temp=$?;
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET4_FROM_HOST $temp
+
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_NET4_FROM_HOST $tmp
_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST${temp}_FROM_NET 4
+
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_HOST${tmp}_FROM_NET 4
_ACEOF
+else
+ { { echo "$as_me:$LINENO: error: test failed (invalid return value)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (invalid return value)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
fi
+
+fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
@@ -6520,7 +6796,7 @@
cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_NET5_FROM_HOST 2
_ACEOF
- cat >>confdefs.h <<_ACEOF
+ cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_HOST2_FROM_NET 5
_ACEOF
@@ -6536,7 +6812,7 @@
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -6550,8 +6826,8 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
_ACEOF
@@ -6566,28 +6842,34 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET5_FROM_HOST 0
-_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST0_FROM_NET 5
-_ACEOF
-
+ { { echo "$as_me:$LINENO: error: test failed (returned 0)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (returned 0)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-temp=$?;
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET5_FROM_HOST $temp
+
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_NET5_FROM_HOST $tmp
_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST${temp}_FROM_NET 5
+
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_HOST${tmp}_FROM_NET 5
_ACEOF
+else
+ { { echo "$as_me:$LINENO: error: test failed (invalid return value)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (invalid return value)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
fi
+
+fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
@@ -6595,7 +6877,7 @@
cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_NET6_FROM_HOST 1
_ACEOF
- cat >>confdefs.h <<_ACEOF
+ cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_HOST1_FROM_NET 6
_ACEOF
@@ -6611,7 +6893,7 @@
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -6625,8 +6907,8 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
_ACEOF
@@ -6641,28 +6923,34 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET6_FROM_HOST 0
-_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST0_FROM_NET 6
-_ACEOF
-
+ { { echo "$as_me:$LINENO: error: test failed (returned 0)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (returned 0)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-temp=$?;
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET6_FROM_HOST $temp
+
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_NET6_FROM_HOST $tmp
_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST${temp}_FROM_NET 6
+
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_HOST${tmp}_FROM_NET 6
_ACEOF
+else
+ { { echo "$as_me:$LINENO: error: test failed (invalid return value)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (invalid return value)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
fi
+
+fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
@@ -6670,11 +6958,11 @@
cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_NET7_FROM_HOST 0
_ACEOF
- cat >>confdefs.h <<_ACEOF
+ cat >>confdefs.h <<_ACEOF
#define STDENDIAN64_HOST0_FROM_NET 7
_ACEOF
- { echo "$as_me:$LINENO: WARNING: Unable to check due to cross compiling! ASSUMING LITTLE ENDIAN ARCHITECTURE! To change this please see stdutil.c!" >&5
-echo "$as_me: WARNING: Unable to check due to cross compiling! ASSUMING LITTLE ENDIAN ARCHITECTURE! To change this please see stdutil.c!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: Unable to check due to cross compiling! ASSUMING LITTLE ENDIAN ARCHITECTURE! To change please fix stdutil/private/stdarch.h!" >&5
+echo "$as_me: WARNING: Unable to check due to cross compiling! ASSUMING LITTLE ENDIAN ARCHITECTURE! To change please fix stdutil/private/stdarch.h!" >&2;}
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
@@ -6687,7 +6975,7 @@
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -6701,8 +6989,8 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
_ACEOF
@@ -6717,30 +7005,36 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET7_FROM_HOST 0
-_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST0_FROM_NET 7
-_ACEOF
- echo "$as_me:$LINENO: result: done" >&5
-echo "${ECHO_T}done" >&6
+ { { echo "$as_me:$LINENO: error: test failed (returned 0)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (returned 0)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-temp=$?;
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_NET7_FROM_HOST $temp
+
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_NET7_FROM_HOST $tmp
_ACEOF
- cat >>confdefs.h <<_ACEOF
-#define STDENDIAN64_HOST${temp}_FROM_NET 7
+
+ cat >>confdefs.h <<_ACEOF
+#define STDENDIAN64_HOST${tmp}_FROM_NET 7
_ACEOF
- echo "$as_me:$LINENO: result: done" >&5
+
+ echo "$as_me:$LINENO: result: done" >&5
echo "${ECHO_T}done" >&6
+else
+ { { echo "$as_me:$LINENO: error: test failed (invalid return value)! Please fix configure.in!" >&5
+echo "$as_me: error: test failed (invalid return value)! Please fix configure.in!" >&2;}
+ { (exit 1); exit 1; }; }
fi
+
+fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
Modified: vendor/stdutil/current/src/configure.in
===================================================================
--- vendor/stdutil/current/src/configure.in 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/configure.in 2005-08-06 12:40:26 UTC (rev 255)
@@ -9,13 +9,15 @@
AC_CHECK_SIZEOF(short, 2)
AC_CHECK_SIZEOF(int, 4)
AC_CHECK_SIZEOF(long, 4)
-AC_CHECK_SIZEOF(long long, 8)
+AC_CHECK_SIZEOF([long long], 8)
AC_CHECK_SIZEOF(size_t, 4)
-AC_CHECK_SIZEOF(void *, 4)
+AC_CHECK_SIZEOF([void *], 4)
-AC_MSG_CHECKING(checking all necessary integer types are defined)
+AC_MSG_CHECKING([[checking all necessary integer types are available and appropriate]])
AC_TRY_RUN([
+#include <stdlib.h>
+
#if (SIZEOF_CHAR != 1)
# error No 1 byte integer type found!
#endif
@@ -28,7 +30,7 @@
# error No 4 byte integer type found!
#endif
-#if (!defined(_WIN32) && SIZEOF_LONG != 8 && SIZEOF_LONG_LONG != 8)
+#if (!defined(_MSC_VER) && SIZEOF_LONG != 8 && SIZEOF_LONG_LONG != 8)
# error No 8 byte integeral type found!
#endif
@@ -36,10 +38,146 @@
# error No integral type of same size as size_t!
#endif
-int main() { return 0; }
+int main() { exit(0); return 0; }
-], AC_MSG_RESULT(yes), AC_MSG_ERROR(one or more required integer sizes not found or of really unexpected size please fix stdutil/private/stdarch.h.in!))
+], AC_MSG_RESULT(yes),
+ AC_MSG_ERROR([[test failed! Please fix stdutil/private/stdarch.h.in for your platform! Please note platform must have a built in 64b integer type! Alternatively, configure.in could be broken!]]),
+ AC_MSG_WARN([[Unable to check due to cross compiling! ASSUMING NECESSARY INTEGER TYPES EXIST! Please check that stdutil/private/stdarch.h is correct for your target platform!]]))
+AC_MSG_CHECKING([[if NULL pointers are zeroes in memory]])
+
+AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef struct test_struct {
+ void * r;
+ int y;
+ double x;
+ long z;
+ char str[348];
+ struct test_struct * next;
+ struct test_struct * prev;
+
+} test_struct;
+
+int main()
+{
+ void * voidp = NULL;
+ char * charp = NULL;
+ short * shortp = NULL;
+ int * intp = NULL;
+ long * longp = NULL;
+ float * floatp = NULL;
+ double * doublep = NULL;
+ test_struct * structp = NULL;
+ char zeroes[sizeof(test_struct)];
+
+ memset(zeroes, 0, sizeof(zeroes));
+
+ if (memcmp(&voidp, zeroes, sizeof(voidp)) != 0 ||
+ memcmp(&charp, zeroes, sizeof(charp)) != 0 ||
+ memcmp(&shortp, zeroes, sizeof(shortp)) != 0 ||
+ memcmp(&intp, zeroes, sizeof(intp)) != 0 ||
+ memcmp(&longp, zeroes, sizeof(longp)) != 0 ||
+ memcmp(&floatp, zeroes, sizeof(floatp)) != 0 ||
+ memcmp(&doublep, zeroes, sizeof(doublep)) != 0 ||
+ memcmp(&structp, zeroes, sizeof(structp)) != 0) {
+ exit(100);
+ }
+
+ exit(0);
+ return 0;
+}
+],
+[AC_DEFINE(STDARCH_NULL_IS_ZERO) AC_MSG_RESULT(yes)],
+[
+if test $? -eq 100; then
+ AC_MSG_RESULT([[no ... weird platform]])
+else
+ AC_MSG_ERROR([[failed! Please fix configure.in!]])
+fi
+],
+AC_MSG_WARN([[Unable to check due to cross compiling! ASSUMING NULL IS ZERO IN MEMORY! To change this please correct stdutil/private/stdarch.h!]]))
+
+AC_MSG_CHECKING([[byte alignment requirements]])
+
+AC_TRY_RUN([
+#include <stdlib.h>
+#include <stddef.h>
+
+struct {
+ char x;
+ long y;
+
+} long_test;
+
+struct {
+ char x;
+#if defined(_MSC_VER)
+ __int64 y;
+#elif (SIZEOF_LONG == 8)
+ long y;
+#elif (SIZEOF_LONG_LONG == 8)
+ long long y;
+#endif
+
+} int64_test;
+
+struct {
+ char x;
+ long double y;
+
+} long_double_test;
+
+struct {
+ char x;
+ void * y;
+
+} voidp_test;
+
+int main()
+{
+ ptrdiff_t max = (char*) &long_test.y - (char*) &long_test.x;
+ ptrdiff_t tmp;
+
+ tmp = (char*) &int64_test.y - (char*) &int64_test.x;
+
+ if (tmp > max) {
+ max = tmp;
+ }
+
+ tmp = (char*) &voidp_test.y - (char*) &voidp_test.x;
+
+ if (tmp > max) {
+ max = tmp;
+ }
+
+ tmp = (char*) &long_double_test.y - (char*) &long_double_test.x;
+
+ if (tmp > max) {
+ max = tmp;
+ }
+
+ exit(100 + (int) max);
+ return 100 + (int) max;
+}
+],
+AC_MSG_ERROR([[test failed (returned 0)! Please fix configure.in!]]),
+[
+tmp=$?
+if test $tmp -gt 100 && test $tmp -le 116; then
+ tmp=$(($tmp - 100))
+ AC_DEFINE_UNQUOTED(STDARCH_MAX_BYTE_ALIGNMENT, $tmp)
+ AC_MSG_RESULT($tmp)
+else
+ AC_MSG_ERROR([[test failed (invalid/unexpected return value)! Please fix configure.in!]])
+fi
+],
+[AC_DEFINE(STDARCH_MAX_BYTE_ALIGNMENT, 4)
+ AC_MSG_WARN([[Unable to check due to cross compiling! ASSUMING ALIGNMENT TO 4 BYTE BOUNDARY IS GOOD ENOUGH! To change this please correct stdutil/private/stdarch.h!]])])
+
AC_MSG_CHECKING(endianness of architecture)
AC_TRY_RUN([
@@ -50,10 +188,21 @@
short x = 0x1;
char * xptr = (char*) &x;
- exit(xptr[0] == 1); /* return 1 if bytes are opposite of network order, else 0 */
- return xptr[0] == 1;
+ exit(100 + (xptr[0] == 1)); /* return 101 if bytes are opposite of network order, else 100 */
+ return 100 + (xptr[0] == 1);
}
-], AC_DEFINE(STDENDIAN16_SWAP, 0), AC_DEFINE(STDENDIAN16_SWAP, 1), AC_DEFINE(STDENDIAN16_SWAP, 1))
+],
+AC_MSG_ERROR([[test failed (returned 0)! Please fix configure.in!]]),
+[
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 101; then
+ tmp=$(($tmp - 100))
+ AC_DEFINE_UNQUOTED(STDENDIAN16_SWAP, $tmp)
+else
+ AC_MSG_ERROR([[test failed (invalid return value)! Please fix configure.in!]])
+fi
+],
+AC_DEFINE(STDENDIAN16_SWAP, 1))
AC_TRY_RUN([
#include <stdlib.h>
@@ -72,12 +221,22 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
-], AC_DEFINE_UNQUOTED(STDENDIAN32_NET0_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST0_FROM_NET, 0), temp=$?;
- AC_DEFINE_UNQUOTED(STDENDIAN32_NET0_FROM_HOST, $temp) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST${temp}_FROM_NET, 0),
- AC_DEFINE_UNQUOTED(STDENDIAN32_NET0_FROM_HOST, 3) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST3_FROM_NET, 0))
+],
+AC_MSG_ERROR([[test failed (returned 0)! Please fix configure.in!]]),
+[
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 103; then
+ tmp=$(($tmp - 100))
+ AC_DEFINE_UNQUOTED(STDENDIAN32_NET0_FROM_HOST, $tmp)
+ AC_DEFINE_UNQUOTED(STDENDIAN32_HOST${tmp}_FROM_NET, 0)
+else
+ AC_MSG_ERROR([[test failed (invalid return value)! Please fix configure.in!]])
+fi
+],
+[AC_DEFINE_UNQUOTED(STDENDIAN32_NET0_FROM_HOST, 3) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST3_FROM_NET, 0)])
AC_TRY_RUN([
#include <stdlib.h>
@@ -96,12 +255,22 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
-], AC_DEFINE_UNQUOTED(STDENDIAN32_NET1_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST0_FROM_NET, 1), temp=$?;
- AC_DEFINE_UNQUOTED(STDENDIAN32_NET1_FROM_HOST, $temp) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST${temp}_FROM_NET, 1),
- AC_DEFINE_UNQUOTED(STDENDIAN32_NET1_FROM_HOST, 2) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST2_FROM_NET, 1))
+],
+AC_MSG_ERROR([[test failed (returned 0)! Please fix configure.in!]]),
+[
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 103; then
+ tmp=$(($tmp - 100))
+ AC_DEFINE_UNQUOTED(STDENDIAN32_NET1_FROM_HOST, $tmp)
+ AC_DEFINE_UNQUOTED(STDENDIAN32_HOST${tmp}_FROM_NET, 1)
+else
+ AC_MSG_ERROR([[test failed (invalid return value)! Please fix configure.in!]])
+fi
+],
+[AC_DEFINE_UNQUOTED(STDENDIAN32_NET1_FROM_HOST, 2) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST2_FROM_NET, 1)])
AC_TRY_RUN([
#include <stdlib.h>
@@ -120,12 +289,22 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
-], AC_DEFINE_UNQUOTED(STDENDIAN32_NET2_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST0_FROM_NET, 2), temp=$?;
- AC_DEFINE_UNQUOTED(STDENDIAN32_NET2_FROM_HOST, $temp) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST${temp}_FROM_NET, 2),
- AC_DEFINE_UNQUOTED(STDENDIAN32_NET2_FROM_HOST, 1) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST1_FROM_NET, 2))
+],
+AC_MSG_ERROR([[test failed (returned 0)! Please fix configure.in!]]),
+[
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 103; then
+ tmp=$(($tmp - 100))
+ AC_DEFINE_UNQUOTED(STDENDIAN32_NET2_FROM_HOST, $tmp)
+ AC_DEFINE_UNQUOTED(STDENDIAN32_HOST${tmp}_FROM_NET, 2)
+else
+ AC_MSG_ERROR([[test failed (invalid return value)! Please fix configure.in!]])
+fi
+],
+[AC_DEFINE_UNQUOTED(STDENDIAN32_NET2_FROM_HOST, 1) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST1_FROM_NET, 2)])
AC_TRY_RUN([
#include <stdlib.h>
@@ -144,19 +323,29 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
-], AC_DEFINE_UNQUOTED(STDENDIAN32_NET3_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST0_FROM_NET, 3), temp=$?;
- AC_DEFINE_UNQUOTED(STDENDIAN32_NET3_FROM_HOST, $temp) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST${temp}_FROM_NET, 3),
- AC_DEFINE_UNQUOTED(STDENDIAN32_NET3_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST0_FROM_NET, 3))
+],
+AC_MSG_ERROR([[test failed (returned 0)! Please fix configure.in!]]),
+[
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 103; then
+ tmp=$(($tmp - 100))
+ AC_DEFINE_UNQUOTED(STDENDIAN32_NET3_FROM_HOST, $tmp)
+ AC_DEFINE_UNQUOTED(STDENDIAN32_HOST${tmp}_FROM_NET, 3)
+else
+ AC_MSG_ERROR([[test failed (invalid return value)! Please fix configure.in!]])
+fi
+],
+[AC_DEFINE_UNQUOTED(STDENDIAN32_NET3_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN32_HOST0_FROM_NET, 3)])
AC_TRY_RUN([
#include <stdlib.h>
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -170,19 +359,29 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
-], AC_DEFINE_UNQUOTED(STDENDIAN64_NET0_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST0_FROM_NET, 0), temp=$?;
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET0_FROM_HOST, $temp) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${temp}_FROM_NET, 0),
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET0_FROM_HOST, 7) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST7_FROM_NET, 0))
+],
+AC_MSG_ERROR([[test failed (returned 0)! Please fix configure.in!]]),
+[
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ AC_DEFINE_UNQUOTED(STDENDIAN64_NET0_FROM_HOST, $tmp)
+ AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${tmp}_FROM_NET, 0)
+else
+ AC_MSG_ERROR([[test failed (invalid return value)! Please fix configure.in!]])
+fi
+],
+[AC_DEFINE_UNQUOTED(STDENDIAN64_NET0_FROM_HOST, 7) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST7_FROM_NET, 0)])
AC_TRY_RUN([
#include <stdlib.h>
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -196,19 +395,29 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
-], AC_DEFINE_UNQUOTED(STDENDIAN64_NET1_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST0_FROM_NET, 1), temp=$?;
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET1_FROM_HOST, $temp) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${temp}_FROM_NET, 1),
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET1_FROM_HOST, 6) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST6_FROM_NET, 1))
+],
+AC_MSG_ERROR([[test failed (returned 0)! Please fix configure.in!]]),
+[
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ AC_DEFINE_UNQUOTED(STDENDIAN64_NET1_FROM_HOST, $tmp)
+ AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${tmp}_FROM_NET, 1)
+else
+ AC_MSG_ERROR([[test failed (invalid return value)! Please fix configure.in!]])
+fi
+],
+[AC_DEFINE_UNQUOTED(STDENDIAN64_NET1_FROM_HOST, 6) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST6_FROM_NET, 1)])
AC_TRY_RUN([
#include <stdlib.h>
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -222,19 +431,29 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
-], AC_DEFINE_UNQUOTED(STDENDIAN64_NET2_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST0_FROM_NET, 2), temp=$?;
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET2_FROM_HOST, $temp) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${temp}_FROM_NET, 2),
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET2_FROM_HOST, 5) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST5_FROM_NET, 2))
+],
+AC_MSG_ERROR([[test failed (returned 0)! Please fix configure.in!]]),
+[
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ AC_DEFINE_UNQUOTED(STDENDIAN64_NET2_FROM_HOST, $tmp)
+ AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${tmp}_FROM_NET, 2)
+else
+ AC_MSG_ERROR([[test failed (invalid return value)! Please fix configure.in!]])
+fi
+],
+[AC_DEFINE_UNQUOTED(STDENDIAN64_NET2_FROM_HOST, 5) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST5_FROM_NET, 2)])
AC_TRY_RUN([
#include <stdlib.h>
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -248,19 +467,29 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
-], AC_DEFINE_UNQUOTED(STDENDIAN64_NET3_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST0_FROM_NET, 3), temp=$?;
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET3_FROM_HOST, $temp) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${temp}_FROM_NET, 3),
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET3_FROM_HOST, 4) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST4_FROM_NET, 3))
+],
+AC_MSG_ERROR([[test failed (returned 0)! Please fix configure.in!]]),
+[
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ AC_DEFINE_UNQUOTED(STDENDIAN64_NET3_FROM_HOST, $tmp)
+ AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${tmp}_FROM_NET, 3)
+else
+ AC_MSG_ERROR([[test failed (invalid return value)! Please fix configure.in!]])
+fi
+],
+[AC_DEFINE_UNQUOTED(STDENDIAN64_NET3_FROM_HOST, 4) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST4_FROM_NET, 3)])
AC_TRY_RUN([
#include <stdlib.h>
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -274,19 +503,29 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
-], AC_DEFINE_UNQUOTED(STDENDIAN64_NET4_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST0_FROM_NET, 4), temp=$?;
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET4_FROM_HOST, $temp) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${temp}_FROM_NET, 4),
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET4_FROM_HOST, 3) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST3_FROM_NET, 4))
+],
+AC_MSG_ERROR([[test failed (returned 0)! Please fix configure.in!]]),
+[
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ AC_DEFINE_UNQUOTED(STDENDIAN64_NET4_FROM_HOST, $tmp)
+ AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${tmp}_FROM_NET, 4)
+else
+ AC_MSG_ERROR([[test failed (invalid return value)! Please fix configure.in!]])
+fi
+],
+[AC_DEFINE_UNQUOTED(STDENDIAN64_NET4_FROM_HOST, 3) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST3_FROM_NET, 4)])
AC_TRY_RUN([
#include <stdlib.h>
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -300,19 +539,29 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
-], AC_DEFINE_UNQUOTED(STDENDIAN64_NET5_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST0_FROM_NET, 5), temp=$?;
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET5_FROM_HOST, $temp) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${temp}_FROM_NET, 5),
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET5_FROM_HOST, 2) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST2_FROM_NET, 5))
+],
+AC_MSG_ERROR([[test failed (returned 0)! Please fix configure.in!]]),
+[
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ AC_DEFINE_UNQUOTED(STDENDIAN64_NET5_FROM_HOST, $tmp)
+ AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${tmp}_FROM_NET, 5)
+else
+ AC_MSG_ERROR([[test failed (invalid return value)! Please fix configure.in!]])
+fi
+],
+[AC_DEFINE_UNQUOTED(STDENDIAN64_NET5_FROM_HOST, 2) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST2_FROM_NET, 5)])
AC_TRY_RUN([
#include <stdlib.h>
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -326,19 +575,29 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
-], AC_DEFINE_UNQUOTED(STDENDIAN64_NET6_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST0_FROM_NET, 6), temp=$?;
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET6_FROM_HOST, $temp) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${temp}_FROM_NET, 6),
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET6_FROM_HOST, 1) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST1_FROM_NET, 6))
+],
+AC_MSG_ERROR([[test failed (returned 0)! Please fix configure.in!]]),
+[
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ AC_DEFINE_UNQUOTED(STDENDIAN64_NET6_FROM_HOST, $tmp)
+ AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${tmp}_FROM_NET, 6)
+else
+ AC_MSG_ERROR([[test failed (invalid return value)! Please fix configure.in!]])
+fi
+],
+[AC_DEFINE_UNQUOTED(STDENDIAN64_NET6_FROM_HOST, 1) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST1_FROM_NET, 6)])
AC_TRY_RUN([
#include <stdlib.h>
int main()
{
-#if defined(_WIN32)
+#if defined(_MSC_VER)
__int64 x = 0x1;
#elif (SIZEOF_LONG == 8)
long x = 0x1;
@@ -352,11 +611,22 @@
for (i = 0; i < sizeof(x) && xptr[i] == 0; ++i);
- exit(i);
- return i;
+ exit(100 + i);
+ return 100 + i;
}
-], AC_DEFINE_UNQUOTED(STDENDIAN64_NET7_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST0_FROM_NET, 7) AC_MSG_RESULT(done), temp=$?;
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET7_FROM_HOST, $temp) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${temp}_FROM_NET, 7) AC_MSG_RESULT(done),
- AC_DEFINE_UNQUOTED(STDENDIAN64_NET7_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST0_FROM_NET, 7) AC_MSG_WARN(Unable to check due to cross compiling! ASSUMING LITTLE ENDIAN ARCHITECTURE! To change this please see stdutil.c!))
+],
+AC_MSG_ERROR([[test failed (returned 0)! Please fix configure.in!]]),
+[
+tmp=$?
+if test $tmp -ge 100 && test $tmp -le 107; then
+ tmp=$(($tmp - 100))
+ AC_DEFINE_UNQUOTED(STDENDIAN64_NET7_FROM_HOST, $tmp)
+ AC_DEFINE_UNQUOTED(STDENDIAN64_HOST${tmp}_FROM_NET, 7)
+ AC_MSG_RESULT(done)
+else
+ AC_MSG_ERROR([[test failed (invalid return value)! Please fix configure.in!]])
+fi
+],
+[AC_DEFINE_UNQUOTED(STDENDIAN64_NET7_FROM_HOST, 0) AC_DEFINE_UNQUOTED(STDENDIAN64_HOST0_FROM_NET, 7) AC_MSG_WARN([[Unable to check due to cross compiling! ASSUMING LITTLE ENDIAN ARCHITECTURE! To change please fix stdutil/private/stdarch.h!]])])
AC_OUTPUT(Makefile)
Modified: vendor/stdutil/current/src/stddll.c
===================================================================
--- vendor/stdutil/current/src/stddll.c 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stddll.c 2005-08-06 12:40:26 UTC (rev 255)
@@ -766,10 +766,10 @@
}
/************************************************************************************************
- * stdit_val: Return a pointer to an element from an iterator.
+ * stddll_it_val: Return a pointer to an element from an iterator.
***********************************************************************************************/
-STDINLINE void *stdit_val(const stdit *it)
+STDINLINE void *stddll_it_val(const stdit *it)
{
STDSAFETY_CHECK(STDIT_DLL_IS_LEGAL(it));
@@ -777,11 +777,22 @@
}
/************************************************************************************************
- * stdit_eq: Compare to iterators for equality (refer to the same element).
+ * stddll_it_val_size: Return the size of the referenced type from an iterator.
***********************************************************************************************/
-STDINLINE stdbool stdit_eq(const stdit *it1, const stdit *it2)
+STDINLINE stdsize stddll_it_val_size(const stdit *it)
{
+ STDSAFETY_CHECK(STDIT_DLL_IS_LEGAL(it));
+
+ return it->impl.dll.vsize;
+}
+
+/************************************************************************************************
+ * stddll_it_eq: Compare to iterators for equality (refer to the same element).
+ ***********************************************************************************************/
+
+STDINLINE stdbool stddll_it_eq(const stdit *it1, const stdit *it2)
+{
STDSAFETY_CHECK(STDIT_DLL_IS_LEGAL(it1) && STDIT_DLL_IS_LEGAL(it2) &&
it1->impl.dll.end_node == it2->impl.dll.end_node &&
it1->impl.dll.vsize == it2->impl.dll.vsize);
@@ -790,10 +801,10 @@
}
/************************************************************************************************
- * stdit_next: Advance an iterator one position towards the end.
+ * stddll_it_next: Advance an iterator one position towards the end.
***********************************************************************************************/
-STDINLINE stdit *stdit_next(stdit *it)
+STDINLINE stdit *stddll_it_next(stdit *it)
{
STDSAFETY_CHECK(STDIT_DLL_IS_LEGAL(it));
STDBOUNDS_CHECK(it->impl.dll.node != it->impl.dll.end_node);
@@ -804,10 +815,10 @@
}
/************************************************************************************************
- * stdit_advance: Advance an iterator 'num_advance' positions towards the end.
+ * stddll_it_advance: Advance an iterator 'num_advance' positions towards the end.
***********************************************************************************************/
-STDINLINE stdit *stdit_advance(stdit *it, stdsize num_advance)
+STDINLINE stdit *stddll_it_advance(stdit *it, stdsize num_advance)
{
STDSAFETY_CHECK(STDIT_DLL_IS_LEGAL(it));
@@ -820,10 +831,10 @@
}
/************************************************************************************************
- * stdit_prev: Advance an iterator one postion towards the beginning.
+ * stddll_it_prev: Advance an iterator one postion towards the beginning.
***********************************************************************************************/
-STDINLINE stdit *stdit_prev(stdit *it)
+STDINLINE stdit *stddll_it_prev(stdit *it)
{
STDSAFETY_CHECK(STDIT_DLL_IS_LEGAL(it));
STDBOUNDS_CHECK(it->impl.dll.node->prev != it->impl.dll.end_node);
@@ -834,10 +845,10 @@
}
/************************************************************************************************
- * stdit_retreat: Advance an iterator 'num_retreat' positions towards the beginning.
+ * stddll_it_retreat: Advance an iterator 'num_retreat' positions towards the beginning.
***********************************************************************************************/
-STDINLINE stdit *stdit_retreat(stdit *it, stdsize num_retreat)
+STDINLINE stdit *stddll_it_retreat(stdit *it, stdsize num_retreat)
{
STDSAFETY_CHECK(STDIT_DLL_IS_LEGAL(it));
Modified: vendor/stdutil/current/src/stderror.c
===================================================================
--- vendor/stdutil/current/src/stderror.c 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stderror.c 2005-08-06 12:40:26 UTC (rev 255)
@@ -156,8 +156,9 @@
/************************************************************************************************
* stderr_strerr: Returns a constant string in response to a StdUtil
* error code. Some StdUtil fcns can return system specific codes.
- * In that case this fcn will return a "Unknown Error" string and you
- * should consult your system specific error lookup service.
+ * In that case this fcn will return a "Unknown Error Code (system
+ * error code)" string and you should consult your system specific
+ * error lookup service.
***********************************************************************************************/
STDINLINE const char *stderr_strerr(stdcode code)
@@ -193,6 +194,10 @@
ret = "Functionality Not Implemented";
break;
+ case STDEINTR:
+ ret = "Operation Interrupted";
+ break;
+
default:
ret = "Unknown Error Code (system error code)";
break;
Modified: vendor/stdutil/current/src/stdfd.c
===================================================================
--- vendor/stdutil/current/src/stdfd.c 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdfd.c 2005-08-06 12:40:26 UTC (rev 255)
@@ -31,7 +31,7 @@
# include <io.h>
# include <sys/locking.h>
# define STDFILENO(s) _fileno(s)
-# define STDFSYNC(fd) _commit(fd)
+# define STDFSYNC(fd) _commit(fd)
#else
# include <unistd.h>
# define STDFILENO(s) fileno(s)
@@ -42,17 +42,49 @@
* stdfd_open: Open a file descriptor.
***********************************************************************************************/
-STDINLINE stdcode stdfd_open(stdfd *fd, const char *path, const char *mode)
+STDINLINE stdcode stdfd_open(stdfd *fd, const char *path, stdfd_access_type mode)
{
- stdcode ret = STDESUCCESS;
+ stdcode ret = STDESUCCESS;
+ const char * fopen_mode;
- if ((fd->stream = fopen(path, mode)) != NULL) {
+ switch (mode) {
+ case STDFD_READ_ONLY:
+ fopen_mode = "rb";
+ break;
+
+ case STDFD_READ_WRITE_EXISTING:
+ fopen_mode = "rb+";
+ break;
+
+ case STDFD_WRITE_ONLY:
+ fopen_mode = "wb";
+ break;
+
+ case STDFD_READ_WRITE_NEW:
+ fopen_mode = "wb+";
+ break;
+
+ case STDFD_APPEND_ONLY:
+ fopen_mode = "ab";
+ break;
+
+ case STDFD_READ_APPEND:
+ fopen_mode = "ab+";
+ break;
+
+ default:
+ ret = STDEINVAL;
+ goto stdfd_open_end;
+ }
+
+ if ((fd->stream = fopen(path, fopen_mode)) != NULL) {
fd->fd = STDFILENO(fd->stream);
} else {
ret = errno;
}
+ stdfd_open_end:
return ret;
}
@@ -64,13 +96,14 @@
{
stdcode ret = STDESUCCESS;
- STDSAFETY_CHECK(fd->stream != NULL);
+ STDSAFETY_CHECK(fd->stream != NULL && fd->fd >= 0);
- if ((ret = fclose(fd->stream)) != 0) {
+ if (fclose(fd->stream) != 0) {
ret = errno;
}
fd->stream = NULL;
+ fd->fd = -1;
return ret;
}
@@ -84,6 +117,8 @@
{
stdcode ret;
+ STDSAFETY_CHECK(fd->stream != NULL && fd->fd >= 0);
+
if ((*num = fread(ptr, nsize, nmemb, fd->stream)) == nmemb) {
ret = STDESUCCESS;
@@ -93,8 +128,8 @@
} else if (ferror(fd->stream)) {
ret = errno;
- } else {
- ret = STDESUCCESS;
+ } else {
+ ret = STDEINTR; /* wrong count but not EOF or error? alert user! */
}
return ret;
@@ -109,6 +144,8 @@
{
stdcode ret;
+ STDSAFETY_CHECK(fd->stream != NULL && fd->fd >= 0);
+
if ((*num = fwrite(ptr, nsize, nmemb, fd->stream)) == nmemb) {
ret = STDESUCCESS;
@@ -118,8 +155,8 @@
} else if (ferror(fd->stream)) {
ret = errno;
- } else {
- ret = STDESUCCESS;
+ } else {
+ ret = STDEINTR; /* wrong count but not EOF or error? alert user! */
}
return ret;
@@ -133,6 +170,8 @@
{
stdcode ret = STDESUCCESS;
+ STDSAFETY_CHECK(fd->stream != NULL && fd->fd >= 0);
+
if (fflush(fd->stream) != 0) {
ret = errno;
}
@@ -145,10 +184,12 @@
* flush all data to disk.
***********************************************************************************************/
-STDINLINE stdcode stdfd_sync(stdfd * fd)
+STDINLINE stdcode stdfd_sync(stdfd *fd)
{
stdcode ret = STDESUCCESS;
+ STDSAFETY_CHECK(fd->stream != NULL && fd->fd >= 0);
+
if (stdfd_flush(fd) != 0 || STDFSYNC(fd->fd) != 0) {
ret = errno;
}
@@ -160,10 +201,12 @@
* stdfd_seek: Move the read/write head position of a file descriptor.
***********************************************************************************************/
-STDINLINE stdcode stdfd_seek(stdfd *fd, stdfd_pos offset, stdfd_whence whence)
+STDINLINE stdcode stdfd_seek(stdfd *fd, long offset, stdfd_whence whence)
{
stdcode ret = STDESUCCESS;
+ STDSAFETY_CHECK(fd->stream != NULL && fd->fd >= 0);
+
if (fseek(fd->stream, offset, whence) != 0) {
ret = errno;
}
@@ -172,13 +215,15 @@
}
/************************************************************************************************
- * stdfd_get_pos: Get the read/write head position of a file descriptor.
+ * stdfd_tell: Get the read/write head position of a file descriptor.
***********************************************************************************************/
-STDINLINE stdcode stdfd_get_pos(stdfd *fd, stdfd_pos *pos)
+STDINLINE stdcode stdfd_tell(stdfd *fd, long *pos)
{
stdcode ret = STDESUCCESS;
+ STDSAFETY_CHECK(fd->stream != NULL && fd->fd >= 0);
+
if ((*pos = ftell(fd->stream)) == -1) {
ret = errno;
}
@@ -190,8 +235,10 @@
* stdfd_eof: Return whether or not the EOF indicator on a file descriptor is set.
***********************************************************************************************/
-STDINLINE stdbool stdfd_eof(stdfd * fd)
+STDINLINE stdbool stdfd_eof(stdfd *fd)
{
+ STDSAFETY_CHECK(fd->stream != NULL && fd->fd >= 0);
+
return (feof(fd->stream) != 0);
}
@@ -199,8 +246,10 @@
* stdfd_err: Return whether or not an error indicator on a file descriptor is set.
***********************************************************************************************/
-STDINLINE stdbool stdfd_err(stdfd * fd)
+STDINLINE stdbool stdfd_err(stdfd *fd)
{
+ STDSAFETY_CHECK(fd->stream != NULL && fd->fd >= 0);
+
return (ferror(fd->stream) != 0);
}
@@ -208,8 +257,10 @@
* stdfd_clr_err: Clear any error indicator on a file descriptor.
***********************************************************************************************/
-STDINLINE void stdfd_clr_err(stdfd * fd)
+STDINLINE void stdfd_clr_err(stdfd *fd)
{
+ STDSAFETY_CHECK(fd->stream != NULL && fd->fd >= 0);
+
clearerr(fd->stream);
}
@@ -218,10 +269,12 @@
* descriptor's underlying file.
***********************************************************************************************/
-STDINLINE stdcode stdfd_trylock(stdfd * fd)
+STDINLINE stdcode stdfd_trylock(stdfd *fd)
{
stdcode ret = STDESUCCESS;
+ STDSAFETY_CHECK(fd->stream != NULL && fd->fd >= 0);
+
#if defined(_WIN32)
if (_locking(fd->fd, _LK_NBLCK, 1) != 0) {
#else
@@ -242,10 +295,12 @@
* underlying file.
***********************************************************************************************/
-STDINLINE stdcode stdfd_unlock(stdfd * fd)
+STDINLINE stdcode stdfd_unlock(stdfd *fd)
{
stdcode ret = STDESUCCESS;
+ STDSAFETY_CHECK(fd->stream != NULL && fd->fd >= 0);
+
#if defined(_WIN32)
if (_locking(fd->fd, _LK_UNLCK, 1) != 0) {
#else
Modified: vendor/stdutil/current/src/stdhash.c
===================================================================
--- vendor/stdutil/current/src/stdhash.c 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdhash.c 2005-08-06 12:40:26 UTC (rev 255)
@@ -694,25 +694,23 @@
STDINLINE stdcode stdhash_set_eq(stdhash *dst, const stdhash *src)
{
stdcode ret = STDESUCCESS;
+ stdhash cpy;
STDSAFETY_CHECK(STDHASH_IS_LEGAL(dst) && STDHASH_IS_LEGAL(src) &&
dst->ksize == src->ksize && dst->vsize == src->vsize &&
dst->cmp_fcn == src->cmp_fcn && dst->hcode_fcn == src->hcode_fcn);
- if (src->size != 0) {
- stdhash cpy;
+ if (dst == src) {
+ goto stdhash_set_eq_end;
+ }
- if ((ret = stdhash_copy_construct(&cpy, src)) != STDESUCCESS) { /* make a copy */
- goto stdhash_set_eq_end;
- }
-
- stdhash_swap(dst, &cpy); /* swap the hashes */
- stdhash_destruct(&cpy); /* destroy the old hash */
-
- } else {
- stdhash_clear(dst);
+ if ((ret = stdhash_copy_construct(&cpy, src)) != STDESUCCESS) { /* make a copy */
+ goto stdhash_set_eq_end;
}
+ stdhash_swap(dst, &cpy); /* swap the hashes */
+ stdhash_destruct(&cpy); /* destroy the old hash */
+
stdhash_set_eq_end:
return ret;
}
@@ -1219,10 +1217,10 @@
}
/************************************************************************************************
- * stdit_key: Return a pointer to the key of the key-value pair 'it' references.
+ * stdhash_it_key: Return a pointer to the key of the key-value pair 'it' references.
***********************************************************************************************/
-STDINLINE const void *stdit_key(const stdit *it)
+STDINLINE const void *stdhash_it_key(const stdit *it)
{
STDSAFETY_CHECK(STDIT_HASH_IS_LEGAL(it));
@@ -1230,10 +1228,10 @@
}
/************************************************************************************************
- * stdit_key_size: Return the size in bytes of keys 'it' references.
+ * stdhash_it_key_size: Return the size in bytes of keys 'it' references.
***********************************************************************************************/
-STDINLINE stdsize stdit_key_size(const stdit *it)
+STDINLINE stdsize stdhash_it_key_size(const stdit *it)
{
STDSAFETY_CHECK(STDIT_HASH_IS_LEGAL(it));
@@ -1241,10 +1239,10 @@
}
/************************************************************************************************
- * stdit_val: Return a pointer to the key of the key-value pair 'it' references.
+ * stdhash_it_val: Return a pointer to the key of the key-value pair 'it' references.
***********************************************************************************************/
-STDINLINE void *stdit_val(const stdit *it)
+STDINLINE void *stdhash_it_val(const stdit *it)
{
STDSAFETY_CHECK(STDIT_HASH_IS_LEGAL(it));
@@ -1252,10 +1250,10 @@
}
/************************************************************************************************
- * stdit_val_size: Return the size in bytes of the values 'it' references.
+ * stdhash_it_val_size: Return the size in bytes of the values 'it' references.
***********************************************************************************************/
-STDINLINE stdsize stdit_val_size(const stdit *it)
+STDINLINE stdsize stdhash_it_val_size(const stdit *it)
{
STDSAFETY_CHECK(STDIT_HASH_IS_LEGAL(it));
@@ -1263,10 +1261,10 @@
}
/************************************************************************************************
- * stdit_eq: Compare two iterators for equality (same pair).
+ * stdhash_it_eq: Compare two iterators for equality (same pair).
***********************************************************************************************/
-STDINLINE stdbool stdit_eq(const stdit *it1, const stdit *it2)
+STDINLINE stdbool stdhash_it_eq(const stdit *it1, const stdit *it2)
{
STDSAFETY_CHECK(STDIT_HASH_IS_LEGAL(it1) && STDIT_HASH_IS_LEGAL(it2) &&
it1->impl.hash.table == it2->impl.hash.table &&
@@ -1278,10 +1276,10 @@
}
/************************************************************************************************
- * stdit_next: Advance an iterator towards end by 1 position.
+ * stdhash_it_next: Advance an iterator towards end by 1 position.
***********************************************************************************************/
-STDINLINE stdit *stdit_next(stdit *it)
+STDINLINE stdit *stdhash_it_next(stdit *it)
{
STDSAFETY_CHECK(STDIT_HASH_IS_LEGAL(it));
STDBOUNDS_CHECK(it->impl.hash.node_pos != it->impl.hash.table_end);
@@ -1292,10 +1290,10 @@
}
/************************************************************************************************
- * stdit_advance: Advance an iterator towards end by 'num_advance' positions.
+ * stdhash_it_advance: Advance an iterator towards end by 'num_advance' positions.
***********************************************************************************************/
-STDINLINE stdit *stdit_advance(stdit *it, stdsize num_advance)
+STDINLINE stdit *stdhash_it_advance(stdit *it, stdsize num_advance)
{
STDSAFETY_CHECK(STDIT_HASH_IS_LEGAL(it));
@@ -1308,10 +1306,10 @@
}
/************************************************************************************************
- * stdit_prev: Advance an iterator towards begin by 1 position.
+ * stdhash_it_prev: Advance an iterator towards begin by 1 position.
***********************************************************************************************/
-STDINLINE stdit *stdit_prev(stdit *it)
+STDINLINE stdit *stdhash_it_prev(stdit *it)
{
STDSAFETY_CHECK(STDIT_HASH_IS_LEGAL(it));
STDBOUNDS_CHECK(it->impl.hash.node_pos != it->impl.hash.table); /* should be begin, but we don't track that */
@@ -1322,10 +1320,10 @@
}
/************************************************************************************************
- * stdit_retreat: Advance an iterator towards begin by 'num_retreat' positions.
+ * stdhash_it_retreat: Advance an iterator towards begin by 'num_retreat' positions.
***********************************************************************************************/
-STDINLINE stdit *stdit_retreat(stdit *it, stdsize num_retreat)
+STDINLINE stdit *stdhash_it_retreat(stdit *it, stdsize num_retreat)
{
STDSAFETY_CHECK(STDIT_HASH_IS_LEGAL(it));
Modified: vendor/stdutil/current/src/stdit.c
===================================================================
--- vendor/stdutil/current/src/stdit.c 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdit.c 2005-08-06 12:40:26 UTC (rev 255)
@@ -53,7 +53,7 @@
break;
default:
- ret = STDIT_FORWARD;
+ ret = 0;
STDEXCEPTION(uninitialized or corrupted iterator);
break;
}
@@ -169,21 +169,15 @@
break;
case STDHASH_IT_ID:
+ case STDHASH_IT_KEY_ID:
ret = stdhash_it_val(it);
break;
- case STDHASH_IT_KEY_ID:
- ret = (void*) stdhash_it_key(it);
- break;
-
case STDSKL_IT_ID:
+ case STDSKL_IT_KEY_ID:
ret = stdskl_it_val(it);
break;
- case STDSKL_IT_KEY_ID:
- ret = (void*) stdskl_it_key(it);
- break;
-
default:
ret = NULL;
STDEXCEPTION(uninitialized or corrupted iterator);
@@ -223,21 +217,15 @@
break;
case STDHASH_IT_ID:
+ case STDHASH_IT_KEY_ID:
ret = stdhash_it_val_size(it);
break;
- case STDHASH_IT_KEY_ID:
- ret = stdhash_it_key_size(it);
- break;
-
case STDSKL_IT_ID:
+ case STDSKL_IT_KEY_ID:
ret = stdskl_it_val_size(it);
break;
- case STDSKL_IT_KEY_ID:
- ret = stdskl_it_key_size(it);
- break;
-
default:
ret = 0;
STDEXCEPTION(uninitialized or corrupted iterator);
Modified: vendor/stdutil/current/src/stdskl.c
===================================================================
--- vendor/stdutil/current/src/stdskl.c 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdskl.c 2005-08-06 12:40:26 UTC (rev 255)
@@ -28,9 +28,21 @@
#include <stdutil/stdtime.h>
#include <stdutil/stdskl.h>
+/* TODO: consider shrinking end_node's arrays when the top level
+ becomes empty (down to some minimum height like 4 or 5); this is
+ easy to detect: if the node being removed has the same height as
+ the end_node and his top level prev and next are the end node then
+ the level is about to become empty; alternatively after removal you
+ can just check the top levels for self reference; also might not
+ want to make end_node taller than the tallest node on insert --
+ don't know how big an effect on find this will have as find as it
+ will simply run down end_node's nexts array while next equals
+ end_node not doing any real work
+*/
+
#define STDSKL_MAX_HEIGHT 31
-#define STDSKL_IS_LEGAL(l) ((l)->end_node != NULL && (l)->ksize != 0 && (l)->bits_left < 32)
+#define STDSKL_IS_LEGAL(l) ((l)->end_node != NULL && (l)->ksize != 0 && (l)->bits_left >= 0 && (l)->bits_left < 32)
#define STDSKL_IT_IS_LEGAL(l, i) ((i)->ksize == (l)->ksize && (i)->vsize == (l)->vsize)
#define STDIT_SKL_IS_LEGAL(i) (((i)->type_id == STDSKL_IT_ID || (i)->type_id == STDSKL_IT_KEY_ID) && \
(i)->impl.skl.node != NULL && (i)->impl.skl.ksize != 0)
@@ -72,7 +84,7 @@
keep_going = ((l->rand_bits & 0x1) == 0x1); /* break loop on a "off" bit */
- --l->bits_left; /* consume a bit */
+ --l->bits_left; /* remove used bit */
l->rand_bits >>= 1;
}
}
@@ -80,15 +92,17 @@
/* calculate memory needed for node and pointer arrays and the offsets for the pointers in the node */
mem_tot = sizeof(stdskl_node); /* memory for node structure */
- prevs_off = mem_tot;
+ prevs_off = mem_tot; /* structure is already aligned for void*'s -> good enough alignment */
mem_tot += (height + 1) * sizeof(stdskl_node*); /* memory for prevs array */
- nexts_off = mem_tot;
+ nexts_off = mem_tot; /* structure is already aligned for void*'s -> good enough alignment */
mem_tot += (height + 1) * sizeof(stdskl_node*); /* memory for nexts array */
mem_tot = STDARCH_PADDED_SIZE(mem_tot); /* pad memory for key */
key_off = mem_tot;
+ /* TODO: might only pad the key size if vsize != 0 */
+
mem_tot += STDARCH_PADDED_SIZE(l->ksize); /* memory for key and padding for value */
val_off = mem_tot;
@@ -125,7 +139,7 @@
* If (find_any) immediately return on any match. Otherwise if 'key'
* exists in 'l' return the "leftmost" (least) match if multiple
* matches exist. On no match, returns the "leftmost" (least) entry
- * in 'l' with a greater key, or end if no such entry.
+ * in 'l' with a greater key, or end if no such entry exists.
***********************************************************************************************/
STDINLINE static stdbool stdskl_low_find_right(const stdskl *l, const void *key,
@@ -136,7 +150,7 @@
stdint8 lvl = l->end_node->height;
int cmp = -1; /* get rid of compiler warning */
- /* run down to bottom level */
+ /* run down to bottom level list */
while (lvl > 0) {
next = curr->nexts[lvl];
@@ -156,12 +170,12 @@
return STDTRUE;
}
- /* run down curr's nexts levels while they equal next */
+ /* run down curr's levels while they equal next */
for (--lvl; lvl > 0 && curr->nexts[lvl] == next; --lvl);
}
- /* lvl is zero: run right on bottom level trying to match key */
+ /* lvl is zero: run right on bottom level list trying to match key */
curr = curr->nexts[0];
@@ -184,7 +198,7 @@
* If (find_any) immediately return on any match. Otherwise if 'key'
* exists in 'l' return the "rightmost" (greatest) match if multiple
* matches exist. On no match, returns the "rightmost" (greatest)
- * entry in 'l' with a lesser key, or end if no such entry.
+ * entry in 'l' with a lesser key, or end if no such entry exists.
***********************************************************************************************/
STDINLINE static stdbool stdskl_low_find_left(const stdskl *l, const void *key,
@@ -195,7 +209,7 @@
stdint8 lvl = l->end_node->height;
int cmp = -1; /* get rid of compiler warning */
- /* run down to bottom level */
+ /* run down to bottom level list */
while (lvl > 0) {
prev = curr->prevs[lvl];
@@ -220,7 +234,7 @@
for (--lvl; lvl > 0 && curr->prevs[lvl] == prev; --lvl);
}
- /* run left on bottom level trying to match key */
+ /* run left on bottom level list trying to match key */
curr = curr->prevs[0];
@@ -272,7 +286,7 @@
STDINLINE static void stdskl_low_link_left(const stdskl *l, stdskl_node *ins_pos, stdskl_node *node)
{
- stdskl_node * prev = ins_pos->prevs[0]; /* NOTE: this is why we must link_left b4 link_right */
+ stdskl_node * prev = ins_pos->prevs[0]; /* NOTE: this is why we must link_left b4 link_right in insert! */
stdint8 height = node->height;
stdint8 lvl = 0;
@@ -323,7 +337,7 @@
key = (keyed ? stdit_key(&src_it) : val);
cmp = -1;
- /* get insertion position for this key */
+ /* get insertion position for this key: next */
if (hint) { /* 'next' is a potential insertion point -> verify! */
prev = next->prevs[0];
@@ -347,6 +361,8 @@
}
hint = STDTRUE; /* use next as a hint for following iteration (optimize for nearly contiguous, sorted inserts) */
+
+ /* create + insert new node; or overwrite pre-existing match if so instructed and appropriate */
if (!overwrite || next == l->end_node || cmp != 0) { /* create new node to insert */
@@ -360,9 +376,9 @@
if (node->height > l->end_node->height) {
stdskl_node * new_end;
- /* ratchet up new end_node's height to be at least 2 levels higher than before if not already at max height */
+ /* ratchet up new end_node's height to be at least 1 level higher (usually 2) than before */
- lvl = node->height;
+ lvl = node->height; /* 0 <= node->height <= STDSKL_MAX_HEIGHT */
if (lvl < STDSKL_MAX_HEIGHT) {
++lvl;
@@ -373,27 +389,33 @@
goto stdskl_low_insert_fail;
}
- /* set new_end's nexts and prevs and correct nodes ref'ing end to new_end */
+ /* set new_end's nexts and prevs and update nodes ref'ing end_node to now point to new_end */
+ /* loop while we haven't updated all levels of the lists AND end_node is NOT self-referring */
lvl = 0;
do {
- new_end->prevs[lvl] = l->end_node->prevs[lvl];
- new_end->prevs[lvl]->nexts[lvl] = new_end;
- new_end->nexts[lvl] = l->end_node->nexts[lvl];
- new_end->nexts[lvl]->prevs[lvl] = new_end;
+ if (l->end_node->prevs[lvl] == l->end_node) { /* break on end_node referring to itself -> */
+ break; /* all prevs, nexts of this and higher lvls are self-referring */
+ }
- } while (lvl++ != l->end_node->height);
+ new_end->prevs[lvl] = l->end_node->prevs[lvl];
+ l->end_node->prevs[lvl]->nexts[lvl] = new_end;
- /* set additional lvls in new_end to be self-referencing */
+ new_end->nexts[lvl] = l->end_node->nexts[lvl];
+ l->end_node->nexts[lvl]->prevs[lvl] = new_end;
+ } while (lvl++ != l->end_node->height);
+
+ /* set additional lvls in new_end to be self-referencing. NOTE: new_end is at least 1 lvl taller than end_node */
+
do {
new_end->prevs[lvl] = new_end;
new_end->nexts[lvl] = new_end;
} while (lvl++ != new_end->height);
- /* correct next if it referenced the old end */
+ /* correct next if it referenced the end_node */
if (next == l->end_node) {
next = new_end;
@@ -406,7 +428,7 @@
/* link 'node' into list before next */
stdskl_low_link_left(l, next, node); /* NOTE: we must link_left before we link_right due to loss of information */
- stdskl_low_link_right(l, next, node);
+ stdskl_low_link_right(l, next, node);
++l->size;
@@ -416,7 +438,7 @@
memcpy(STDSKL_NVAL(node), val, l->vsize);
}
- /* remember first insertion */
+ /* remember first insertion/overwrite */
if (first_ins == NULL) {
first_ins = node;
@@ -429,10 +451,6 @@
}
}
- if (first_ins == NULL) { /* empty input sequence, set 'it' to end */
- first_ins = l->end_node;
- }
-
goto stdskl_low_insert_end;
/* error handling and return */
@@ -441,9 +459,9 @@
free(node);
stdskl_low_insert_end:
- if (first_ins != NULL && it != NULL) { /* at least one insertion succeeded or empty input sequence */
+ if (it != NULL) {
it->type_id = STDSKL_IT_ID;
- it->impl.skl.node = first_ins;
+ it->impl.skl.node = (first_ins != NULL ? first_ins : l->end_node); /* point to end if no insert/overwrite occurred */
it->impl.skl.ksize = l->ksize;
it->impl.skl.vsize = l->vsize;
}
@@ -527,13 +545,24 @@
stdint8 lvl;
stdtime t;
- if (ksize != 0) {
+ if (ksize == 0) {
ret = STDEINVAL;
goto stdskl_construct_fail;
}
- /* allocate and init end_node */
+ l->size = 0;
+ l->ksize = ksize;
+ l->vsize = vsize;
+ l->cmp_fcn = kcmp;
+ /* initialize randomization using current system time w/ subsecond precision */
+
+ stdtime_now(&t);
+ stdrand32_dseed(l->seed, stdhcode_sfh(&t, sizeof(t)));
+ l->bits_left = 0;
+
+ /* allocate and init end_node -- NOTE: rest of list must be initialized b4 calling this fcn */
+
if ((l->end_node = stdskl_low_create_node(l, 4, NULL, NULL)) == NULL) {
ret = STDENOMEM;
goto stdskl_construct_fail;
@@ -549,16 +578,6 @@
} while (lvl-- != 0);
- l->size = 0;
- l->ksize = ksize;
- l->vsize = vsize;
- l->cmp_fcn = kcmp;
-
- /* initialize randomization using current system time w/ subsecond precision */
-
- stdtime_now(&t);
- stdskl_dseed(l, &t, sizeof(t));
-
goto stdskl_construct_end;
/* error handling and return */
@@ -579,7 +598,6 @@
{
stdcode ret;
stdit it;
- stdit dend;
STDSAFETY_CHECK(STDSKL_IS_LEGAL(src));
@@ -587,7 +605,7 @@
goto stdskl_copy_construct_fail;
}
- if ((ret = stdskl_insert_seq_n(dst, stdskl_end(dst, &dend), stdskl_begin(src, &it), src->size, STDTRUE)) != STDESUCCESS) {
+ if ((ret = stdskl_insert_seq_n(dst, NULL, stdskl_begin(src, &it), src->size, STDFALSE)) != STDESUCCESS) {
goto stdskl_copy_construct_fail2;
}
@@ -627,11 +645,24 @@
STDINLINE stdcode stdskl_set_eq(stdskl *dst, const stdskl *src)
{
- stdcode ret;
+ stdcode ret = STDESUCCESS;
stdskl cpy;
- STDSAFETY_CHECK(STDSKL_IS_LEGAL(dst) && STDSKL_IS_LEGAL(src));
+ STDSAFETY_CHECK(STDSKL_IS_LEGAL(dst) && STDSKL_IS_LEGAL(src) &&
+ dst->ksize == src->ksize && dst->vsize == src->vsize &&
+ dst->cmp_fcn == src->cmp_fcn);
+ /* TODO: an improvement would be to resize the number of nodes in
+ the table as needed: just slice off or splice on an appropriate
+ sequence of nodes to the begin or end of the list and overwrite
+ all nodes: this would cut down on "unnecessary" memory
+ allocs/frees
+ */
+
+ if (dst == src) {
+ goto stdskl_set_eq_end;
+ }
+
if ((ret = stdskl_copy_construct(&cpy, src)) != STDESUCCESS) {
goto stdskl_set_eq_end;
}
@@ -781,7 +812,7 @@
free(prev);
}
- /* fix list entries: end_node and size */
+ /* fix list entries: end_node needs to self reference at all levels and size */
curr = l->end_node;
lvl = l->end_node->height;
@@ -971,7 +1002,8 @@
{
stdit b;
- STDSAFETY_CHECK(STDSKL_IS_LEGAL(l) && (!hint || (it != NULL && STDIT_SKL_IS_LEGAL(it) && STDSKL_IT_IS_LEGAL(l, &it->impl.skl))));
+ STDSAFETY_CHECK(STDSKL_IS_LEGAL(l) &&
+ (!hint || (it != NULL && STDIT_SKL_IS_LEGAL(it) && STDSKL_IT_IS_LEGAL(l, &it->impl.skl))));
return stdskl_low_insert(l, it, stdit_pptr(&b, key, val, l->ksize, l->vsize), NULL, num_times, hint, STDFALSE, STDFALSE);
}
@@ -1019,7 +1051,7 @@
stdskl_lowerb(l, &it, key);
- for (; !stdskl_is_end(l, &it) && stdskl_low_key_cmp(l, key, STDSKL_NKEY(it.impl.skl.node)) == 0;) {
+ while (it.impl.skl.node != l->end_node && stdskl_low_key_cmp(l, key, STDSKL_NKEY(it.impl.skl.node)) == 0) {
stdskl_erase(l, &it); /* advances 'it' */
}
}
@@ -1033,14 +1065,14 @@
STDSAFETY_CHECK(STDSKL_IS_LEGAL(l));
stdrand32_dseed(l->seed, stdhcode_sfh(seed, sizeof_seed));
- l->bits_left = 0;
+ l->bits_left = 0; /* NOTE: initialization depends on this */
}
/************************************************************************************************
- * stdit_key: Get a key from an iterator.
+ * stdskl_it_key: Get a key from an iterator.
***********************************************************************************************/
-STDINLINE const void *stdit_key(const stdit *it)
+STDINLINE const void *stdskl_it_key(const stdit *it)
{
STDSAFETY_CHECK(STDIT_SKL_IS_LEGAL(it));
@@ -1048,10 +1080,10 @@
}
/************************************************************************************************
- * stdit_key_size: Get the size in bytes of the keys to which 'it' refers.
+ * stdskl_it_key_size: Get the size in bytes of the keys to which 'it' refers.
***********************************************************************************************/
-STDINLINE stdsize stdit_key_size(const stdit *it)
+STDINLINE stdsize stdskl_it_key_size(const stdit *it)
{
STDSAFETY_CHECK(STDIT_SKL_IS_LEGAL(it));
@@ -1059,32 +1091,32 @@
}
/************************************************************************************************
- * stdit_val: Get a value from an iterator.
+ * stdskl_it_val: Get a value from an iterator.
***********************************************************************************************/
-STDINLINE void *stdit_val(const stdit *it)
+STDINLINE void *stdskl_it_val(const stdit *it)
{
STDSAFETY_CHECK(STDIT_SKL_IS_LEGAL(it));
- return STDSKL_NVAL(it->impl.skl.node);
+ return (void*) (it->type_id == STDSKL_IT_ID ? STDSKL_NVAL(it->impl.skl.node) : STDSKL_NKEY(it->impl.skl.node));
}
/************************************************************************************************
- * stdit_val_size: Get the size in bytes of the values to which 'it' refers.
+ * stdskl_it_val_size: Get the size in bytes of the values to which 'it' refers.
***********************************************************************************************/
-STDINLINE stdsize stdit_val_size(const stdit *it)
+STDINLINE stdsize stdskl_it_val_size(const stdit *it)
{
STDSAFETY_CHECK(STDIT_SKL_IS_LEGAL(it));
- return it->impl.skl.vsize;
+ return (it->type_id == STDSKL_IT_ID ? it->impl.skl.vsize : it->impl.skl.ksize);
}
/************************************************************************************************
- * stdit_eq: Compare two iterators for equality (refer to the same element).
+ * stdskl_it_eq: Compare two iterators for equality (refer to the same element).
***********************************************************************************************/
-STDINLINE stdbool stdit_eq(const stdit *it1, const stdit *it2)
+STDINLINE stdbool stdskl_it_eq(const stdit *it1, const stdit *it2)
{
STDSAFETY_CHECK(STDIT_SKL_IS_LEGAL(it1) && STDIT_SKL_IS_LEGAL(it2) &&
it1->impl.skl.ksize == it2->impl.skl.ksize &&
@@ -1094,10 +1126,10 @@
}
/************************************************************************************************
- * stdit_next: Advance 'it' towards end by one position.
+ * stdskl_it_next: Advance 'it' towards end by one position.
***********************************************************************************************/
-STDINLINE stdit *stdit_next(stdit *it)
+STDINLINE stdit *stdskl_it_next(stdit *it)
{
STDSAFETY_CHECK(STDIT_SKL_IS_LEGAL(it));
@@ -1107,10 +1139,10 @@
}
/************************************************************************************************
- * stdit_advance: Advance 'it' towards end by 'num_advance' positions.
+ * stdskl_it_advance: Advance 'it' towards end by 'num_advance' positions.
***********************************************************************************************/
-STDINLINE stdit *stdit_advance(stdit *it, stdsize num_advance)
+STDINLINE stdit *stdskl_it_advance(stdit *it, stdsize num_advance)
{
STDSAFETY_CHECK(STDIT_SKL_IS_LEGAL(it));
@@ -1122,10 +1154,10 @@
}
/************************************************************************************************
- * stdit_prev: Advance 'it' towards begin by one position.
+ * stdskl_it_prev: Advance 'it' towards begin by one position.
***********************************************************************************************/
-STDINLINE stdit *stdit_prev(stdit *it)
+STDINLINE stdit *stdskl_it_prev(stdit *it)
{
STDSAFETY_CHECK(STDIT_SKL_IS_LEGAL(it));
@@ -1135,10 +1167,10 @@
}
/************************************************************************************************
- * stdit_retreat: Advance 'it' towards end by 'num_retreat' positions.
+ * stdskl_it_retreat: Advance 'it' towards end by 'num_retreat' positions.
***********************************************************************************************/
-STDINLINE stdit *stdit_retreat(stdit *it, stdsize num_retreat)
+STDINLINE stdit *stdskl_it_retreat(stdit *it, stdsize num_retreat)
{
STDSAFETY_CHECK(STDIT_SKL_IS_LEGAL(it));
Added: vendor/stdutil/current/src/stdtest/stdskl_test.cpp
===================================================================
--- vendor/stdutil/current/src/stdtest/stdskl_test.cpp 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdtest/stdskl_test.cpp 2005-08-06 12:40:26 UTC (rev 255)
@@ -0,0 +1,395 @@
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <cassert>
+#include <map>
+#include <string>
+#include <iterator>
+
+using namespace std;
+
+#include <stdutil/stderror.h>
+#include <stdutil/stdutil.h>
+#include <stdutil/stdskl.h>
+
+#define MY_STR_MAX_CHARS 15
+
+typedef struct
+{
+ char str[MY_STR_MAX_CHARS + 1];
+
+} my_str;
+
+typedef map<string, long> map_type;
+typedef multimap<string, long> multi_type;
+
+map_type map_test, map_base;
+stdskl sklmap_test, sklmap_base;
+
+multi_type multi_test, multi_base;
+stdskl sklmulti_test, sklmulti_base;
+
+/************************************************************************************************
+ ***********************************************************************************************/
+
+size_t my_read_line(char * buf, size_t buf_size, FILE * stream)
+{
+ size_t ret = 0;
+ size_t slen;
+
+ /* read in a line */
+
+ if (fgets(buf, buf_size, stream) == NULL) {
+ goto my_read_line_end;
+ }
+
+ slen = strlen(buf);
+ assert(slen > 0);
+
+ /* remove any trailing end-of-line sequence */
+
+ if (buf[slen - 1] == '\n') {
+ buf[--slen] = '\0';
+
+ if (slen == 0) {
+ goto my_read_line_end;
+ }
+
+ if (buf[slen - 1] == '\r') {
+ buf[--slen] = '\0';
+ }
+
+ if (slen == 0) {
+ goto my_read_line_end;
+ }
+ }
+
+ ret = slen;
+
+ my_read_line_end:
+ return ret;
+}
+
+/************************************************************************************************
+ ***********************************************************************************************/
+
+void full_map_check(stdskl &skl, map_type &m)
+{
+ map_type::iterator map_it;
+ stdit it;
+ const char * prev;
+ stdsize i;
+
+ /* check that skl and m match forwards */
+
+ stdskl_begin(&skl, &it);
+ map_it = m.begin();
+ prev = NULL;
+
+ for (i = 0; map_it != m.end() && !stdskl_is_end(&skl, &it); ++map_it, stdskl_it_next(&it), ++i) {
+
+ if (strcmp(map_it->first.c_str(), (char*) stdskl_it_key(&it)) != 0) {
+ fprintf(stdout, "key mistmatch!\r\n");
+ abort();
+ }
+
+ if (map_it->second != *(long*) stdskl_it_val(&it)) {
+ fprintf(stdout, "val mismatch!\r\n");
+ abort();
+ }
+
+ if (prev != NULL && strcmp(prev, (char*) stdskl_it_key(&it)) >= 0) {
+ fprintf(stdout, "order incorrect!\r\n");
+ abort();
+ }
+
+ //fprintf(stdout, "%s\n", (char*) stdskl_it_key(&it), *(long*) stdskl_it_val(&it));
+
+ prev = (char*) stdskl_it_key(&it);
+ }
+
+ if (map_it != m.end() || !stdskl_is_end(&skl, &it) || i != m.size() || i != stdskl_size(&skl)) {
+ fprintf(stdout, "iterator mismatch!\r\n");
+ abort();
+ }
+
+ /* check that skl and m match backwards */
+
+ stdskl_end(&skl, &it);
+ map_it = m.end();
+ prev = NULL;
+
+ for (i = 0; map_it != m.begin() && !stdskl_is_begin(&skl, &it); ++i) {
+ --map_it;
+ stdskl_it_prev(&it);
+
+ if (strcmp(map_it->first.c_str(), (char*) stdskl_it_key(&it)) != 0) {
+ fprintf(stdout, "key mistmatch!\r\n");
+ abort();
+ }
+
+ if (map_it->second != *(long*) stdskl_it_val(&it)) {
+ fprintf(stdout, "val mismatch!\r\n");
+ abort();
+ }
+
+ if (prev != NULL && strcmp(prev, (char*) stdskl_it_key(&it)) <= 0) {
+ fprintf(stdout, "order incorrect!\r\n");
+ abort();
+ }
+
+ //fprintf(stdout, "%s\n", (char*) stdskl_it_key(&it), *(long*) stdskl_it_val(&it));
+
+ prev = (char*) stdskl_it_key(&it);
+ }
+
+ if (map_it != m.begin() || !stdskl_is_begin(&skl, &it) || i != m.size() || i != stdskl_size(&skl)) {
+ fprintf(stdout, "iterator mismatch!\r\n");
+ abort();
+ }
+}
+
+/************************************************************************************************
+ ***********************************************************************************************/
+
+void full_multi_check(stdskl &skl, multi_type &m)
+{
+ multi_type::iterator multi_it;
+ stdit it;
+ const char * prev;
+ stdsize i;
+
+ /* check that m and skl match forwards */
+
+ stdskl_begin(&skl, &it);
+ multi_it = m.begin();
+ prev = NULL;
+
+ for (i = 0; multi_it != m.end() && !stdskl_is_end(&skl, &it); ++multi_it, stdskl_it_next(&it), ++i) {
+
+ if (strcmp(multi_it->first.c_str(), (char*) stdskl_it_key(&it)) != 0) {
+ fprintf(stdout, "key mistmatch!\r\n");
+ abort();
+ }
+
+ if (multi_it->second != *(long*) stdskl_it_val(&it)) {
+ fprintf(stdout, "val mismatch!\r\n");
+ abort();
+ }
+
+ if (prev != NULL && strcmp(prev, (char*) stdskl_it_key(&it)) > 0) {
+ fprintf(stdout, "order incorrect!\r\n");
+ abort();
+ }
+
+ //fprintf(stdout, "%s\n", (char*) stdskl_it_key(&it), *(long*) stdskl_it_val(&it));
+
+ prev = (char*) stdskl_it_key(&it);
+ }
+
+ if (multi_it != m.end() || !stdskl_is_end(&skl, &it) || i != m.size() || i != stdskl_size(&skl)) {
+ fprintf(stdout, "iterator mismatch!\r\n");
+ abort();
+ }
+
+ /* check that m and skl match backwards */
+
+ stdskl_end(&skl, &it);
+ multi_it = m.end();
+ prev = NULL;
+
+ for (i = 0; multi_it != m.begin() && !stdskl_is_begin(&skl, &it); ++i) {
+ --multi_it;
+ stdskl_it_prev(&it);
+
+ if (strcmp(multi_it->first.c_str(), (char*) stdskl_it_key(&it)) != 0) {
+ fprintf(stdout, "key mistmatch!\r\n");
+ abort();
+ }
+
+ if (multi_it->second != *(long*) stdskl_it_val(&it)) {
+ fprintf(stdout, "val mismatch!\r\n");
+ abort();
+ }
+
+ if (prev != NULL && strcmp(prev, (char*) stdskl_it_key(&it)) < 0) {
+ fprintf(stdout, "order incorrect!\r\n");
+ abort();
+ }
+
+ //fprintf(stdout, "%s\n", (char*) stdskl_it_key(&it), *(long*) stdskl_it_val(&it));
+
+ prev = (char*) stdskl_it_key(&it);
+ }
+
+ if (multi_it != m.begin() || !stdskl_is_begin(&skl, &it) || i != m.size() || i != stdskl_size(&skl)) {
+ fprintf(stdout, "iterator mismatch!\r\n");
+ abort();
+ }
+}
+
+/************************************************************************************************
+ ***********************************************************************************************/
+
+int main(int argc, char **argv)
+{
+ stdcode ret = STDESUCCESS;
+ char buf[1024];
+ size_t slen;
+ long num_lines;
+ map_type::iterator map_it;
+ multi_type::iterator multi_it;
+ stdit it;
+ stdsize i;
+
+ srand(0);
+
+ try {
+ if ((ret = stdskl_construct(&sklmap_test, sizeof(my_str), sizeof(long), NULL)) != STDESUCCESS) {
+ goto main_end0;
+ }
+ } catch (...) {
+ goto main_end0;
+ }
+
+ try {
+ if ((ret = stdskl_construct(&sklmulti_test, sizeof(my_str), sizeof(long), NULL)) != STDESUCCESS) {
+ goto main_end1;
+ }
+ } catch (...) {
+ goto main_end1;
+ }
+
+ try {
+ /* read in stdin line by line and insert into maps */
+
+ for (num_lines = 0; (slen = my_read_line(buf, sizeof(buf), stdin)) != 0;) {
+ my_str s = { { 0 } }; /* NOTE: ensure zeroed out so that memcmp will work properly */
+
+ if (slen > MY_STR_MAX_CHARS) {
+ continue;
+ }
+
+ strcpy(s.str, buf);
+
+ /* insert into maps */
+
+ map_test[buf] = num_lines;
+
+ if ((ret = stdskl_put(&sklmap_test, &it, &s, &num_lines, STDFALSE)) != STDESUCCESS) {
+ goto main_end2;
+ }
+
+ /* insert into multi-maps */
+
+ multi_test.insert(multi_test.upper_bound(buf), pair<string, long>(buf, num_lines));
+
+ if ((ret = stdskl_insert(&sklmulti_test, stdskl_upperb(&sklmulti_test, &it, &s), &s, &num_lines, STDTRUE)) != STDESUCCESS) {
+ goto main_end2;
+ }
+
+ ++num_lines;
+ }
+
+ fprintf(stdout, "map_test size %lu; sklmap_test size %lu, multi_test size %lu; sklmulti_test size %lu\r\n",
+ map_test.size(), stdskl_size(&sklmap_test), multi_test.size(), stdskl_size(&sklmulti_test));
+
+ full_map_check(sklmap_test, map_test);
+ full_multi_check(sklmulti_test, multi_test);
+
+ /* make copies and check that they worked */
+
+ map_base = map_test;
+ multi_base = multi_test;
+
+ if ((ret = stdskl_copy_construct(&sklmap_base, &sklmap_test)) != STDESUCCESS) {
+ goto main_end2;
+ }
+
+ } catch (...) {
+ goto main_end2;
+ }
+
+ try {
+
+ if ((ret = stdskl_copy_construct(&sklmulti_base, &sklmulti_test)) != STDESUCCESS) {
+ goto main_end3;
+ }
+
+ } catch (...) {
+ goto main_end3;
+ }
+
+ try {
+ full_map_check(sklmap_base, map_base);
+ full_multi_check(sklmulti_base, multi_base);
+
+ /* perform some random deletes (this idiom has horrible performance btw) */
+
+ for (i = 0; !map_test.empty(); ++i) {
+ int r = rand() % STDMIN(1000, map_test.size());
+
+ map_it = map_test.begin();
+ advance(map_it, r);
+ map_test.erase(map_it);
+
+ stdskl_erase(&sklmap_test, stdskl_get(&sklmap_test, &it, r));
+
+ multi_it = multi_test.begin();
+ advance(multi_it, r);
+ multi_test.erase(multi_it);
+
+ stdskl_erase(&sklmulti_test, stdskl_get(&sklmulti_test, &it, r));
+ }
+
+ fprintf(stdout, "map_test size %lu; sklmap_test size %lu, multi_test size %lu; sklmulti_test size %lu\r\n",
+ map_test.size(), stdskl_size(&sklmap_test), multi_test.size(), stdskl_size(&sklmulti_test));
+
+ full_map_check(sklmap_test, map_test);
+ full_multi_check(sklmulti_test, multi_test);
+
+ /* test setting one map equal to another */
+
+ map_test = map_base;
+ multi_test = multi_base;
+
+ if ((ret = stdskl_set_eq(&sklmap_test, &sklmap_base)) != STDESUCCESS) {
+ goto main_end4;
+ }
+
+ if ((ret = stdskl_set_eq(&sklmulti_test, &sklmulti_base)) != STDESUCCESS) {
+ goto main_end4;
+ }
+
+ fprintf(stdout, "map_test size %lu; sklmap_test size %lu, multi_test size %lu; sklmulti_test size %lu\r\n",
+ map_test.size(), stdskl_size(&sklmap_test), multi_test.size(), stdskl_size(&sklmulti_test));
+
+ full_map_check(sklmap_test, map_test);
+ full_multi_check(sklmulti_test, multi_test);
+
+ fprintf(stdout, "Success!\r\n");
+ fflush(stdout);
+
+ } catch (...) {
+ goto main_end4;
+ }
+
+ main_end4:
+ stdskl_destruct(&sklmulti_base);
+
+ main_end3:
+ stdskl_destruct(&sklmap_base);
+
+ main_end2:
+ stdskl_destruct(&sklmulti_test);
+
+ main_end1:
+ stdskl_destruct(&sklmap_test);
+
+ main_end0:
+ if (ret != 0) {
+ stderr_abort("something failed with error code %d: %s\r\n", ret, stderr_strerr(ret));
+ }
+
+ return ret;
+}
Modified: vendor/stdutil/current/src/stdthread.c
===================================================================
--- vendor/stdutil/current/src/stdthread.c 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdthread.c 2005-08-06 12:40:26 UTC (rev 255)
@@ -112,12 +112,17 @@
goto stdthread_join_fail;
}
- if (GetExitCodeThread(thr, &term_status) == 0) {
- goto stdthread_join_fail;
- }
+ if (exitval_ptr != NULL) {
+# if (SIZEOF_VOID_P <= 4 && SIZEOF_VOID_P <= SIZEOF_INT)
- if (exitval_ptr != NULL) {
- *exitval_ptr = (void*) term_status; /* TODO: broken if sizeof(void*) != sizeof(DWORD) */
+ if (GetExitCodeThread(thr, &term_status) == 0) {
+ goto stdthread_join_fail;
+ }
+
+ *exitval_ptr = (void*) term_status;
+# else
+ *exitval_ptr = NULL; /* can't pass a larger pointer through a 4 byte DWORD */
+# endif
}
if (CloseHandle(thr) == 0) {
@@ -147,7 +152,11 @@
STDINLINE void stdthread_exit(void *exitval)
# if defined(_WIN32)
{
- _endthreadex((unsigned) exitval); /* TODO: broken if sizeof(void*) != sizeof(DWORD) */
+# if (SIZEOF_VOID_P <= 4 && SIZEOF_VOID_P <= SIZEOF_INT)
+ _endthreadex((unsigned) exitval);
+# else
+ _endthreadex(0); /* can't pass a larger pointer through a 4 byte DWORD */
+# endif
}
# else
{
@@ -243,8 +252,8 @@
ret = STDEBUSY;
}
- } __except (GetExceptionCode() == STATUS_NO_MEMORY ||
- GetExceptionCode() == STATUS_INVALID_HANDLE ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
+ } __except ((GetExceptionCode() == STATUS_NO_MEMORY ||
+ GetExceptionCode() == STATUS_INVALID_HANDLE) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
ret = STDENOMEM;
}
@@ -282,40 +291,55 @@
{
stdcode ret;
stdbool woke_one = STDFALSE;
- DWORD err = 0;
- int loop_cnt;
if ((ret = stdmutex_impl_grab(&cond->lock, STDTRUE)) != STDESUCCESS) {
goto stdcond_wake_impl_end;
}
- while ((wake_all || !woke_one) && STDSLEEPERS_BEGIN(cond) != STDSLEEPERS_END(cond)) {
- stdcond_link * curr = STDSLEEPERS_BEGIN(cond);
- stdcond_link * next = curr->next;
- HANDLE sleeper = curr->sleeper;
+ while (ret == STDESUCCESS && (wake_all || !woke_one) && STDSLEEPERS_BEGIN(cond) != STDSLEEPERS_END(cond)) {
+ stdcond_link * curr = STDSLEEPERS_BEGIN(cond);
+ stdcond_link * next = curr->next;
+ HANDLE sleeper = curr->sleeper;
+ stdbool inf_loop = STDFALSE;
+ DWORD loop_cnt;
+ DWORD err;
- /* wake sleeper */
+ /* wake sleeper at front of sleepers list */
woke_one = STDFALSE;
- for (loop_cnt = 0; loop_cnt < 1000 && err != 1 && err != -1; ++loop_cnt) {
+ for (loop_cnt = 20; loop_cnt != 0; --loop_cnt) { /* don't try to wake sleeper more than a constant # of times */
err = ResumeThread(sleeper);
if (err == 1) {
- woke_one = STDTRUE; /* THE SLEEPER HAS AWOKEN! */
+ woke_one = STDTRUE; /* THE SLEEPER HAS AWOKEN! */
+ break;
- } else if (err == 0) { /* sleeper wasn't sleeping yet */
- Sleep(0); /* yield time slice to give sleeper a chance to hit Suspend() */
+ } else if (err == 0) {
+ Sleep(0); /* sleeper hasn't suspended yet: yield time slice and try again */
- } else if (err == -1) { /* error: remove from list + try next sleeper */
+ } else if (err == (DWORD) -1) { /* error */
ret = (stdcode) GetLastError();
+ break;
+
+ } else if (err > MAXIMUM_SUSPEND_COUNT || (err > loop_cnt && inf_loop)) {
+ ret = STDEUNKNOWN; /* suspend count acting weird: either invalid or not decrementing! */
+ break;
+
+ } else {
+ inf_loop = STDTRUE; /* only allow setting loop_cnt one time to prevent infinite loops */
+ loop_cnt = err; /* set loop_cnt to number of ResumeThreads needed */
}
-
- /* else suspended multiple times -> keep waking him */
}
- /* NOTE: if loop_cnt gets to 1000; we treat it as an error: remove from list + try next sleeper */
+ /* if ResumeThread returns 0 on the last iteration of the loop,
+ then we treat it as a (semi) success: he's already been awoken
+ */
+ if (loop_cnt == 0) {
+ woke_one = STDTRUE;
+ }
+
/* unlink curr from beginning of sleepers; reclaim handle and stdcond_link */
next->prev = STDSLEEPERS_END(cond);
@@ -353,7 +377,7 @@
/* error handling and return */
stdmutex_fast_init_fail:
- mut->mut_type = STDMUTEX_INVAL;
+ mut->mut_type = (stdmutex_type) 0;
stdmutex_fast_init_end:
return ret;
@@ -370,7 +394,7 @@
STDSAFETY_CHECK(mut->mut_type == STDMUTEX_FAST);
if ((ret = stdmutex_impl_fini(&mut->mut.fast)) == STDESUCCESS) {
- mut->mut_type = STDMUTEX_INVAL;
+ mut->mut_type = (stdmutex_type) 0;
}
return ret;
@@ -408,6 +432,7 @@
/* NOTE: this WIN32 code works for both fast and recursive mutexes:
the WIN32 stdmutex_rcrsv_cond_wait is a call through to this fcn
*/
+
stdcode ret = STDESUCCESS;
HANDLE curr_proc;
HANDLE curr_thread;
@@ -418,6 +443,8 @@
stdcond_link * my_link;
stdbool reacquire = STDFALSE;
+ STDSAFETY_CHECK(mut->mut_type == STDMUTEX_FAST || mut->mut_type == STDMUTEX_RCRSV);
+
/* check for recursive mutexes that owner only has one lock */
if (mut->mut_type == STDMUTEX_RCRSV) {
@@ -435,14 +462,10 @@
ret = STDEBUSY;
goto stdmutex_fast_cond_wait_end;
}
-
- } else if (mut->mut_type != STDMUTEX_FAST) {
- ret = STDEINVAL;
- goto stdmutex_fast_cond_wait_end;
}
/* NOTE: we DuplicateHandle because only this thread is allowed to
- use a handle from GetCurrentThread() and other threads will need
+ use a handle from GetCurrentThread() and another thread will need
to resume this thread
*/
@@ -505,16 +528,16 @@
abort();
}
- /* This gap between releasing the lock and suspending is why we
+ /* This gap between releasing cond->lock and suspending is why we
bumped up the priority to the highest level -- waker will fail to
wake us if his attempt occurs while this thread is in this gap
- and he is a higher priority thread. We need to bump to
+ and waker is a higher priority thread. We need to bump to
THREAD_PRIORITY_HIGHEST to ensure that this thread will have
equal or better capability to run as a waker. If a waker was of
higher priority, then he would just loop forever waiting for this
thread to Suspend, which would never happen due to its lower
priority.
- */
+x */
if (SuspendThread(curr_thread) == -1) {
abort();
@@ -589,7 +612,7 @@
stdmutex_impl_fini(&rmut->outer_lock);
stdmutex_rcrsv_init_fail:
- mut->mut_type = STDMUTEX_INVAL;
+ mut->mut_type = (stdmutex_type) 0;
stdmutex_rcrsv_init_end:
return ret;
@@ -620,7 +643,7 @@
goto stdmutex_rcrsv_fini_fail;
}
- mut->mut_type = STDMUTEX_INVAL;
+ mut->mut_type = (stdmutex_type) 0;
rmut->owner_cnt = -666;
rmut->num_waiting = -666;
Modified: vendor/stdutil/current/src/stdutil/private/stdarch.h.in
===================================================================
--- vendor/stdutil/current/src/stdutil/private/stdarch.h.in 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdutil/private/stdarch.h.in 2005-08-06 12:40:26 UTC (rev 255)
@@ -23,10 +23,11 @@
#ifndef stdarch_h_2005_07_12_00_51_28_jschultz_at_cnds_jhu_edu
#define stdarch_h_2005_07_12_00_51_28_jschultz_at_cnds_jhu_edu
-#include <stddef.h>
-#include <limits.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
-/* the following #undef's are filled in by the configure script */
+/* the following defines are filled in by the configure script */
#undef SIZEOF_CHAR
#undef SIZEOF_SHORT
@@ -44,14 +45,12 @@
*/
#undef STDARCH_MAX_BYTE_ALIGNMENT
-#define STDARCH_MAX_BYTE_ALIGNMENT 4
-/* check if a NULL char * is all zero in memory */
+/* check if NULL is all zero in memory for "all" types of pointers */
#undef STDARCH_NULL_IS_ZERO
-#define STDARCH_NULL_IS_ZERO 1
-/* endian reorder mapping */
+/* endian byte reordering mapping */
#undef STDENDIAN16_SWAP
@@ -83,91 +82,77 @@
#undef STDENDIAN64_HOST6_FROM_NET
#undef STDENDIAN64_HOST7_FROM_NET
-/* define std(u)int32, std(u)int64 and min/max constants */
+/* do architecture specific integer type defs and checks */
+/* ensure char's are 1 byte long */
+
#if (SIZEOF_CHAR != 1)
# error No 1 byte integer type found!
#endif
+/* ensure short's are 2 bytes long */
+
#if (SIZEOF_SHORT != 2)
# error No 2 byte integer type found!
#endif
+/* figure out which type is 4 bytes long */
+
#if (SIZEOF_INT == 4)
-typedef int stdint32;
-typedef unsigned int stduint32;
+typedef int stdarch_int32;
+typedef unsigned int stdarch_uint32;
-# define STDINT32_MAX INT_MAX
-# define STDINT32_MIN INT_MIN
-# define STDUINT32_MAX UINT_MAX
-
#elif (SIZEOF_LONG == 4)
-typedef long stdint32;
-typedef unsigned long stduint32;
+typedef long stdarch_int32;
+typedef unsigned long stdarch_uint32;
-#define STDINT32_MAX LONG_MAX
-#define STDINT32_MIN LONG_MIN
-#define STDUINT32_MAX ULONG_MAX
-
#else
# error No 4 byte integer type found!
#endif
-#if defined(_WIN32)
+/* figure out which type is 8 bytes long */
-typedef __int64 stdint64;
-typedef unsigned __int64 stduint64;
+#if (SIZEOF_LONG == 8)
-#elif (SIZEOF_LONG == 8)
+typedef long stdarch_int64;
+typedef unsigned long stdarch_uint64;
-typedef long stdint64;
-typedef unsigned long stduint64;
-
#elif (SIZEOF_LONG_LONG == 8)
-typedef long long stdint64;
-typedef unsigned long long stduint64;
+typedef long long stdarch_int64;
+typedef unsigned long long stdarch_uint64;
+#elif defined(_MSC_VER)
+
+typedef __int64 stdarch_int64;
+typedef unsigned __int64 stdarch_uint64;
+
#else
# error No 8 byte integeral type found!
#endif
-#define STDINT64_MAX (~STDINT64_MIN)
-#define STDINT64_MIN ((stdint64) 0x1 << 63)
-#define STDUINT64_MAX ((stduint64) -1)
+/* figure out which type is the same size as size_t */
-/* define stdssize type and min/max constants */
-
#if (SIZEOF_SIZE_T == 2)
-typedef short stdssize;
+typedef short stdarch_ssize;
-# define STDSSIZE_MAX SHRT_MAX
-# define STDSSIZE_MIN SHRT_MIN
-
#elif (SIZEOF_SIZE_T == 4)
-typedef stdint32 stdssize;
+typedef stdarch_int32 stdarch_ssize;
-# define STDSSIZE_MAX STDINT32_MAX
-# define STDSSIZE_MIN STDINT32_MIN
-
#elif (SIZEOF_SIZE_T == 8)
-typedef stdint64 stdssize;
+typedef stdarch_int64 stdarch_ssize;
-# define STDSSIZE_MAX STDINT64_MAX
-# define STDSSIZE_MIN STDINT64_MIN
-
#else
# error No integral type of same size as size_t!
#endif
-/* macros used for ensuring proper byte alignment of types in memory */
+#ifdef __cplusplus
+}
+#endif
-#define STDARCH_PADDING(x) ((STDARCH_MAX_BYTE_ALIGNMENT - ((x) & (STDARCH_MAX_BYTE_ALIGNMENT - 1))) & (STDARCH_MAX_BYTE_ALIGNMENT - 1))
-#define STDARCH_PADDED_SIZE(x) ((x) + STDARCH_PADDING(x))
-
#endif
Modified: vendor/stdutil/current/src/stdutil/private/stdskl_p.h
===================================================================
--- vendor/stdutil/current/src/stdutil/private/stdskl_p.h 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdutil/private/stdskl_p.h 2005-08-06 12:40:26 UTC (rev 255)
@@ -49,7 +49,7 @@
} stdskl_node;
-/* stdskl: A tree based dictionary that maps non-unique keys to values.
+/* stdskl: A skiplist based dictionary that maps non-unique keys to values.
end_node - pointer to sentinel end node of list
size - number of key-value pairs contained
@@ -74,7 +74,7 @@
stduint16 seed[3];
stduint32 rand_bits;
- stduint8 bits_left;
+ stdint8 bits_left;
} stdskl;
Modified: vendor/stdutil/current/src/stdutil/private/stdthread_p.h
===================================================================
--- vendor/stdutil/current/src/stdutil/private/stdthread_p.h 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdutil/private/stdthread_p.h 2005-08-06 12:40:26 UTC (rev 255)
@@ -56,7 +56,9 @@
semantics is to have an auto-reset EVENT that you PulseEvent N
times for each sleeping thread for wake all. If you do that you
can have a timed sleep, whereas we can't easily do that with
- SuspendThread and ResumeThread.
+ SuspendThread and ResumeThread. (Might be able to do this with a
+ dedicated 'waker' thread who manages waking up sleeping threads
+ based on timeouts)
*/
#else
@@ -70,9 +72,6 @@
#endif
-#define STDMUTEX_INVAL -1UL
-
-typedef stdulong stdmutex_type;
typedef stdmutex_impl stdmutex_fast;
typedef struct
@@ -87,7 +86,7 @@
typedef struct stdmutex
{
- volatile stdmutex_type mut_type;
+ stdmutex_type mut_type;
union {
stdmutex_fast fast;
Modified: vendor/stdutil/current/src/stdutil/stddefines.h
===================================================================
--- vendor/stdutil/current/src/stdutil/stddefines.h 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdutil/stddefines.h 2005-08-06 12:40:26 UTC (rev 255)
@@ -23,13 +23,18 @@
#ifndef stddefines_h_2000_10_22_18_20_30_jschultz_at_cnds_jhu_edu
#define stddefines_h_2000_10_22_18_20_30_jschultz_at_cnds_jhu_edu
+#include <stddef.h>
+#include <limits.h>
+
+/* include basic, architecture-specific types and constants */
+
#include <stdutil/private/stdarch.h>
#ifdef __cplusplus
extern "C" {
#endif
-/* define some useful basic types */
+/* define some useful basic types and constants */
typedef int stdbool;
@@ -62,13 +67,27 @@
#define STDINT16_MIN SHRT_MIN
#define STDUINT16_MAX USHRT_MAX
+typedef stdarch_int32 stdint32;
+typedef stdarch_uint32 stduint32;
+
+#define STDINT32_MAX (STDINT32_MIN - 1)
+#define STDINT32_MIN ((stdint32) ((stduint32) 0x1 << 31))
+#define STDUINT32_MAX ((stduint32) -1)
+
+typedef stdarch_int64 stdint64;
+typedef stdarch_uint64 stduint64;
+
+#define STDINT64_MAX (STDINT64_MIN - 1)
+#define STDINT64_MIN ((stdint64) ((stduint64) 0x1 << 63))
+#define STDUINT64_MAX ((stduint64) -1)
+
typedef size_t stdsize;
+typedef stdarch_ssize stdssize; /* a signed version of size_t */
+
+#define STDSSIZE_MAX (STDSSIZE_MIN - 1)
+#define STDSSIZE_MIN ((stdssize) ((stdsize) 0x1 << (sizeof(stdssize) * 8 - 1))
#define STDSIZE_MAX ((stdsize) -1)
-/* stdarch.h similiarly defines std(u)int32, std(u)int64, stdssize (a
- signed verion of stdsize) and associated min and max constants
-*/
-
/* define comparison fcn types */
typedef stduint32 stdhcode;
@@ -78,30 +97,37 @@
/* define some common, if dangerous, macros */
-#define STDSWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t))
-#define STDMAX(x, y) ((x) > (y) ? (x) : (y))
-#define STDMIN(x, y) ((x) < (y) ? (x) : (y))
+#define STDSWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t))
+#define STDMAX(x, y) ((x) > (y) ? (x) : (y))
+#define STDMIN(x, y) ((x) < (y) ? (x) : (y))
/* define some useful constants */
-#define STD1THOUSAND 1000
-#define STD1MILLION 1000000L
-#define STD1BILLION 1000000000L
+#define STD1THOUSAND 1000
+#define STD1MILLION 1000000L
+#define STD1BILLION 1000000000L
/* inline rules vary too much from language to language (C89, C99,
C++) and compiler to compiler (gcc, .NET, etc.) in non-standard
usage (i.e. - inline in C89) for stdutil to use any one inline
- syntax. The way to get inline to work as expected with stdutil is
- to have one translation unit that first #includes all of stdutil's
- .c files and then all of your app's .c files. Then #define or -D
- STDINLINE as the appropriate value for your compiler/language combo
- to get fcn inlining to work.
+ syntax. The way to get inline to work as it should with stdutil is
+ to compile all of your project in one translation unit, either
+ #define or -D an appropriate value for STDINLINE and THEN #include
+ <stdutil/> which properly includes ALL of stdutil's code. Because
+ all of your code will be in a single translation unit, the compiler
+ can then do a good job of inline'ing stdutil fcn calls, which it
+ can't do well if stdutil is a library.
*/
#ifndef STDINLINE
# define STDINLINE
#endif
+/* macros used for ensuring proper byte alignment of dynamic types in memory */
+
+#define STDARCH_PADDING(x) ((STDARCH_MAX_BYTE_ALIGNMENT - ((x) & (STDARCH_MAX_BYTE_ALIGNMENT - 1))) & (STDARCH_MAX_BYTE_ALIGNMENT - 1))
+#define STDARCH_PADDED_SIZE(x) ((x) + STDARCH_PADDING(x))
+
#ifdef __cplusplus
}
#endif
Modified: vendor/stdutil/current/src/stdutil/stderror.h
===================================================================
--- vendor/stdutil/current/src/stdutil/stderror.h 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdutil/stderror.h 2005-08-06 12:40:26 UTC (rev 255)
@@ -35,6 +35,7 @@
/* stderr error routines */
#ifndef STDERR_MAX_ERR_MSG_LEN
+/* NOTE: redefining this variable only has an effect at compile time of the stdutil LIBRARY; not app. code */
# define STDERR_MAX_ERR_MSG_LEN 1024
#endif
@@ -108,6 +109,12 @@
# define STDENOSYS 506
#endif
+#if defined(EINTR)
+# define STDEINTR EINTR
+#else
+# define STDEINTR 507
+#endif
+
#ifdef __cplusplus
}
#endif
Modified: vendor/stdutil/current/src/stdutil/stdfd.h
===================================================================
--- vendor/stdutil/current/src/stdutil/stdfd.h 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdutil/stdfd.h 2005-08-06 12:40:26 UTC (rev 255)
@@ -37,11 +37,30 @@
} stdfd;
+#define STDFD_INIT() { -1, NULL }
+
+typedef enum
+{
+ STDFD_READ_ONLY = 2000, /* rb */
+ STDFD_READ_WRITE_EXISTING, /* rb+ */
+ STDFD_WRITE_ONLY, /* wb */
+ STDFD_READ_WRITE_NEW, /* wb+ */
+ STDFD_APPEND_ONLY, /* ab */
+ STDFD_READ_APPEND /* ab+ */
+
+} stdfd_access_type; /* as per fopen(): redefined for static enum check warnings */
+
+typedef enum
+{
+ STDSEEK_SET = SEEK_SET,
+ STDSEEK_CUR = SEEK_CUR,
+ STDSEEK_END = SEEK_END
+
+} stdfd_whence; /* as per fseek(): redefined for static enum check warnings */
+
/* File Descriptor Operations */
-#define STDFD_STATIC_CONSTRUCT { -1, NULL }
-
-STDINLINE stdcode stdfd_open(stdfd *fd, const char *path, const char *mode);
+STDINLINE stdcode stdfd_open(stdfd *fd, const char *path, stdfd_access_type mode);
STDINLINE stdcode stdfd_close(stdfd *fd);
STDINLINE stdcode stdfd_read(stdfd *fd, void *ptr, stdsize nsize, stdsize nmemb, stdsize *num);
@@ -50,19 +69,9 @@
STDINLINE stdcode stdfd_flush(stdfd *fd);
STDINLINE stdcode stdfd_sync(stdfd *fd);
-typedef long stdfd_pos;
+STDINLINE stdcode stdfd_seek(stdfd *fd, long offset, stdfd_whence whence);
+STDINLINE stdcode stdfd_tell(stdfd *fd, long *pos);
-typedef enum
-{
- STDSEEK_SET = SEEK_SET,
- STDSEEK_CUR = SEEK_CUR,
- STDSEEK_END = SEEK_END
-
-} stdfd_whence;
-
-STDINLINE stdcode stdfd_seek(stdfd *fd, stdfd_pos offset, stdfd_whence whence);
-STDINLINE stdcode stdfd_get_pos(stdfd *fd, stdfd_pos *pos);
-
STDINLINE stdbool stdfd_eof(stdfd *fd);
STDINLINE stdbool stdfd_err(stdfd *fd);
STDINLINE void stdfd_clr_err(stdfd *fd);
Modified: vendor/stdutil/current/src/stdutil/stdit.h
===================================================================
--- vendor/stdutil/current/src/stdutil/stdit.h 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdutil/stdit.h 2005-08-06 12:40:26 UTC (rev 255)
@@ -44,7 +44,7 @@
STDINLINE stdit_type stdit_get_type(const stdit *it);
STDINLINE const void * stdit_key(const stdit *it); /* returns NULL for non-dictionary iterators */
-STDINLINE stdsize stdit_key_size(const stdit *it); /* returns zero for non-dictionary iterators */
+STDINLINE stdsize stdit_key_size(const stdit *it); /* returns 0 for non-dictionary iterators */
STDINLINE void * stdit_val(const stdit *it);
STDINLINE stdsize stdit_val_size(const stdit *it);
@@ -68,11 +68,11 @@
/* Pointer/C-Array Iterator Constructor */
-STDINLINE stdit * stdit_ptr(stdit *it, const void * val, stdsize vsize);
+STDINLINE stdit * stdit_ptr(stdit *it, const void * vals, stdsize vsize);
/* Parallel Pointer/C-Array Constructor */
-STDINLINE stdit * stdit_pptr(stdit *it, const void *key, const void *val, stdsize ksize, stdsize vsize);
+STDINLINE stdit * stdit_pptr(stdit *it, const void *keys, const void *vals, stdsize ksize, stdsize vsize);
#ifdef __cplusplus
}
Modified: vendor/stdutil/current/src/stdutil/stdthread.h
===================================================================
--- vendor/stdutil/current/src/stdutil/stdthread.h 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdutil/stdthread.h 2005-08-06 12:40:26 UTC (rev 255)
@@ -31,6 +31,13 @@
extern "C" {
# endif
+typedef enum
+{
+ STDMUTEX_FAST = (int) 0xa720c831UL,
+ STDMUTEX_RCRSV = (int) 0x3f6c20deUL
+
+} stdmutex_type;
+
# include <stdutil/private/stdthread_p.h>
/* Declare thread entry functions like this: void * STDTHREAD_FCN foo(void * arg); */
@@ -50,9 +57,6 @@
/* Mutual Exclusion Locks */
-# define STDMUTEX_FAST 0xa720c831UL
-# define STDMUTEX_RCRSV 0x3f6c20deUL
-
STDINLINE stdcode stdmutex_construct(stdmutex *mut, stdmutex_type t);
STDINLINE stdcode stdmutex_destruct(stdmutex *mut);
Modified: vendor/stdutil/current/src/stdutil/stdtime.h
===================================================================
--- vendor/stdutil/current/src/stdutil/stdtime.h 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdutil/stdtime.h 2005-08-06 12:40:26 UTC (rev 255)
@@ -49,7 +49,7 @@
STDINLINE stdtime stdtime_sub(stdtime ls, stdtime rs);
STDINLINE stdcode stdtime64_now(stdtime64 *abs_time);
-STDINLINE stdtime64 stdtime64_time(stdtime t); /* conversion can over/under flow */
+STDINLINE stdtime64 stdtime64_time(stdtime t); /* conversion can silently over/under flow */
/* sleep fcns */
Modified: vendor/stdutil/current/src/stdutil/stdutil.h
===================================================================
--- vendor/stdutil/current/src/stdutil/stdutil.h 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdutil/stdutil.h 2005-08-06 12:40:26 UTC (rev 255)
@@ -39,7 +39,7 @@
STDINLINE void * stdmemdup(const void *dupme, stdsize n);
-/* hcode fcns */
+/* 32b hcode fcns */
STDINLINE stduint32 stdhcode_oaat(const void * buf, stdsize buf_len);
Modified: vendor/stdutil/current/src/stdutil.c
===================================================================
--- vendor/stdutil/current/src/stdutil.c 2005-08-05 23:18:38 UTC (rev 254)
+++ vendor/stdutil/current/src/stdutil.c 2005-08-06 12:40:26 UTC (rev 255)
@@ -67,13 +67,15 @@
}
/************************************************************************************************
- * stdstrdup: Return a malloc'ed copy of 'dupme.'
+ * stdstrdup: Return a malloc'ed copy of 'dupme.' Returns NULL on
+ * allocation failure. If len_ptr is not NULL, then strlen(dupme)
+ * will always be placed there regardless of success or failure.
***********************************************************************************************/
STDINLINE char *stdstrdup(const char *dupme, stdsize *len_ptr)
{
stdsize len = strlen(dupme);
- char * ret = malloc(len + 1);
+ char * ret = (char*) malloc(len + 1);
if (len_ptr != NULL) {
*len_ptr = len;
@@ -83,9 +85,9 @@
}
/************************************************************************************************
- * stdstrdup_n: Like stdstrdup, but only copies up through the first
- * min('n', strlen('src')) bytes of 'src' and then adds a NUL
- * termination.
+ * stdstrdup_n: Like stdstrdup, but only allocates and copies up
+ * through the first min('n', strlen('src')) bytes of 'src' and then
+ * adds a NUL termination.
***********************************************************************************************/
STDINLINE char *stdstrdup_n(const char *src, stdsize *len_ptr, size_t n)
@@ -113,13 +115,14 @@
}
/************************************************************************************************
- * stdmemdup: Allocates a new block of memory 'n' bytes long and
- * copies the first 'n' bytes of 'src' to the new block.
+ * stdmemdup: Allocates and returns a new block of memory 'n' bytes
+ * long and copies the first 'n' bytes of 'src' to the new block. If
+ * n is zero this fcn will return NULL.
***********************************************************************************************/
STDINLINE void *stdmemdup(const void *src, size_t n)
{
- void * ret = malloc(n);
+ void * ret = (n != 0 ? malloc(n) : NULL);
if (ret != NULL) {
memcpy(ret, src, n);
@@ -139,7 +142,7 @@
{
const char * kit = (const char*) buf;
const char * kend = (const char*) buf + buf_len;
- stduint32 ret = (stduint32) buf_len;
+ stduint32 ret = ~((stduint32) buf_len);
for (; kit != kend; ++kit) {
ret += *kit;
@@ -157,14 +160,15 @@
/************************************************************************************************
* stdhcode_oaat_start: Begin computing a One-at-a-Time hash that will
* span several buffers. Preferably, but not required, tot_len would
- * equal the total length of the buffers to be hcoded. For least
- * collisions, if the total length is unknown but non-zero,
- * consistently use the same arbitrary non-zero constant (e.g. -1).
+ * equal the total length of the buffers to be hcoded. If the total
+ * length is unknown (or you simply don't want to compute it), then
+ * consistently use the same arbitrary constant (e.g. - 0) when
+ * computing the hcode for those objects.
***********************************************************************************************/
STDINLINE void stdhcode_oaat_start(stduint32 *hsh, stdsize tot_len)
{
- *hsh = (stduint32) tot_len;
+ *hsh = ~((stduint32) tot_len);
}
/************************************************************************************************
@@ -207,22 +211,22 @@
* stdhcode_sfh: Paul Hsieh's Super Fast Hash hash code function.
* Computes a 32 bit integer based on all 'buf_len' bytes of 'buf.'
* Every input bit can affect every bit of the result with about 50%
- * probability per output bit -- has no funnels. Paul Hsieh alleges
+ * probability per output bit -- has no funnels. Paul Hsieh claims
* superior speed and distribution compared to One-at-a-Time.
***********************************************************************************************/
#if ((defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) || defined(_MSC_VER) || \
defined (__BORLANDC__) || defined (__TURBOC__))
-# define stdhcode_sfh_get16bits(d) (*((const stduint16*) (d)))
+# define stdhcode_sfh_get16bits(d) ( *((const stduint16*)(d)) )
#else
-# define stdhcode_sfh_get16bits(d) ( (stduint16) (*((const stduint8 *)(d) + 1) << 8) + *((const stduint8 *)(d)) )
+# define stdhcode_sfh_get16bits(d) ( ((stduint16) *((const stduint8 *)(d) + 1) << 8) + *(const stduint8 *)(d) )
#endif
STDINLINE stduint32 stdhcode_sfh(const void * buf, stdsize buf_len)
{
const stduint8 * kit = (const stduint8*) buf;
- const stduint8 * kend = (const stduint8*) buf + (buf_len & ~0x3);
- stduint32 ret = (stduint32) buf_len;
+ const stduint8 * kend = (const stduint8*) buf + (buf_len & ~0x3); /* leave remainder modulo 4 */
+ stduint32 ret = ~((stduint32) buf_len);
stduint32 tmp;
/* main mixing loop */
@@ -235,7 +239,7 @@
ret += ret >> 11;
}
- /* handle remainder not handled by loop */
+ /* handle remainder modulo 4 not handled by loop */
switch (buf_len & 0x3) {
case 3:
@@ -272,14 +276,15 @@
/************************************************************************************************
* stdhcode_sfh_start: Begin computing a SuperFastHash hash that will
* span several buffers. Preferably, but not required, tot_len would
- * equal the total length of the buffers to be hash coded. For least
- * collisions, if the total length is unknown but non-zero,
- * consistently use an arbitrary constant instead of zero (e.g. -1).
+ * equal the total length of the buffers to be hash coded. If the total
+ * length is unknown (or you simply don't want to compute it), then
+ * consistently use the same arbitrary constant (e.g. - 0) when
+ * computing the hcode for those objects.
***********************************************************************************************/
STDINLINE void stdhcode_sfh_start(stduint32 *hsh, stdsize tot_len)
{
- *hsh = tot_len;
+ *hsh = ~((stduint32) tot_len);
}
/************************************************************************************************
@@ -290,7 +295,7 @@
STDINLINE void stdhcode_sfh_churn(stduint32 *hsh, const void * buf, stdsize buf_len)
{
const stduint8 * kit = (const stduint8*) buf;
- const stduint8 * kend = (const stduint8*) buf + (buf_len & ~3);
+ const stduint8 * kend = (const stduint8*) buf + (buf_len & ~0x3); /* leave remainder modulo 4 */
stduint32 ret = *hsh;
stduint32 tmp;
@@ -304,7 +309,7 @@
ret += ret >> 11;
}
- /* handle remainder not handled by loop */
+ /* handle modulo 4 remainder not handled by loop */
switch (buf_len & 3) {
case 3:
@@ -350,8 +355,8 @@
*hsh = ret;
}
-/*
- * Copyright (c) 1993 Martin Birgmeier
+
+/* Copyright (c) 1993 Martin Birgmeier
* All rights reserved.
*
* You may redistribute unmodified or modified versions of this source
@@ -467,14 +472,14 @@
/************************************************************************************************
* For the following endian flipping code, I have defined in
- * stdutil/stdutil_p.h a mapping from network byte order to host byte
- * order and the reverse mapping for several size integers.
+ * stdutil/private/stdarch.h a mapping from network byte order to host
+ * byte order and the reverse mapping for 16, 32 and 64 bit integers.
*
* For example, in a 64b integer on little endian architectures, the
- * most significant byte is the highest byte in memory (7), while on a
- * big endian architecture it is the lowest byte in memory (0). We
- * represent this information in stdutil/stdutil_p.h as, on the
- * respective architectures,
+ * most significant byte is the highest byte in memory (byte 7), while
+ * on a big endian architecture it is the lowest byte in memory (byte
+ * 0). We represent this information in stdutil/stdutil_p.h as, on
+ * the respective architectures,
*
* (#define STDENDIAN64_NET0_FROM_HOST 7, #define STDENDIAN64_HOST7_FROM_NET 0)
*
@@ -663,14 +668,15 @@
/************************************************************************************************
* stdhton_n: Rearranges the 'n' bytes at which 'io' points from host
- * into network byte ordering. If n is one of (1, 2, 4, 8), then the fcn
- * succeeds, returning zero. Otherwise it fails with no side effects,
+ * into network byte ordering. If n is one of (0, 1, 2, 4, 8), then
+ * the fcn succeeds. Otherwise it fails with no side effects,
* returning STDEINVAL.
***********************************************************************************************/
STDINLINE stdcode stdhton_n(void *io, size_t n)
{
switch (n) {
+ case 0:
case 1:
break;
@@ -869,14 +875,15 @@
/************************************************************************************************
* stdntoh_n: Rearranges the 'n' bytes at which 'io' points from
- * network to host byte ordering. If n is one of (1, 2, 4, 8), then the
- * fcn succeeds, returning zero. Otherwise it fails with no side
- * effects, returning STDEINVAL.
+ * network to host byte ordering. If n is one of (0, 1, 2, 4, 8),
+ * then the fcn succeeds. Otherwise it fails with no side effects,
+ * returning STDEINVAL.
***********************************************************************************************/
STDINLINE stdcode stdntoh_n(void *io, size_t n)
{
switch (n) {
+ case 0:
case 1:
break;
@@ -960,20 +967,20 @@
/************************************************************************************************
* stdlg_down: Returns the log base 2 of 'x' rounded down to the
* closest integer (i.e. - floor(lg(x))). Returns (stduint32) -1 if
- * 'x' 0.
+ * 'x' is 0.
***********************************************************************************************/
STDINLINE stduint32 stdlg_down(stduint64 x)
{
- stduint32 shift;
+ stduint32 ret;
if (x == 0) {
return (stduint32) -1;
}
- for (shift = 0; x != 0x1; x >>= 1, ++shift);
+ for (ret = 0; x != 0x1; x >>= 1, ++ret);
- return shift;
+ return ret;
}
/************************************************************************************************
More information about the Spread-cvs
mailing list