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