diff options
Diffstat (limited to 'contrib/sendmail/libsm/t-types.c')
-rw-r--r-- | contrib/sendmail/libsm/t-types.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/contrib/sendmail/libsm/t-types.c b/contrib/sendmail/libsm/t-types.c new file mode 100644 index 0000000..b1adb0c --- /dev/null +++ b/contrib/sendmail/libsm/t-types.c @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the sendmail distribution. + */ + +#include <sm/gen.h> +SM_IDSTR(id, "@(#)$Id: t-types.c,v 1.16 2001/09/11 04:04:49 gshapiro Exp $") + +#include <sm/limits.h> +#include <sm/io.h> +#include <sm/string.h> +#include <sm/test.h> +#include <sm/types.h> + +int +main(argc, argv) + int argc; + char **argv; +{ + LONGLONG_T ll; + LONGLONG_T volatile lt; + ULONGLONG_T ull; + char buf[128]; + char *r; + + sm_test_begin(argc, argv, "test standard integral types"); + + SM_TEST(sizeof(LONGLONG_T) == sizeof(ULONGLONG_T)); + + /* + ** sendmail assumes that ino_t, off_t and void* can be cast + ** to ULONGLONG_T without losing information. + */ + + if (!SM_TEST(sizeof(ino_t) <= sizeof(ULONGLONG_T)) || + !SM_TEST(sizeof(off_t) <= sizeof(ULONGLONG_T)) || + !SM_TEST(sizeof(void*) <= sizeof(ULONGLONG_T))) + { + (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, "\ +Your C compiler appears to support a 64 bit integral type,\n\ +but libsm is not configured to use it. You will need to set\n\ +either SM_CONF_LONGLONG or SM_CONF_QUAD_T to 1. See libsm/README\n\ +for more details.\n"); + } + + /* + ** Most compilers notice that LLONG_MIN - 1 generate an underflow. + ** Some compiler generate code that will use the 'X' status bit + ** in a CPU and hence (LLONG_MIN - 1 > LLONG_MIN) will be false. + ** So we have to decide whether we want compiler warnings or + ** a wrong test... + ** Question: where do we really need what this test tests? + */ + +#if SM_CONF_TEST_LLONG + ll = LLONG_MIN; + (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, "\ +Your C compiler maybe issued a warning during compilation,\n\ +please IGNORE the compiler warning!.\n"); + lt = LLONG_MIN - 1; + SM_TEST(lt > ll); + sm_snprintf(buf, sizeof(buf), "%llx", ll); + r = "0"; + if (!SM_TEST(buf[0] == '8') + || !SM_TEST(strspn(&buf[1], r) == sizeof(ll) * 2 - 1)) + { + (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, + "oops: LLONG_MIN=%s\n", buf); + } + + ll = LLONG_MAX; + lt = ll + 1; + SM_TEST(lt < ll); + sm_snprintf(buf, sizeof(buf), "%llx", ll); + r = "f"; + if (!SM_TEST(buf[0] == '7') + || !SM_TEST(strspn(&buf[1], r) == sizeof(ll) * 2 - 1)) + { + (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, + "oops: LLONG_MAX=%s\n", buf); + } +#endif /* SM_CONF_TEST_LLONG */ + + ull = ULLONG_MAX; + SM_TEST(ull + 1 == 0); + sm_snprintf(buf, sizeof(buf), "%llx", ull); + r = "f"; + SM_TEST(strspn(buf, r) == sizeof(ll) * 2); + + /* + ** If QUAD_MAX is defined by <limits.h> then quad_t is defined. + ** Make sure LONGLONG_T is at least as big as quad_t. + */ +#ifdef QUAD_MAX + SM_TEST(QUAD_MAX <= LLONG_MAX); +#endif + + return sm_test_end(); +} |