/ libxml2 / triodef.h
triodef.h
  1  /*************************************************************************
  2   *
  3   * $Id$
  4   *
  5   * Copyright (C) 2001 Bjorn Reese <breese@users.sourceforge.net>
  6   *
  7   * Permission to use, copy, modify, and distribute this software for any
  8   * purpose with or without fee is hereby granted, provided that the above
  9   * copyright notice and this permission notice appear in all copies.
 10   *
 11   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
 12   * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 13   * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND
 14   * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.
 15   *
 16   ************************************************************************/
 17  
 18  #ifndef TRIO_TRIODEF_H
 19  #define TRIO_TRIODEF_H
 20  
 21  /*************************************************************************
 22   * Platform and compiler support detection
 23   */
 24  #if defined(__GNUC__)
 25  # define TRIO_COMPILER_GCC
 26  #elif defined(__SUNPRO_C)
 27  # define TRIO_COMPILER_SUNPRO
 28  #elif defined(__SUNPRO_CC)
 29  # define TRIO_COMPILER_SUNPRO
 30  # define __SUNPRO_C __SUNPRO_CC
 31  #elif defined(__xlC__) || defined(__IBMC__) || defined(__IBMCPP__)
 32  # define TRIO_COMPILER_XLC
 33  #elif defined(_AIX) && !defined(__GNUC__)
 34  # define TRIO_COMPILER_XLC /* Workaround for old xlc */
 35  #elif defined(__DECC) || defined(__DECCXX)
 36  # define TRIO_COMPILER_DECC
 37  #elif defined(__osf__) && defined(__LANGUAGE_C__)
 38  # define TRIO_COMPILER_DECC /* Workaround for old DEC C compilers */
 39  #elif defined(_MSC_VER)
 40  # define TRIO_COMPILER_MSVC
 41  #elif defined(__BORLANDC__)
 42  # define TRIO_COMPILER_BCB
 43  #endif
 44  
 45  #if defined(VMS) || defined(__VMS)
 46  /*
 47   * VMS is placed first to avoid identifying the platform as Unix
 48   * based on the DECC compiler later on.
 49   */
 50  # define TRIO_PLATFORM_VMS
 51  #elif defined(__OS400__)
 52  # define TRIO_PLATFORM_OS400
 53  #elif defined(unix) || defined(__unix) || defined(__unix__)
 54  # define TRIO_PLATFORM_UNIX
 55  #elif defined(TRIO_COMPILER_XLC) || defined(_AIX)
 56  # define TRIO_PLATFORM_UNIX
 57  #elif defined(TRIO_COMPILER_DECC) || defined(__osf___)
 58  # define TRIO_PLATFORM_UNIX
 59  #elif defined(__NetBSD__)
 60  # define TRIO_PLATFORM_UNIX
 61  #elif defined(__Lynx__)
 62  # define TRIO_PLATFORM_UNIX
 63  #elif defined(__QNX__)
 64  # define TRIO_PLATFORM_UNIX
 65  # define TRIO_PLATFORM_QNX
 66  #elif defined(__CYGWIN__)
 67  # define TRIO_PLATFORM_UNIX
 68  #elif defined(AMIGA) && defined(TRIO_COMPILER_GCC)
 69  # define TRIO_PLATFORM_UNIX
 70  #elif defined(TRIO_COMPILER_MSVC) || defined(WIN32) || defined(_WIN32)
 71  # define TRIO_PLATFORM_WIN32
 72  #elif defined(mpeix) || defined(__mpexl)
 73  # define TRIO_PLATFORM_MPEIX
 74  #endif
 75  
 76  #if defined(_AIX)
 77  # define TRIO_PLATFORM_AIX
 78  #elif defined(__hpux)
 79  # define TRIO_PLATFORM_HPUX
 80  #elif defined(sun) || defined(__sun__)
 81  # if defined(__SVR4) || defined(__svr4__)
 82  #  define TRIO_PLATFORM_SOLARIS
 83  # else
 84  #  define TRIO_PLATFORM_SUNOS
 85  # endif
 86  #endif
 87  
 88  #if defined(__STDC__) || defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB)
 89  # define TRIO_COMPILER_SUPPORTS_C89
 90  # if defined(__STDC_VERSION__)
 91  #  define TRIO_COMPILER_SUPPORTS_C90
 92  #  if (__STDC_VERSION__ >= 199409L)
 93  #   define TRIO_COMPILER_SUPPORTS_C94
 94  #  endif
 95  #  if (__STDC_VERSION__ >= 199901L)
 96  #   define TRIO_COMPILER_SUPPORTS_C99
 97  #  endif
 98  # elif defined(TRIO_COMPILER_SUNPRO)
 99  #  if (__SUNPRO_C >= 0x420)
