Use a static waffle.def
[mesa-waffle.git] / include / c99_compat.h
blobf731ede6a5efbb4ab6de3aafd9a82b0914aaf1bc
1 // Copyright 2012 Intel Corporation
2 //
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are met:
7 //
8 // - Redistributions of source code must retain the above copyright notice, this
9 // list of conditions and the following disclaimer.
11 // - Redistributions in binary form must reproduce the above copyright notice,
12 // this list of conditions and the following disclaimer in the documentation
13 // and/or other materials provided with the distribution.
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 #pragma once
29 * C99 restrict keyword
31 #ifndef restrict
32 # if defined(__GNUC__)
33 # define restrict __restrict__
34 # elif defined(_MSC_VER)
35 /* leave empty to prevent compiler wows - decl vs. def diff */
36 # define restrict
37 # else
38 # define restrict
39 # endif
40 #endif
43 * C99 inline keyword
45 #ifndef inline
46 # if defined(__GNUC__)
47 # define inline __inline__
48 # elif defined(_MSC_VER)
49 # define inline __inline
50 # elif defined(__ICL)
51 # define inline __inline
52 # else
53 # define inline
54 # endif
55 #endif
58 * C99 string manipulation functions - snprintf, strcasecmp
60 * https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010
62 #if defined(_MSC_VER)
63 #include <stdarg.h> // for va_start, va_end
64 #include <stdio.h> // for _vscprintf, _vscprintf_s
65 #include <string.h>
67 #define strcasecmp _stricmp
68 #define snprintf c99_snprintf
69 #define vsnprintf c99_vsnprintf
71 static inline int
72 c99_vsnprintf(char* str, size_t size, const char* format, va_list ap)
74 int count = -1;
76 if (size != 0)
77 count = _vsnprintf_s(str, size, _TRUNCATE, format, ap);
78 if (count == -1)
79 count = _vscprintf(format, ap);
81 return count;
84 static inline int
85 c99_snprintf(char* str, size_t size, const char* format, ...)
87 int count;
88 va_list ap;
90 va_start(ap, format);
91 count = c99_vsnprintf(str, size, format, ap);
92 va_end(ap);
94 return count;
97 #else
98 #include <strings.h>
100 #endif
103 * strerror_r - strictly speaking not C99 function, but it's been around of
104 * ages in one shape or another.
106 * Under *NIX there are three flavours - XSI-compliant (POSIX.1-2001)
107 * or not, vs GNU-specific one. The POSIX one is available only under *NIX
108 * and is guaranteed to be thread-safe (as used in waffle).
109 * Under Windows the function is not thread-safe and thus it's depreciated.
111 #if defined(_WIN32)
112 #define strerror_r(errno,buf,len) strerror_s(buf,len,errno)
113 #endif