c99_compat.h revision af69d88d
1af69d88dSmrg/**************************************************************************
2af69d88dSmrg *
3af69d88dSmrg * Copyright 2007-2013 VMware, Inc.
4af69d88dSmrg * All Rights Reserved.
5af69d88dSmrg *
6af69d88dSmrg * Permission is hereby granted, free of charge, to any person obtaining a
7af69d88dSmrg * copy of this software and associated documentation files (the
8af69d88dSmrg * "Software"), to deal in the Software without restriction, including
9af69d88dSmrg * without limitation the rights to use, copy, modify, merge, publish,
10af69d88dSmrg * distribute, sub license, and/or sell copies of the Software, and to
11af69d88dSmrg * permit persons to whom the Software is furnished to do so, subject to
12af69d88dSmrg * the following conditions:
13af69d88dSmrg *
14af69d88dSmrg * The above copyright notice and this permission notice (including the
15af69d88dSmrg * next paragraph) shall be included in all copies or substantial portions
16af69d88dSmrg * of the Software.
17af69d88dSmrg *
18af69d88dSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19af69d88dSmrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20af69d88dSmrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21af69d88dSmrg * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22af69d88dSmrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23af69d88dSmrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24af69d88dSmrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25af69d88dSmrg *
26af69d88dSmrg **************************************************************************/
27af69d88dSmrg
28af69d88dSmrg#ifndef _C99_COMPAT_H_
29af69d88dSmrg#define _C99_COMPAT_H_
30af69d88dSmrg
31af69d88dSmrg
32af69d88dSmrg/*
33af69d88dSmrg * MSVC hacks.
34af69d88dSmrg */
35af69d88dSmrg#if defined(_MSC_VER)
36af69d88dSmrg   /*
37af69d88dSmrg    * Visual Studio 2012 will complain if we define the `inline` keyword, but
38af69d88dSmrg    * actually it only supports the keyword on C++.
39af69d88dSmrg    *
40af69d88dSmrg    * To avoid this the _ALLOW_KEYWORD_MACROS must be set.
41af69d88dSmrg    */
42af69d88dSmrg#  if (_MSC_VER >= 1700) && !defined(_ALLOW_KEYWORD_MACROS)
43af69d88dSmrg#    define _ALLOW_KEYWORD_MACROS
44af69d88dSmrg#  endif
45af69d88dSmrg
46af69d88dSmrg   /*
47af69d88dSmrg    * XXX: MSVC has a `__restrict` keyword, but it also has a
48af69d88dSmrg    * `__declspec(restrict)` modifier, so it is impossible to define a
49af69d88dSmrg    * `restrict` macro without interfering with the latter.  Furthermore the
50af69d88dSmrg    * MSVC standard library uses __declspec(restrict) under the _CRTRESTRICT
51af69d88dSmrg    * macro.  For now resolve this issue by redefining _CRTRESTRICT, but going
52af69d88dSmrg    * forward we should probably should stop using restrict, especially
53af69d88dSmrg    * considering that our code does not obbey strict aliasing rules any way.
54af69d88dSmrg    */
55af69d88dSmrg#  include <crtdefs.h>
56af69d88dSmrg#  undef _CRTRESTRICT
57af69d88dSmrg#  define _CRTRESTRICT
58af69d88dSmrg#endif
59af69d88dSmrg
60af69d88dSmrg
61af69d88dSmrg/*
62af69d88dSmrg * C99 inline keyword
63af69d88dSmrg */
64af69d88dSmrg#ifndef inline
65af69d88dSmrg#  ifdef __cplusplus
66af69d88dSmrg     /* C++ supports inline keyword */
67af69d88dSmrg#  elif defined(__GNUC__)
68af69d88dSmrg#    define inline __inline__
69af69d88dSmrg#  elif defined(_MSC_VER)
70af69d88dSmrg#    define inline __inline
71af69d88dSmrg#  elif defined(__ICL)
72af69d88dSmrg#    define inline __inline
73af69d88dSmrg#  elif defined(__INTEL_COMPILER)
74af69d88dSmrg     /* Intel compiler supports inline keyword */
75af69d88dSmrg#  elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100)
76af69d88dSmrg#    define inline __inline
77af69d88dSmrg#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
78af69d88dSmrg     /* C99 supports inline keyword */
79af69d88dSmrg#  elif (__STDC_VERSION__ >= 199901L)
80af69d88dSmrg     /* C99 supports inline keyword */
81af69d88dSmrg#  else
82af69d88dSmrg#    define inline
83af69d88dSmrg#  endif
84af69d88dSmrg#endif
85af69d88dSmrg
86af69d88dSmrg
87af69d88dSmrg/*
88af69d88dSmrg * C99 restrict keyword
89af69d88dSmrg *
90af69d88dSmrg * See also:
91af69d88dSmrg * - http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html
92af69d88dSmrg */
93af69d88dSmrg#ifndef restrict
94af69d88dSmrg#  if (__STDC_VERSION__ >= 199901L)
95af69d88dSmrg     /* C99 */
96af69d88dSmrg#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
97af69d88dSmrg     /* C99 */
98af69d88dSmrg#  elif defined(__GNUC__)
99af69d88dSmrg#    define restrict __restrict__
100af69d88dSmrg#  elif defined(_MSC_VER)
101af69d88dSmrg#    define restrict __restrict
102af69d88dSmrg#  else
103af69d88dSmrg#    define restrict /* */
104af69d88dSmrg#  endif
105af69d88dSmrg#endif
106af69d88dSmrg
107af69d88dSmrg
108af69d88dSmrg/*
109af69d88dSmrg * C99 __func__ macro
110af69d88dSmrg */
111af69d88dSmrg#ifndef __func__
112af69d88dSmrg#  if (__STDC_VERSION__ >= 199901L)
113af69d88dSmrg     /* C99 */
114af69d88dSmrg#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
115af69d88dSmrg     /* C99 */
116af69d88dSmrg#  elif defined(__GNUC__)
117af69d88dSmrg#    if __GNUC__ >= 2
118af69d88dSmrg#      define __func__ __FUNCTION__
119af69d88dSmrg#    else
120af69d88dSmrg#      define __func__ "<unknown>"
121af69d88dSmrg#    endif
122af69d88dSmrg#  elif defined(_MSC_VER)
123af69d88dSmrg#    if _MSC_VER >= 1300
124af69d88dSmrg#      define __func__ __FUNCTION__
125af69d88dSmrg#    else
126af69d88dSmrg#      define __func__ "<unknown>"
127af69d88dSmrg#    endif
128af69d88dSmrg#  else
129af69d88dSmrg#    define __func__ "<unknown>"
130af69d88dSmrg#  endif
131af69d88dSmrg#endif
132af69d88dSmrg
133af69d88dSmrg
134af69d88dSmrg/* Simple test case for debugging */
135af69d88dSmrg#if 0
136af69d88dSmrgstatic inline const char *
137af69d88dSmrgtest_c99_compat_h(const void * restrict a,
138af69d88dSmrg                  const void * restrict b)
139af69d88dSmrg{
140af69d88dSmrg   return __func__;
141af69d88dSmrg}
142af69d88dSmrg#endif
143af69d88dSmrg
144af69d88dSmrg
145af69d88dSmrg#endif /* _C99_COMPAT_H_ */
146