cdefs.h revision 261363
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 * $Id: cdefs.h,v 1.17 2013/11/22 20:51:31 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# define SM_DEAD_D volatile 71# else /* __GNUC__ == 2 && __GNUC_MINOR__ < 5 */ 72# define SM_DEAD(proto) proto __attribute__((__noreturn__)) 73# define SM_DEAD_D 74# endif /* __GNUC__ == 2 && __GNUC_MINOR__ < 5 */ 75# else /* __GNUC__ >= 2 */ 76# define SM_DEAD(proto) proto 77# define SM_DEAD_D 78# endif /* __GNUC__ >= 2 */ 79# endif /* SM_DEAD */ 80 81/* 82** Define SM_UNUSED, a macro used to declare variables that may be unused. 83*/ 84 85# ifndef SM_UNUSED 86# if __GNUC__ >= 2 87# if __GNUC__ == 2 && __GNUC_MINOR__ < 7 88# define SM_UNUSED(decl) decl 89# else /* __GNUC__ == 2 && __GNUC_MINOR__ < 7 */ 90# define SM_UNUSED(decl) decl __attribute__((__unused__)) 91# endif /* __GNUC__ == 2 && __GNUC_MINOR__ < 7 */ 92# else /* __GNUC__ >= 2 */ 93# define SM_UNUSED(decl) decl 94# endif /* __GNUC__ >= 2 */ 95# endif /* SM_UNUSED */ 96 97/* 98** The SM_NONVOLATILE macro is used to declare variables that are not 99** volatile, but which must be declared volatile when compiling with 100** gcc -O -Wall in order to suppress bogus warning messages. 101** 102** Variables that actually are volatile should be declared volatile 103** using the "volatile" keyword. If a variable actually is volatile, 104** then SM_NONVOLATILE should not be used. 105** 106** To compile sendmail with gcc and see all non-bogus warnings, 107** you should use 108** gcc -O -Wall -DSM_OMIT_BOGUS_WARNINGS ... 109** Do not use -DSM_OMIT_BOGUS_WARNINGS when compiling the production 110** version of sendmail, because there is a performance hit. 111*/ 112 113# ifdef SM_OMIT_BOGUS_WARNINGS 114# define SM_NONVOLATILE volatile 115# else /* SM_OMIT_BOGUS_WARNINGS */ 116# define SM_NONVOLATILE 117# endif /* SM_OMIT_BOGUS_WARNINGS */ 118 119/* 120** Turn on format string argument checking. 121*/ 122 123# ifndef SM_CONF_FORMAT_TEST 124# if __GNUC__ == 2 && __GNUC_MINOR__ >= 7 125# define SM_CONF_FORMAT_TEST 1 126# else /* __GNUC__ == 2 && __GNUC_MINOR__ >= 7 */ 127# define SM_CONF_FORMAT_TEST 0 128# endif /* __GNUC__ == 2 && __GNUC_MINOR__ >= 7 */ 129# endif /* SM_CONF_FORMAT_TEST */ 130 131# ifndef PRINTFLIKE 132# if SM_CONF_FORMAT_TEST 133# define PRINTFLIKE(x,y) __attribute__ ((__format__ (__printf__, x, y))) 134# else /* SM_CONF_FORMAT_TEST */ 135# define PRINTFLIKE(x,y) 136# endif /* SM_CONF_FORMAT_TEST */ 137# endif /* ! PRINTFLIKE */ 138 139# ifndef SCANFLIKE 140# if SM_CONF_FORMAT_TEST 141# define SCANFLIKE(x,y) __attribute__ ((__format__ (__scanf__, x, y))) 142# else /* SM_CONF_FORMAT_TEST */ 143# define SCANFLIKE(x,y) 144# endif /* SM_CONF_FORMAT_TEST */ 145# endif /* ! SCANFLIKE */ 146 147#endif /* ! SM_CDEFS_H */ 148