xref: /freebsd/contrib/sendmail/libsm/t-types.c (revision 61e21613)
1 /*
2  * Copyright (c) 2000-2002 Proofpoint, Inc. and its suppliers.
3  *	All rights reserved.
4  *
5  * By using this file, you agree to the terms and conditions set
6  * forth in the LICENSE file which can be found at the top level of
7  * the sendmail distribution.
8  */
9 
10 #include <sm/gen.h>
11 SM_IDSTR(id, "@(#)$Id: t-types.c,v 1.19 2013-11-22 20:51:44 ca Exp $")
12 
13 #include <sm/limits.h>
14 #include <sm/io.h>
15 #include <sm/string.h>
16 #include <sm/test.h>
17 #include <sm/types.h>
18 
19 int
20 main(argc, argv)
21 	int argc;
22 	char **argv;
23 {
24 	LONGLONG_T ll;
25 	LONGLONG_T volatile lt;
26 	ULONGLONG_T ull;
27 	char buf[128];
28 	char *r;
29 
30 	sm_test_begin(argc, argv, "test standard integral types");
31 
32 	SM_TEST(sizeof(LONGLONG_T) == sizeof(ULONGLONG_T));
33 
34 	/*
35 	**  sendmail assumes that ino_t, off_t and void* can be cast
36 	**  to ULONGLONG_T without losing information.
37 	*/
38 
39 	if (!SM_TEST(sizeof(ino_t) <= sizeof(ULONGLONG_T)) ||
40 	    !SM_TEST(sizeof(off_t) <= sizeof(ULONGLONG_T)) ||
41 	    !SM_TEST(sizeof(void*) <= sizeof(ULONGLONG_T)))
42 	{
43 		(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, "\
44 Your C compiler appears to support a 64 bit integral type,\n\
45 but libsm is not configured to use it.  You will need to set\n\
46 either SM_CONF_LONGLONG or SM_CONF_QUAD_T to 1.  See libsm/README\n\
47 for more details.\n");
48 	}
49 
50 	/*
51 	**  Most compilers notice that LLONG_MIN - 1 generate an underflow.
52 	**  Some compiler generate code that will use the 'X' status bit
53 	**  in a CPU and hence (LLONG_MIN - 1 > LLONG_MIN) will be false.
54 	**  So we have to decide whether we want compiler warnings or
55 	**  a wrong test...
56 	**  Question: where do we really need what this test tests?
57 	*/
58 
59 #if SM_CONF_TEST_LLONG
60 	ll = LLONG_MIN;
61 	(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, "\
62 Your C compiler maybe issued a warning during compilation,\n\
63 please IGNORE the compiler warning!.\n");
64 	lt = LLONG_MIN - 1;
65 	SM_TEST(lt > ll);
66 	sm_snprintf(buf, sizeof(buf), "%llx", ll);
67 	r = "0";
68 	if (!SM_TEST(buf[0] == '8')
69 	    || !SM_TEST(strspn(&buf[1], r) == sizeof(ll) * 2 - 1))
70 	{
71 		(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
72 			"oops: LLONG_MIN=%s\n", buf);
73 	}
74 
75 	ll = LLONG_MAX;
76 	lt = ll + 1;
77 	SM_TEST(lt < ll);
78 	sm_snprintf(buf, sizeof(buf), "%llx", ll);
79 	r = "f";
80 	if (!SM_TEST(buf[0] == '7')
81 	    || !SM_TEST(strspn(&buf[1], r) == sizeof(ll) * 2 - 1))
82 	{
83 		(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
84 			"oops: LLONG_MAX=%s\n", buf);
85 	}
86 #endif /* SM_CONF_TEST_LLONG */
87 
88 	ull = ULLONG_MAX;
89 	SM_TEST(ull + 1 == 0);
90 	sm_snprintf(buf, sizeof(buf), "%llx", ull);
91 	r = "f";
92 	SM_TEST(strspn(buf, r) == sizeof(ll) * 2);
93 
94 	/*
95 	**  If QUAD_MAX is defined by <limits.h> then quad_t is defined.
96 	**  Make sure LONGLONG_T is at least as big as quad_t.
97 	*/
98 #ifdef QUAD_MAX
99 	SM_TEST(QUAD_MAX <= LLONG_MAX);
100 #endif
101 
102 	return sm_test_end();
103 }
104