| @@ -1,346 +1,348 @@ | | | @@ -1,346 +1,348 @@ |
1 | /* $NetBSD: libkern.h,v 1.104 2011/11/28 08:05:06 tls Exp $ */ | | 1 | /* $NetBSD: libkern.h,v 1.105 2012/01/22 02:57:36 rmind Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 1992, 1993 | | 4 | * Copyright (c) 1992, 1993 |
5 | * The Regents of the University of California. All rights reserved. | | 5 | * The Regents of the University of California. All rights reserved. |
6 | * | | 6 | * |
7 | * Redistribution and use in source and binary forms, with or without | | 7 | * Redistribution and use in source and binary forms, with or without |
8 | * modification, are permitted provided that the following conditions | | 8 | * modification, are permitted provided that the following conditions |
9 | * are met: | | 9 | * are met: |
10 | * 1. Redistributions of source code must retain the above copyright | | 10 | * 1. Redistributions of source code must retain the above copyright |
11 | * notice, this list of conditions and the following disclaimer. | | 11 | * notice, this list of conditions and the following disclaimer. |
12 | * 2. Redistributions in binary form must reproduce the above copyright | | 12 | * 2. Redistributions in binary form must reproduce the above copyright |
13 | * notice, this list of conditions and the following disclaimer in the | | 13 | * notice, this list of conditions and the following disclaimer in the |
14 | * documentation and/or other materials provided with the distribution. | | 14 | * documentation and/or other materials provided with the distribution. |
15 | * 3. Neither the name of the University nor the names of its contributors | | 15 | * 3. Neither the name of the University nor the names of its contributors |
16 | * may be used to endorse or promote products derived from this software | | 16 | * may be used to endorse or promote products derived from this software |
17 | * without specific prior written permission. | | 17 | * without specific prior written permission. |
18 | * | | 18 | * |
19 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | | 19 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
20 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | 20 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
21 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | 21 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
22 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | | 22 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | 23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | | 24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
25 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | | 25 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
26 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | 26 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | | 28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
29 | * SUCH DAMAGE. | | 29 | * SUCH DAMAGE. |
30 | * | | 30 | * |
31 | * @(#)libkern.h 8.2 (Berkeley) 8/5/94 | | 31 | * @(#)libkern.h 8.2 (Berkeley) 8/5/94 |
32 | */ | | 32 | */ |
33 | | | 33 | |
34 | #ifndef _LIB_LIBKERN_LIBKERN_H_ | | 34 | #ifndef _LIB_LIBKERN_LIBKERN_H_ |
35 | #define _LIB_LIBKERN_LIBKERN_H_ | | 35 | #define _LIB_LIBKERN_LIBKERN_H_ |
36 | | | 36 | |
37 | #include <sys/types.h> | | 37 | #include <sys/types.h> |
38 | #include <sys/inttypes.h> | | 38 | #include <sys/inttypes.h> |
39 | #include <sys/null.h> | | 39 | #include <sys/null.h> |
40 | | | 40 | |
41 | #ifndef LIBKERN_INLINE | | 41 | #ifndef LIBKERN_INLINE |
42 | #define LIBKERN_INLINE static __inline | | 42 | #define LIBKERN_INLINE static __inline |
43 | #define LIBKERN_BODY | | 43 | #define LIBKERN_BODY |
44 | #endif | | 44 | #endif |
45 | | | 45 | |
46 | LIBKERN_INLINE int imax(int, int) __unused; | | 46 | LIBKERN_INLINE int imax(int, int) __unused; |
47 | LIBKERN_INLINE int imin(int, int) __unused; | | 47 | LIBKERN_INLINE int imin(int, int) __unused; |
48 | LIBKERN_INLINE u_int max(u_int, u_int) __unused; | | 48 | LIBKERN_INLINE u_int max(u_int, u_int) __unused; |
49 | LIBKERN_INLINE u_int min(u_int, u_int) __unused; | | 49 | LIBKERN_INLINE u_int min(u_int, u_int) __unused; |
50 | LIBKERN_INLINE long lmax(long, long) __unused; | | 50 | LIBKERN_INLINE long lmax(long, long) __unused; |
51 | LIBKERN_INLINE long lmin(long, long) __unused; | | 51 | LIBKERN_INLINE long lmin(long, long) __unused; |
52 | LIBKERN_INLINE u_long ulmax(u_long, u_long) __unused; | | 52 | LIBKERN_INLINE u_long ulmax(u_long, u_long) __unused; |
53 | LIBKERN_INLINE u_long ulmin(u_long, u_long) __unused; | | 53 | LIBKERN_INLINE u_long ulmin(u_long, u_long) __unused; |
54 | LIBKERN_INLINE int abs(int) __unused; | | 54 | LIBKERN_INLINE int abs(int) __unused; |
55 | | | 55 | |
56 | LIBKERN_INLINE int isspace(int) __unused; | | 56 | LIBKERN_INLINE int isspace(int) __unused; |
57 | LIBKERN_INLINE int isascii(int) __unused; | | 57 | LIBKERN_INLINE int isascii(int) __unused; |
58 | LIBKERN_INLINE int isupper(int) __unused; | | 58 | LIBKERN_INLINE int isupper(int) __unused; |
59 | LIBKERN_INLINE int islower(int) __unused; | | 59 | LIBKERN_INLINE int islower(int) __unused; |
60 | LIBKERN_INLINE int isalpha(int) __unused; | | 60 | LIBKERN_INLINE int isalpha(int) __unused; |
61 | LIBKERN_INLINE int isdigit(int) __unused; | | 61 | LIBKERN_INLINE int isdigit(int) __unused; |
62 | LIBKERN_INLINE int isxdigit(int) __unused; | | 62 | LIBKERN_INLINE int isxdigit(int) __unused; |
63 | LIBKERN_INLINE int toupper(int) __unused; | | 63 | LIBKERN_INLINE int toupper(int) __unused; |
64 | LIBKERN_INLINE int tolower(int) __unused; | | 64 | LIBKERN_INLINE int tolower(int) __unused; |
65 | | | 65 | |
66 | #ifdef LIBKERN_BODY | | 66 | #ifdef LIBKERN_BODY |
67 | LIBKERN_INLINE int | | 67 | LIBKERN_INLINE int |
68 | imax(int a, int b) | | 68 | imax(int a, int b) |
69 | { | | 69 | { |
70 | return (a > b ? a : b); | | 70 | return (a > b ? a : b); |
71 | } | | 71 | } |
72 | LIBKERN_INLINE int | | 72 | LIBKERN_INLINE int |
73 | imin(int a, int b) | | 73 | imin(int a, int b) |
74 | { | | 74 | { |
75 | return (a < b ? a : b); | | 75 | return (a < b ? a : b); |
76 | } | | 76 | } |
77 | LIBKERN_INLINE long | | 77 | LIBKERN_INLINE long |
78 | lmax(long a, long b) | | 78 | lmax(long a, long b) |
79 | { | | 79 | { |
80 | return (a > b ? a : b); | | 80 | return (a > b ? a : b); |
81 | } | | 81 | } |
82 | LIBKERN_INLINE long | | 82 | LIBKERN_INLINE long |
83 | lmin(long a, long b) | | 83 | lmin(long a, long b) |
84 | { | | 84 | { |
85 | return (a < b ? a : b); | | 85 | return (a < b ? a : b); |
86 | } | | 86 | } |
87 | LIBKERN_INLINE u_int | | 87 | LIBKERN_INLINE u_int |
88 | max(u_int a, u_int b) | | 88 | max(u_int a, u_int b) |
89 | { | | 89 | { |
90 | return (a > b ? a : b); | | 90 | return (a > b ? a : b); |
91 | } | | 91 | } |
92 | LIBKERN_INLINE u_int | | 92 | LIBKERN_INLINE u_int |
93 | min(u_int a, u_int b) | | 93 | min(u_int a, u_int b) |
94 | { | | 94 | { |
95 | return (a < b ? a : b); | | 95 | return (a < b ? a : b); |
96 | } | | 96 | } |
97 | LIBKERN_INLINE u_long | | 97 | LIBKERN_INLINE u_long |
98 | ulmax(u_long a, u_long b) | | 98 | ulmax(u_long a, u_long b) |
99 | { | | 99 | { |
100 | return (a > b ? a : b); | | 100 | return (a > b ? a : b); |
101 | } | | 101 | } |
102 | LIBKERN_INLINE u_long | | 102 | LIBKERN_INLINE u_long |
103 | ulmin(u_long a, u_long b) | | 103 | ulmin(u_long a, u_long b) |
104 | { | | 104 | { |
105 | return (a < b ? a : b); | | 105 | return (a < b ? a : b); |
106 | } | | 106 | } |
107 | | | 107 | |
108 | LIBKERN_INLINE int | | 108 | LIBKERN_INLINE int |
109 | abs(int j) | | 109 | abs(int j) |
110 | { | | 110 | { |
111 | return(j < 0 ? -j : j); | | 111 | return(j < 0 ? -j : j); |
112 | } | | 112 | } |
113 | | | 113 | |
114 | LIBKERN_INLINE int | | 114 | LIBKERN_INLINE int |
115 | isspace(int ch) | | 115 | isspace(int ch) |
116 | { | | 116 | { |
117 | return (ch == ' ' || (ch >= '\t' && ch <= '\r')); | | 117 | return (ch == ' ' || (ch >= '\t' && ch <= '\r')); |
118 | } | | 118 | } |
119 | | | 119 | |
120 | LIBKERN_INLINE int | | 120 | LIBKERN_INLINE int |
121 | isascii(int ch) | | 121 | isascii(int ch) |
122 | { | | 122 | { |
123 | return ((ch & ~0x7f) == 0); | | 123 | return ((ch & ~0x7f) == 0); |
124 | } | | 124 | } |
125 | | | 125 | |
126 | LIBKERN_INLINE int | | 126 | LIBKERN_INLINE int |
127 | isupper(int ch) | | 127 | isupper(int ch) |
128 | { | | 128 | { |
129 | return (ch >= 'A' && ch <= 'Z'); | | 129 | return (ch >= 'A' && ch <= 'Z'); |
130 | } | | 130 | } |
131 | | | 131 | |
132 | LIBKERN_INLINE int | | 132 | LIBKERN_INLINE int |
133 | islower(int ch) | | 133 | islower(int ch) |
134 | { | | 134 | { |
135 | return (ch >= 'a' && ch <= 'z'); | | 135 | return (ch >= 'a' && ch <= 'z'); |
136 | } | | 136 | } |
137 | | | 137 | |
138 | LIBKERN_INLINE int | | 138 | LIBKERN_INLINE int |
139 | isalpha(int ch) | | 139 | isalpha(int ch) |
140 | { | | 140 | { |
141 | return (isupper(ch) || islower(ch)); | | 141 | return (isupper(ch) || islower(ch)); |
142 | } | | 142 | } |
143 | | | 143 | |
144 | LIBKERN_INLINE int | | 144 | LIBKERN_INLINE int |
145 | isdigit(int ch) | | 145 | isdigit(int ch) |
146 | { | | 146 | { |
147 | return (ch >= '0' && ch <= '9'); | | 147 | return (ch >= '0' && ch <= '9'); |
148 | } | | 148 | } |
149 | | | 149 | |
150 | LIBKERN_INLINE int | | 150 | LIBKERN_INLINE int |
151 | isxdigit(int ch) | | 151 | isxdigit(int ch) |
152 | { | | 152 | { |
153 | return (isdigit(ch) || | | 153 | return (isdigit(ch) || |
154 | (ch >= 'A' && ch <= 'F') || | | 154 | (ch >= 'A' && ch <= 'F') || |
155 | (ch >= 'a' && ch <= 'f')); | | 155 | (ch >= 'a' && ch <= 'f')); |
156 | } | | 156 | } |
157 | | | 157 | |
158 | LIBKERN_INLINE int | | 158 | LIBKERN_INLINE int |
159 | toupper(int ch) | | 159 | toupper(int ch) |
160 | { | | 160 | { |
161 | if (islower(ch)) | | 161 | if (islower(ch)) |
162 | return (ch - 0x20); | | 162 | return (ch - 0x20); |
163 | return (ch); | | 163 | return (ch); |
164 | } | | 164 | } |
165 | | | 165 | |
166 | LIBKERN_INLINE int | | 166 | LIBKERN_INLINE int |
167 | tolower(int ch) | | 167 | tolower(int ch) |
168 | { | | 168 | { |
169 | if (isupper(ch)) | | 169 | if (isupper(ch)) |
170 | return (ch + 0x20); | | 170 | return (ch + 0x20); |
171 | return (ch); | | 171 | return (ch); |
172 | } | | 172 | } |
173 | #endif | | 173 | #endif |
174 | | | 174 | |
175 | #define __NULL_STMT do { } while (/* CONSTCOND */ 0) | | 175 | #define __NULL_STMT do { } while (/* CONSTCOND */ 0) |
176 | | | 176 | |
177 | #define __KASSERTSTR "kernel %sassertion \"%s\" failed: file \"%s\", line %d " | | 177 | #define __KASSERTSTR "kernel %sassertion \"%s\" failed: file \"%s\", line %d " |
178 | | | 178 | |
179 | #ifdef NDEBUG /* tradition! */ | | 179 | #ifdef NDEBUG /* tradition! */ |
180 | #define assert(e) ((void)0) | | 180 | #define assert(e) ((void)0) |
181 | #else | | 181 | #else |
182 | #define assert(e) (__predict_true((e)) ? (void)0 : \ | | 182 | #define assert(e) (__predict_true((e)) ? (void)0 : \ |
183 | kern_assert(__KASSERTSTR, "", #e, __FILE__, __LINE__)) | | 183 | kern_assert(__KASSERTSTR, "", #e, __FILE__, __LINE__)) |
184 | #endif | | 184 | #endif |
185 | | | 185 | |
186 | #ifdef __COVERITY__ | | 186 | #ifdef __COVERITY__ |
187 | #ifndef DIAGNOSTIC | | 187 | #ifndef DIAGNOSTIC |
188 | #define DIAGNOSTIC | | 188 | #define DIAGNOSTIC |
189 | #endif | | 189 | #endif |
190 | #endif | | 190 | #endif |
191 | | | 191 | |
192 | #define CTASSERT(x) __CTASSERT(x) | | 192 | #define CTASSERT(x) __CTASSERT(x) |
| | | 193 | #define CTASSERT_SIGNED(x) __CTASSERT(((typeof(x))-1) < 0) |
| | | 194 | #define CTASSERT_UNSIGNED(x) __CTASSERT(((typeof(x))-1) >= 0) |
193 | | | 195 | |
194 | #ifndef DIAGNOSTIC | | 196 | #ifndef DIAGNOSTIC |
195 | #define _DIAGASSERT(a) (void)0 | | 197 | #define _DIAGASSERT(a) (void)0 |
196 | #ifdef lint | | 198 | #ifdef lint |
197 | #define KASSERTMSG(e, msg, ...) /* NOTHING */ | | 199 | #define KASSERTMSG(e, msg, ...) /* NOTHING */ |
198 | #define KASSERT(e) /* NOTHING */ | | 200 | #define KASSERT(e) /* NOTHING */ |
199 | #else /* !lint */ | | 201 | #else /* !lint */ |
200 | #define KASSERTMSG(e, msg, ...) ((void)0) | | 202 | #define KASSERTMSG(e, msg, ...) ((void)0) |
201 | #define KASSERT(e) ((void)0) | | 203 | #define KASSERT(e) ((void)0) |
202 | #endif /* !lint */ | | 204 | #endif /* !lint */ |
203 | #else /* DIAGNOSTIC */ | | 205 | #else /* DIAGNOSTIC */ |
204 | #define _DIAGASSERT(a) assert(a) | | 206 | #define _DIAGASSERT(a) assert(a) |
205 | #define KASSERTMSG(e, msg, ...) \ | | 207 | #define KASSERTMSG(e, msg, ...) \ |
206 | (__predict_true((e)) ? (void)0 : \ | | 208 | (__predict_true((e)) ? (void)0 : \ |
207 | kern_assert(__KASSERTSTR msg, "diagnostic ", #e, \ | | 209 | kern_assert(__KASSERTSTR msg, "diagnostic ", #e, \ |
208 | __FILE__, __LINE__, ## __VA_ARGS__)) | | 210 | __FILE__, __LINE__, ## __VA_ARGS__)) |
209 | | | 211 | |
210 | #define KASSERT(e) (__predict_true((e)) ? (void)0 : \ | | 212 | #define KASSERT(e) (__predict_true((e)) ? (void)0 : \ |
211 | kern_assert(__KASSERTSTR, "diagnostic ", #e, \ | | 213 | kern_assert(__KASSERTSTR, "diagnostic ", #e, \ |
212 | __FILE__, __LINE__)) | | 214 | __FILE__, __LINE__)) |
213 | #endif | | 215 | #endif |
214 | | | 216 | |
215 | #ifndef DEBUG | | 217 | #ifndef DEBUG |
216 | #ifdef lint | | 218 | #ifdef lint |
217 | #define KDASSERTMSG(e,msg, ...) /* NOTHING */ | | 219 | #define KDASSERTMSG(e,msg, ...) /* NOTHING */ |
218 | #define KDASSERT(e) /* NOTHING */ | | 220 | #define KDASSERT(e) /* NOTHING */ |
219 | #else /* lint */ | | 221 | #else /* lint */ |
220 | #define KDASSERTMSG(e,msg, ...) ((void)0) | | 222 | #define KDASSERTMSG(e,msg, ...) ((void)0) |
221 | #define KDASSERT(e) ((void)0) | | 223 | #define KDASSERT(e) ((void)0) |
222 | #endif /* lint */ | | 224 | #endif /* lint */ |
223 | #else | | 225 | #else |
224 | #define KDASSERTMSG(e, msg, ...) \ | | 226 | #define KDASSERTMSG(e, msg, ...) \ |
225 | (__predict_true((e)) ? (void)0 : \ | | 227 | (__predict_true((e)) ? (void)0 : \ |
226 | kern_assert(__KASSERTSTR msg, "debugging ", #e, \ | | 228 | kern_assert(__KASSERTSTR msg, "debugging ", #e, \ |
227 | __FILE__, __LINE__, ## __VA_ARGS__)) | | 229 | __FILE__, __LINE__, ## __VA_ARGS__)) |
228 | | | 230 | |
229 | #define KDASSERT(e) (__predict_true((e)) ? (void)0 : \ | | 231 | #define KDASSERT(e) (__predict_true((e)) ? (void)0 : \ |
230 | kern_assert(__KASSERTSTR, "debugging ", #e, \ | | 232 | kern_assert(__KASSERTSTR, "debugging ", #e, \ |
231 | __FILE__, __LINE__)) | | 233 | __FILE__, __LINE__)) |
232 | #endif | | 234 | #endif |
233 | | | 235 | |
234 | /* | | 236 | /* |
235 | * XXX: For compatibility we use SMALL_RANDOM by default. | | 237 | * XXX: For compatibility we use SMALL_RANDOM by default. |
236 | */ | | 238 | */ |
237 | #define SMALL_RANDOM | | 239 | #define SMALL_RANDOM |
238 | | | 240 | |
239 | #ifndef offsetof | | 241 | #ifndef offsetof |
240 | #if __GNUC_PREREQ__(4, 0) | | 242 | #if __GNUC_PREREQ__(4, 0) |
241 | #define offsetof(type, member) __builtin_offsetof(type, member) | | 243 | #define offsetof(type, member) __builtin_offsetof(type, member) |
242 | #else | | 244 | #else |
243 | #define offsetof(type, member) \ | | 245 | #define offsetof(type, member) \ |
244 | ((size_t)(unsigned long)(&(((type *)0)->member))) | | 246 | ((size_t)(unsigned long)(&(((type *)0)->member))) |
245 | #endif | | 247 | #endif |
246 | #endif | | 248 | #endif |
247 | | | 249 | |
248 | #define MTPRNG_RLEN 624 | | 250 | #define MTPRNG_RLEN 624 |
249 | struct mtprng_state { | | 251 | struct mtprng_state { |
250 | unsigned int mt_idx; | | 252 | unsigned int mt_idx; |
251 | uint32_t mt_elem[MTPRNG_RLEN]; | | 253 | uint32_t mt_elem[MTPRNG_RLEN]; |
252 | uint32_t mt_count; | | 254 | uint32_t mt_count; |
253 | uint32_t mt_sparse[3]; | | 255 | uint32_t mt_sparse[3]; |
254 | }; | | 256 | }; |
255 | | | 257 | |
256 | /* Prototypes for which GCC built-ins exist. */ | | 258 | /* Prototypes for which GCC built-ins exist. */ |
257 | void *memcpy(void *, const void *, size_t); | | 259 | void *memcpy(void *, const void *, size_t); |
258 | int memcmp(const void *, const void *, size_t); | | 260 | int memcmp(const void *, const void *, size_t); |
259 | void *memset(void *, int, size_t); | | 261 | void *memset(void *, int, size_t); |
260 | #if __GNUC_PREREQ__(2, 95) && !defined(_STANDALONE) | | 262 | #if __GNUC_PREREQ__(2, 95) && !defined(_STANDALONE) |
261 | #define memcpy(d, s, l) __builtin_memcpy(d, s, l) | | 263 | #define memcpy(d, s, l) __builtin_memcpy(d, s, l) |
262 | #define memcmp(a, b, l) __builtin_memcmp(a, b, l) | | 264 | #define memcmp(a, b, l) __builtin_memcmp(a, b, l) |
263 | #endif | | 265 | #endif |
264 | #if __GNUC_PREREQ__(2, 95) && !defined(_STANDALONE) | | 266 | #if __GNUC_PREREQ__(2, 95) && !defined(_STANDALONE) |
265 | #define memset(d, v, l) __builtin_memset(d, v, l) | | 267 | #define memset(d, v, l) __builtin_memset(d, v, l) |
266 | #endif | | 268 | #endif |
267 | | | 269 | |
268 | char *strcpy(char *, const char *); | | 270 | char *strcpy(char *, const char *); |
269 | int strcmp(const char *, const char *); | | 271 | int strcmp(const char *, const char *); |
270 | size_t strlen(const char *); | | 272 | size_t strlen(const char *); |
271 | size_t strnlen(const char *, size_t); | | 273 | size_t strnlen(const char *, size_t); |
272 | char *strsep(char **, const char *); | | 274 | char *strsep(char **, const char *); |
273 | #if __GNUC_PREREQ__(2, 95) && !defined(_STANDALONE) | | 275 | #if __GNUC_PREREQ__(2, 95) && !defined(_STANDALONE) |
274 | #define strcpy(d, s) __builtin_strcpy(d, s) | | 276 | #define strcpy(d, s) __builtin_strcpy(d, s) |
275 | #define strcmp(a, b) __builtin_strcmp(a, b) | | 277 | #define strcmp(a, b) __builtin_strcmp(a, b) |
276 | #define strlen(a) __builtin_strlen(a) | | 278 | #define strlen(a) __builtin_strlen(a) |
277 | #endif | | 279 | #endif |
278 | | | 280 | |
279 | /* Functions for which we always use built-ins. */ | | 281 | /* Functions for which we always use built-ins. */ |
280 | #ifdef __GNUC__ | | 282 | #ifdef __GNUC__ |
281 | #define alloca(s) __builtin_alloca(s) | | 283 | #define alloca(s) __builtin_alloca(s) |
282 | #endif | | 284 | #endif |
283 | | | 285 | |
284 | /* These exist in GCC 3.x, but we don't bother. */ | | 286 | /* These exist in GCC 3.x, but we don't bother. */ |
285 | char *strcat(char *, const char *); | | 287 | char *strcat(char *, const char *); |
286 | char *strncpy(char *, const char *, size_t); | | 288 | char *strncpy(char *, const char *, size_t); |
287 | int strncmp(const char *, const char *, size_t); | | 289 | int strncmp(const char *, const char *, size_t); |
288 | char *strchr(const char *, int); | | 290 | char *strchr(const char *, int); |
289 | char *strrchr(const char *, int); | | 291 | char *strrchr(const char *, int); |
290 | | | 292 | |
291 | char *strstr(const char *, const char *); | | 293 | char *strstr(const char *, const char *); |
292 | | | 294 | |
293 | /* | | 295 | /* |
294 | * ffs is an instruction on vax. | | 296 | * ffs is an instruction on vax. |
295 | */ | | 297 | */ |
296 | int ffs(int); | | 298 | int ffs(int); |
297 | #if __GNUC_PREREQ__(2, 95) && (!defined(__vax__) || __GNUC_PREREQ__(4,1)) | | 299 | #if __GNUC_PREREQ__(2, 95) && (!defined(__vax__) || __GNUC_PREREQ__(4,1)) |
298 | #define ffs(x) __builtin_ffs(x) | | 300 | #define ffs(x) __builtin_ffs(x) |
299 | #endif | | 301 | #endif |
300 | | | 302 | |
301 | void kern_assert(const char *, ...) | | 303 | void kern_assert(const char *, ...) |
302 | __attribute__((__format__(__printf__, 1, 2))); | | 304 | __attribute__((__format__(__printf__, 1, 2))); |
303 | unsigned int | | 305 | unsigned int |
304 | bcdtobin(unsigned int); | | 306 | bcdtobin(unsigned int); |
305 | unsigned int | | 307 | unsigned int |
306 | bintobcd(unsigned int); | | 308 | bintobcd(unsigned int); |
307 | u_int32_t | | 309 | u_int32_t |
308 | inet_addr(const char *); | | 310 | inet_addr(const char *); |
309 | struct in_addr; | | 311 | struct in_addr; |
310 | int inet_aton(const char *, struct in_addr *); | | 312 | int inet_aton(const char *, struct in_addr *); |
311 | char *intoa(u_int32_t); | | 313 | char *intoa(u_int32_t); |
312 | #define inet_ntoa(a) intoa((a).s_addr) | | 314 | #define inet_ntoa(a) intoa((a).s_addr) |
313 | void *memchr(const void *, int, size_t); | | 315 | void *memchr(const void *, int, size_t); |
314 | void *memmove(void *, const void *, size_t); | | 316 | void *memmove(void *, const void *, size_t); |
315 | int pmatch(const char *, const char *, const char **); | | 317 | int pmatch(const char *, const char *, const char **); |
316 | #ifndef SMALL_RANDOM | | 318 | #ifndef SMALL_RANDOM |
317 | void srandom(unsigned long); | | 319 | void srandom(unsigned long); |
318 | char *initstate(unsigned long, char *, size_t); | | 320 | char *initstate(unsigned long, char *, size_t); |
319 | char *setstate(char *); | | 321 | char *setstate(char *); |
320 | #endif /* SMALL_RANDOM */ | | 322 | #endif /* SMALL_RANDOM */ |
321 | long random(void); | | 323 | long random(void); |
322 | void mtprng_init32(struct mtprng_state *, uint32_t); | | 324 | void mtprng_init32(struct mtprng_state *, uint32_t); |
323 | void mtprng_initarray(struct mtprng_state *, const uint32_t *, size_t); | | 325 | void mtprng_initarray(struct mtprng_state *, const uint32_t *, size_t); |
324 | uint32_t mtprng_rawrandom(struct mtprng_state *); | | 326 | uint32_t mtprng_rawrandom(struct mtprng_state *); |
325 | uint32_t mtprng_random(struct mtprng_state *); | | 327 | uint32_t mtprng_random(struct mtprng_state *); |
326 | int scanc(u_int, const u_char *, const u_char *, int); | | 328 | int scanc(u_int, const u_char *, const u_char *, int); |
327 | int skpc(int, size_t, u_char *); | | 329 | int skpc(int, size_t, u_char *); |
328 | int strcasecmp(const char *, const char *); | | 330 | int strcasecmp(const char *, const char *); |
329 | size_t strlcpy(char *, const char *, size_t); | | 331 | size_t strlcpy(char *, const char *, size_t); |
330 | size_t strlcat(char *, const char *, size_t); | | 332 | size_t strlcat(char *, const char *, size_t); |
331 | int strncasecmp(const char *, const char *, size_t); | | 333 | int strncasecmp(const char *, const char *, size_t); |
332 | u_long strtoul(const char *, char **, int); | | 334 | u_long strtoul(const char *, char **, int); |
333 | long long strtoll(const char *, char **, int); | | 335 | long long strtoll(const char *, char **, int); |
334 | unsigned long long strtoull(const char *, char **, int); | | 336 | unsigned long long strtoull(const char *, char **, int); |
335 | uintmax_t strtoumax(const char *, char **, int); | | 337 | uintmax_t strtoumax(const char *, char **, int); |
336 | int snprintb(char *, size_t, const char *, uint64_t); | | 338 | int snprintb(char *, size_t, const char *, uint64_t); |
337 | int snprintb_m(char *, size_t, const char *, uint64_t, size_t); | | 339 | int snprintb_m(char *, size_t, const char *, uint64_t, size_t); |
338 | int kheapsort(void *, size_t, size_t, int (*)(const void *, const void *), | | 340 | int kheapsort(void *, size_t, size_t, int (*)(const void *, const void *), |
339 | void *); | | 341 | void *); |
340 | uint32_t crc32(uint32_t, const uint8_t *, size_t); | | 342 | uint32_t crc32(uint32_t, const uint8_t *, size_t); |
341 | unsigned int popcount(unsigned int) __constfunc; | | 343 | unsigned int popcount(unsigned int) __constfunc; |
342 | unsigned int popcountl(unsigned long) __constfunc; | | 344 | unsigned int popcountl(unsigned long) __constfunc; |
343 | unsigned int popcountll(unsigned long long) __constfunc; | | 345 | unsigned int popcountll(unsigned long long) __constfunc; |
344 | unsigned int popcount32(uint32_t) __constfunc; | | 346 | unsigned int popcount32(uint32_t) __constfunc; |
345 | unsigned int popcount64(uint64_t) __constfunc; | | 347 | unsigned int popcount64(uint64_t) __constfunc; |
346 | #endif /* !_LIB_LIBKERN_LIBKERN_H_ */ | | 348 | #endif /* !_LIB_LIBKERN_LIBKERN_H_ */ |