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