100  #   define TRIO_COMPILER_SUPPORTS_C94
101  #  endif
102  # endif
103  #elif defined(TRIO_COMPILER_XLC) && defined(__EXTENDED__)
104  # define TRIO_COMPILER_SUPPORTS_C89
105  # define TRIO_COMPILER_SUPPORTS_C90
106  # define TRIO_COMPILER_SUPPORTS_C94
107  #endif
108  
109  #if defined(_XOPEN_SOURCE)
110  # if defined(_XOPEN_SOURCE_EXTENDED)
111  #  define TRIO_COMPILER_SUPPORTS_UNIX95
112  # endif
113  # if (_XOPEN_VERSION >= 500)
114  #  define TRIO_COMPILER_SUPPORTS_UNIX98
115  # endif
116  # if (_XOPEN_VERSION >= 600)
117  #  define TRIO_COMPILER_SUPPORTS_UNIX01
118  # endif
119  #endif
120  
121  /*************************************************************************
122   * Generic defines
123   */
124  
125  #if !defined(TRIO_PUBLIC)
126  # define TRIO_PUBLIC
127  #endif
128  #if !defined(TRIO_PRIVATE)
129  # define TRIO_PRIVATE static
130  #endif
131  
132  #if !(defined(TRIO_COMPILER_SUPPORTS_C89) || defined(__cplusplus))
133  # define TRIO_COMPILER_ANCIENT
134  #endif
135  
136  #if defined(TRIO_COMPILER_ANCIENT)
137  # define TRIO_CONST
138  # define TRIO_VOLATILE
139  # define TRIO_SIGNED
140  typedef double trio_long_double_t;
141  typedef char * trio_pointer_t;
142  # define TRIO_SUFFIX_LONG(x) x
143  # define TRIO_PROTO(x) ()
144  # define TRIO_NOARGS
145  # define TRIO_ARGS1(list,a1) list a1;
146  # define TRIO_ARGS2(list,a1,a2) list a1; a2;
147  # define TRIO_ARGS3(list,a1,a2,a3) list a1; a2; a3;
148  # define TRIO_ARGS4(list,a1,a2,a3,a4) list a1; a2; a3; a4;
149  # define TRIO_ARGS5(list,a1,a2,a3,a4,a5) list a1; a2; a3; a4; a5;
150  # define TRIO_ARGS6(list,a1,a2,a3,a4,a5,a6) list a1; a2; a3; a4; a5; a6;
151  # define TRIO_VARGS2(list,a1,a2) list a1; a2
152  # define TRIO_VARGS3(list,a1,a2,a3) list a1; a2; a3
153  # define TRIO_VARGS4(list,a1,a2,a3,a4) list a1; a2; a3; a4
154  # define TRIO_VARGS5(list,a1,a2,a3,a4,a5) list a1; a2; a3; a4; a5
155  # define TRIO_VA_DECL va_dcl
156  # define TRIO_VA_START(x,y) va_start(x)
157  # define TRIO_VA_END(x) va_end(x)
158  #else /* ANSI C */
159  # define TRIO_CONST const
160  # define TRIO_VOLATILE volatile
161  # define TRIO_SIGNED signed
162  typedef long double trio_long_double_t;
163  typedef void * trio_pointer_t;
164  # define TRIO_SUFFIX_LONG(x) x ## L
165  # define TRIO_PROTO(x) x
166  # define TRIO_NOARGS void
167  # define TRIO_ARGS1(list,a1) (a1)
168  # define TRIO_ARGS2(list,a1,a2) (a1,a2)
169  # define TRIO_ARGS3(list,a1,a2,a3) (a1,a2,a3)
170  # define TRIO_ARGS4(list,a1,a2,a3,a4) (a1,a2,a3,a4)
171  # define TRIO_ARGS5(list,a1,a2,a3,a4,a5) (a1,a2,a3,a4,a5)
172  # define TRIO_ARGS6(list,a1,a2,a3,a4,a5,a6) (a1,a2,a3,a4,a5,a6)
173  # define TRIO_VARGS2 TRIO_ARGS2
174  # define TRIO_VARGS3 TRIO_ARGS3
175  # define TRIO_VARGS4 TRIO_ARGS4
176  # define TRIO_VARGS5 TRIO_ARGS5
177  # define TRIO_VA_DECL ...
178  # define TRIO_VA_START(x,y) va_start(x,y)
179  # define TRIO_VA_END(x) va_end(x)
180  #endif
181  
182  #if defined(TRIO_COMPILER_SUPPORTS_C99) || defined(__cplusplus)
183  # define TRIO_INLINE inline
184  #elif defined(TRIO_COMPILER_GCC)
185  # define TRIO_INLINE __inline__
186  #elif defined(TRIO_COMPILER_MSVC)
187  # define TRIO_INLINE _inline
188  #elif defined(TRIO_COMPILER_BCB)
189  # define TRIO_INLINE __inline
190  #else
191  # define TRIO_INLINE
192  #endif
193  
194  /*************************************************************************
195   * Workarounds
196   */
197  
198  #if defined(TRIO_PLATFORM_VMS)
199  /*
200   * Computations done with constants at compile time can trigger these
201   * even when compiling with IEEE enabled.
202   */
203  # pragma message disable (UNDERFLOW, FLOATOVERFL)
204  
205  # if (__CRTL_VER < 80000000)
206  /*
207   * Although the compiler supports C99 language constructs, the C
208   * run-time library does not contain all C99 functions.
209   *
210   * This was the case for 70300022. Update the 80000000 value when
211   * it has been accurately determined what version of the library
212   * supports C99.
213   */
214  #  if defined(TRIO_COMPILER_SUPPORTS_C99)
215  #   undef TRIO_COMPILER_SUPPORTS_C99
216  #  endif
217  # endif
218  #endif
219  
220  /*
221   * Not all preprocessors supports the LL token.
222   */
223  #if defined(TRIO_COMPILER_BCB)
224  #else
225  # define TRIO_COMPILER_SUPPORTS_LL
226  #endif
227  
228  #endif /* TRIO_TRIODEF_H */