1 /* 2 * Copyright (c) 2000-2002 Sendmail, 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 * $Id: cdefs.h,v 1.15 2002/01/16 18:30:11 ca Exp $ 10 */ 11 12 /* 13 ** libsm C language portability macros 14 ** See libsm/cdefs.html for documentation. 15 */ 16 17 #ifndef SM_CDEFS_H 18 # define SM_CDEFS_H 19 20 # include <sm/config.h> 21 22 /* 23 ** BSD and Linux have <sys/cdefs.h> which defines a set of C language 24 ** portability macros that are a defacto standard in the open source 25 ** community. 26 */ 27 28 # if SM_CONF_SYS_CDEFS_H 29 # include <sys/cdefs.h> 30 # endif /* SM_CONF_SYS_CDEFS_H */ 31 32 /* 33 ** Define the standard C language portability macros 34 ** for platforms that lack <sys/cdefs.h>. 35 */ 36 37 # if !SM_CONF_SYS_CDEFS_H 38 # if defined(__cplusplus) 39 # define __BEGIN_DECLS extern "C" { 40 # define __END_DECLS }; 41 # else /* defined(__cplusplus) */ 42 # define __BEGIN_DECLS 43 # define __END_DECLS 44 # endif /* defined(__cplusplus) */ 45 # if defined(__STDC__) || defined(__cplusplus) 46 # ifndef __P 47 # define __P(protos) protos 48 # endif /* __P */ 49 # define __CONCAT(x,y) x ## y 50 # define __STRING(x) #x 51 # else /* defined(__STDC__) || defined(__cplusplus) */ 52 # define __P(protos) () 53 # define __CONCAT(x,y) x/**/y 54 # define __STRING(x) "x" 55 # define const 56 # define signed 57 # define volatile 58 # endif /* defined(__STDC__) || defined(__cplusplus) */ 59 # endif /* !SM_CONF_SYS_CDEFS_H */ 60 61 /* 62 ** Define SM_DEAD, a macro used to declare functions that do not return 63 ** to their caller. 64 */ 65 66 # ifndef SM_DEAD 67 # if __GNUC__ >= 2 68 # if __GNUC__ == 2 && __GNUC_MINOR__ < 5 69 # define SM_DEAD(proto) volatile proto 70 # else /* __GNUC__ == 2 && __GNUC_MINOR__ < 5 */ 71 # define SM_DEAD(proto) proto __attribute__((__noreturn__)) 72 # endif /* __GNUC__ == 2 && __GNUC_MINOR__ < 5 */ 73 # else /* __GNUC__ >= 2 */ 74 # define SM_DEAD(proto) proto 75 # endif /* __GNUC__ >= 2 */ 76 # endif /* SM_DEAD */ 77 78 /* 79 ** Define SM_UNUSED, a macro used to declare variables that may be unused. 80 */ 81 82 # ifndef SM_UNUSED 83 # if __GNUC__ >= 2 84 # if __GNUC__ == 2 && __GNUC_MINOR__ < 7 85 # define SM_UNUSED(decl) decl 86 # else /* __GNUC__ == 2 && __GNUC_MINOR__ < 7 */ 87 # define SM_UNUSED(decl) decl __attribute__((__unused__)) 88 # endif /* __GNUC__ == 2 && __GNUC_MINOR__ < 7 */ 89 # else /* __GNUC__ >= 2 */ 90 # define SM_UNUSED(decl) decl 91 # endif /* __GNUC__ >= 2 */ 92 # endif /* SM_UNUSED */ 93 94 /* 95 ** The SM_NONVOLATILE macro is used to declare variables that are not 96 ** volatile, but which must be declared volatile when compiling with 97 ** gcc -O -Wall in order to suppress bogus warning messages. 98 ** 99 ** Variables that actually are volatile should be declared volatile 100 ** using the "volatile" keyword. If a variable actually is volatile, 101 ** then SM_NONVOLATILE should not be used. 102 ** 103 ** To compile sendmail with gcc and see all non-bogus warnings, 104 ** you should use 105 ** gcc -O -Wall -DSM_OMIT_BOGUS_WARNINGS ... 106 ** Do not use -DSM_OMIT_BOGUS_WARNINGS when compiling the production 107 ** version of sendmail, because there is a performance hit. 108 */ 109 110 # ifdef SM_OMIT_BOGUS_WARNINGS 111 # define SM_NONVOLATILE volatile 112 # else /* SM_OMIT_BOGUS_WARNINGS */ 113 # define SM_NONVOLATILE 114 # endif /* SM_OMIT_BOGUS_WARNINGS */ 115 116 /* 117 ** Turn on format string argument checking. 118 */ 119 120 # ifndef SM_CONF_FORMAT_TEST 121 # if __GNUC__ == 2 && __GNUC_MINOR__ >= 7 122 # define SM_CONF_FORMAT_TEST 1 123 # else /* __GNUC__ == 2 && __GNUC_MINOR__ >= 7 */ 124 # define SM_CONF_FORMAT_TEST 0 125 # endif /* __GNUC__ == 2 && __GNUC_MINOR__ >= 7 */ 126 # endif /* SM_CONF_FORMAT_TEST */ 127 128 # ifndef PRINTFLIKE 129 # if SM_CONF_FORMAT_TEST 130 # define PRINTFLIKE(x,y) __attribute__ ((__format__ (__printf__, x, y))) 131 # else /* SM_CONF_FORMAT_TEST */ 132 # define PRINTFLIKE(x,y) 133 # endif /* SM_CONF_FORMAT_TEST */ 134 # endif /* ! PRINTFLIKE */ 135 136 # ifndef SCANFLIKE 137 # if SM_CONF_FORMAT_TEST 138 # define SCANFLIKE(x,y) __attribute__ ((__format__ (__scanf__, x, y))) 139 # else /* SM_CONF_FORMAT_TEST */ 140 # define SCANFLIKE(x,y) 141 # endif /* SM_CONF_FORMAT_TEST */ 142 # endif /* ! SCANFLIKE */ 143 144 #endif /* ! SM_CDEFS_H */ 145