1 1.148 riastrad /* $NetBSD: libkern.h,v 1.148 2025/03/02 16:35:41 riastradh Exp $ */ 2 1.3 cgd 3 1.1 cgd /*- 4 1.1 cgd * Copyright (c) 1992, 1993 5 1.1 cgd * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.49 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd * 31 1.21 fvdl * @(#)libkern.h 8.2 (Berkeley) 8/5/94 32 1.1 cgd */ 33 1.1 cgd 34 1.29 simonb #ifndef _LIB_LIBKERN_LIBKERN_H_ 35 1.29 simonb #define _LIB_LIBKERN_LIBKERN_H_ 36 1.29 simonb 37 1.121 uebayasi #ifdef _KERNEL_OPT 38 1.128 maxv #include "opt_kasan.h" 39 1.133 maxv #include "opt_kcsan.h" 40 1.140 maxv #include "opt_kmsan.h" 41 1.121 uebayasi #endif 42 1.121 uebayasi 43 1.1 cgd #include <sys/types.h> 44 1.62 thorpej #include <sys/inttypes.h> 45 1.52 christos #include <sys/null.h> 46 1.146 christos #include <sys/stddef.h> 47 1.146 christos #include <sys/container_of.h> 48 1.4 cgd 49 1.142 thorpej #include <lib/libkern/strlist.h> 50 1.142 thorpej 51 1.7 christos #ifndef LIBKERN_INLINE 52 1.55 perry #define LIBKERN_INLINE static __inline 53 1.7 christos #define LIBKERN_BODY 54 1.7 christos #endif 55 1.7 christos 56 1.86 dsl LIBKERN_INLINE int imax(int, int) __unused; 57 1.86 dsl LIBKERN_INLINE int imin(int, int) __unused; 58 1.130 riastrad LIBKERN_INLINE u_int uimax(u_int, u_int) __unused; 59 1.130 riastrad LIBKERN_INLINE u_int uimin(u_int, u_int) __unused; 60 1.86 dsl LIBKERN_INLINE long lmax(long, long) __unused; 61 1.86 dsl LIBKERN_INLINE long lmin(long, long) __unused; 62 1.86 dsl LIBKERN_INLINE u_long ulmax(u_long, u_long) __unused; 63 1.86 dsl LIBKERN_INLINE u_long ulmin(u_long, u_long) __unused; 64 1.86 dsl LIBKERN_INLINE int abs(int) __unused; 65 1.113 joerg LIBKERN_INLINE long labs(long) __unused; 66 1.113 joerg LIBKERN_INLINE long long llabs(long long) __unused; 67 1.113 joerg LIBKERN_INLINE intmax_t imaxabs(intmax_t) __unused; 68 1.86 dsl 69 1.86 dsl LIBKERN_INLINE int isspace(int) __unused; 70 1.86 dsl LIBKERN_INLINE int isascii(int) __unused; 71 1.86 dsl LIBKERN_INLINE int isupper(int) __unused; 72 1.86 dsl LIBKERN_INLINE int islower(int) __unused; 73 1.86 dsl LIBKERN_INLINE int isalpha(int) __unused; 74 1.114 lneto LIBKERN_INLINE int isalnum(int) __unused; 75 1.86 dsl LIBKERN_INLINE int isdigit(int) __unused; 76 1.86 dsl LIBKERN_INLINE int isxdigit(int) __unused; 77 1.114 lneto LIBKERN_INLINE int iscntrl(int) __unused; 78 1.114 lneto LIBKERN_INLINE int isgraph(int) __unused; 79 1.114 lneto LIBKERN_INLINE int isprint(int) __unused; 80 1.114 lneto LIBKERN_INLINE int ispunct(int) __unused; 81 1.86 dsl LIBKERN_INLINE int toupper(int) __unused; 82 1.86 dsl LIBKERN_INLINE int tolower(int) __unused; 83 1.33 thorpej 84 1.7 christos #ifdef LIBKERN_BODY 85 1.7 christos LIBKERN_INLINE int 86 1.44 matt imax(int a, int b) 87 1.1 cgd { 88 1.1 cgd return (a > b ? a : b); 89 1.1 cgd } 90 1.7 christos LIBKERN_INLINE int 91 1.44 matt imin(int a, int b) 92 1.1 cgd { 93 1.1 cgd return (a < b ? a : b); 94 1.1 cgd } 95 1.7 christos LIBKERN_INLINE long 96 1.44 matt lmax(long a, long b) 97 1.1 cgd { 98 1.1 cgd return (a > b ? a : b); 99 1.1 cgd } 100 1.7 christos LIBKERN_INLINE long 101 1.44 matt lmin(long a, long b) 102 1.1 cgd { 103 1.1 cgd return (a < b ? a : b); 104 1.1 cgd } 105 1.7 christos LIBKERN_INLINE u_int 106 1.130 riastrad uimax(u_int a, u_int b) 107 1.1 cgd { 108 1.1 cgd return (a > b ? a : b); 109 1.1 cgd } 110 1.7 christos LIBKERN_INLINE u_int 111 1.130 riastrad uimin(u_int a, u_int b) 112 1.1 cgd { 113 1.1 cgd return (a < b ? a : b); 114 1.1 cgd } 115 1.7 christos LIBKERN_INLINE u_long 116 1.44 matt ulmax(u_long a, u_long b) 117 1.1 cgd { 118 1.1 cgd return (a > b ? a : b); 119 1.1 cgd } 120 1.7 christos LIBKERN_INLINE u_long 121 1.44 matt ulmin(u_long a, u_long b) 122 1.1 cgd { 123 1.1 cgd return (a < b ? a : b); 124 1.5 leo } 125 1.5 leo 126 1.7 christos LIBKERN_INLINE int 127 1.44 matt abs(int j) 128 1.5 leo { 129 1.5 leo return(j < 0 ? -j : j); 130 1.33 thorpej } 131 1.33 thorpej 132 1.113 joerg LIBKERN_INLINE long 133 1.113 joerg labs(long j) 134 1.113 joerg { 135 1.113 joerg return(j < 0 ? -j : j); 136 1.113 joerg } 137 1.113 joerg 138 1.113 joerg LIBKERN_INLINE long long 139 1.113 joerg llabs(long long j) 140 1.113 joerg { 141 1.113 joerg return(j < 0 ? -j : j); 142 1.113 joerg } 143 1.113 joerg 144 1.113 joerg LIBKERN_INLINE intmax_t 145 1.113 joerg imaxabs(intmax_t j) 146 1.113 joerg { 147 1.113 joerg return(j < 0 ? -j : j); 148 1.113 joerg } 149 1.113 joerg 150 1.33 thorpej LIBKERN_INLINE int 151 1.44 matt isspace(int ch) 152 1.33 thorpej { 153 1.33 thorpej return (ch == ' ' || (ch >= '\t' && ch <= '\r')); 154 1.33 thorpej } 155 1.33 thorpej 156 1.33 thorpej LIBKERN_INLINE int 157 1.44 matt isascii(int ch) 158 1.33 thorpej { 159 1.33 thorpej return ((ch & ~0x7f) == 0); 160 1.33 thorpej } 161 1.33 thorpej 162 1.33 thorpej LIBKERN_INLINE int 163 1.44 matt isupper(int ch) 164 1.33 thorpej { 165 1.33 thorpej return (ch >= 'A' && ch <= 'Z'); 166 1.33 thorpej } 167 1.33 thorpej 168 1.33 thorpej LIBKERN_INLINE int 169 1.44 matt islower(int ch) 170 1.33 thorpej { 171 1.33 thorpej return (ch >= 'a' && ch <= 'z'); 172 1.33 thorpej } 173 1.33 thorpej 174 1.33 thorpej LIBKERN_INLINE int 175 1.44 matt isalpha(int ch) 176 1.33 thorpej { 177 1.33 thorpej return (isupper(ch) || islower(ch)); 178 1.33 thorpej } 179 1.33 thorpej 180 1.33 thorpej LIBKERN_INLINE int 181 1.114 lneto isalnum(int ch) 182 1.114 lneto { 183 1.114 lneto return (isalpha(ch) || isdigit(ch)); 184 1.114 lneto } 185 1.114 lneto 186 1.114 lneto LIBKERN_INLINE int 187 1.44 matt isdigit(int ch) 188 1.33 thorpej { 189 1.33 thorpej return (ch >= '0' && ch <= '9'); 190 1.33 thorpej } 191 1.33 thorpej 192 1.33 thorpej LIBKERN_INLINE int 193 1.44 matt isxdigit(int ch) 194 1.33 thorpej { 195 1.33 thorpej return (isdigit(ch) || 196 1.33 thorpej (ch >= 'A' && ch <= 'F') || 197 1.33 thorpej (ch >= 'a' && ch <= 'f')); 198 1.33 thorpej } 199 1.33 thorpej 200 1.33 thorpej LIBKERN_INLINE int 201 1.114 lneto iscntrl(int ch) 202 1.114 lneto { 203 1.114 lneto return ((ch >= 0x00 && ch <= 0x1F) || ch == 0x7F); 204 1.114 lneto } 205 1.114 lneto 206 1.114 lneto LIBKERN_INLINE int 207 1.114 lneto isgraph(int ch) 208 1.114 lneto { 209 1.114 lneto return (ch != ' ' && isprint(ch)); 210 1.114 lneto } 211 1.114 lneto 212 1.114 lneto LIBKERN_INLINE int 213 1.114 lneto isprint(int ch) 214 1.114 lneto { 215 1.114 lneto return (ch >= 0x20 && ch <= 0x7E); 216 1.114 lneto } 217 1.114 lneto 218 1.114 lneto LIBKERN_INLINE int 219 1.114 lneto ispunct(int ch) 220 1.114 lneto { 221 1.114 lneto return (isprint(ch) && ch != ' ' && !isalnum(ch)); 222 1.114 lneto } 223 1.114 lneto 224 1.114 lneto LIBKERN_INLINE int 225 1.44 matt toupper(int ch) 226 1.33 thorpej { 227 1.33 thorpej if (islower(ch)) 228 1.33 thorpej return (ch - 0x20); 229 1.33 thorpej return (ch); 230 1.33 thorpej } 231 1.33 thorpej 232 1.33 thorpej LIBKERN_INLINE int 233 1.44 matt tolower(int ch) 234 1.33 thorpej { 235 1.33 thorpej if (isupper(ch)) 236 1.33 thorpej return (ch + 0x20); 237 1.33 thorpej return (ch); 238 1.1 cgd } 239 1.7 christos #endif 240 1.1 cgd 241 1.64 matt #define __NULL_STMT do { } while (/* CONSTCOND */ 0) 242 1.59 dyoung 243 1.101 jym #define __KASSERTSTR "kernel %sassertion \"%s\" failed: file \"%s\", line %d " 244 1.101 jym 245 1.9 cgd #ifdef NDEBUG /* tradition! */ 246 1.9 cgd #define assert(e) ((void)0) 247 1.10 cgd #else 248 1.30 thorpej #define assert(e) (__predict_true((e)) ? (void)0 : \ 249 1.102 christos kern_assert(__KASSERTSTR, "", #e, __FILE__, __LINE__)) 250 1.9 cgd #endif 251 1.9 cgd 252 1.61 christos #ifdef __COVERITY__ 253 1.61 christos #ifndef DIAGNOSTIC 254 1.61 christos #define DIAGNOSTIC 255 1.61 christos #endif 256 1.61 christos #endif 257 1.61 christos 258 1.111 pooka #ifndef CTASSERT 259 1.97 matt #define CTASSERT(x) __CTASSERT(x) 260 1.111 pooka #endif 261 1.111 pooka #ifndef CTASSERT_SIGNED 262 1.105 rmind #define CTASSERT_SIGNED(x) __CTASSERT(((typeof(x))-1) < 0) 263 1.111 pooka #endif 264 1.111 pooka #ifndef CTASSERT_UNSIGNED 265 1.105 rmind #define CTASSERT_UNSIGNED(x) __CTASSERT(((typeof(x))-1) >= 0) 266 1.111 pooka #endif 267 1.80 matt 268 1.61 christos #ifndef DIAGNOSTIC 269 1.52 christos #define _DIAGASSERT(a) (void)0 270 1.34 lukem #ifdef lint 271 1.101 jym #define KASSERTMSG(e, msg, ...) /* NOTHING */ 272 1.81 matt #define KASSERT(e) /* NOTHING */ 273 1.34 lukem #else /* !lint */ 274 1.144 riastrad /* 275 1.144 riastrad * Make sure the expression compiles, but don't evaluate any of it. We 276 1.144 riastrad * use sizeof to inhibit evaluation, and cast to long so the expression 277 1.144 riastrad * can be integer- or pointer-valued without bringing in other header 278 1.144 riastrad * files. 279 1.144 riastrad */ 280 1.144 riastrad #define KASSERTMSG(e, msg, ...) ((void)sizeof((long)(e))) 281 1.144 riastrad #define KASSERT(e) ((void)sizeof((long)(e))) 282 1.34 lukem #endif /* !lint */ 283 1.61 christos #else /* DIAGNOSTIC */ 284 1.52 christos #define _DIAGASSERT(a) assert(a) 285 1.101 jym #define KASSERTMSG(e, msg, ...) \ 286 1.101 jym (__predict_true((e)) ? (void)0 : \ 287 1.102 christos kern_assert(__KASSERTSTR msg, "diagnostic ", #e, \ 288 1.101 jym __FILE__, __LINE__, ## __VA_ARGS__)) 289 1.101 jym 290 1.30 thorpej #define KASSERT(e) (__predict_true((e)) ? (void)0 : \ 291 1.102 christos kern_assert(__KASSERTSTR, "diagnostic ", #e, \ 292 1.101 jym __FILE__, __LINE__)) 293 1.9 cgd #endif 294 1.9 cgd 295 1.9 cgd #ifndef DEBUG 296 1.34 lukem #ifdef lint 297 1.101 jym #define KDASSERTMSG(e,msg, ...) /* NOTHING */ 298 1.96 matt #define KDASSERT(e) /* NOTHING */ 299 1.34 lukem #else /* lint */ 300 1.101 jym #define KDASSERTMSG(e,msg, ...) ((void)0) 301 1.96 matt #define KDASSERT(e) ((void)0) 302 1.34 lukem #endif /* lint */ 303 1.9 cgd #else 304 1.101 jym #define KDASSERTMSG(e, msg, ...) \ 305 1.101 jym (__predict_true((e)) ? (void)0 : \ 306 1.102 christos kern_assert(__KASSERTSTR msg, "debugging ", #e, \ 307 1.101 jym __FILE__, __LINE__, ## __VA_ARGS__)) 308 1.101 jym 309 1.30 thorpej #define KDASSERT(e) (__predict_true((e)) ? (void)0 : \ 310 1.102 christos kern_assert(__KASSERTSTR, "debugging ", #e, \ 311 1.101 jym __FILE__, __LINE__)) 312 1.9 cgd #endif 313 1.101 jym 314 1.53 christos /* 315 1.53 christos * XXX: For compatibility we use SMALL_RANDOM by default. 316 1.53 christos */ 317 1.53 christos #define SMALL_RANDOM 318 1.19 thorpej 319 1.38 thorpej /* Prototypes for which GCC built-ins exist. */ 320 1.86 dsl void *memcpy(void *, const void *, size_t); 321 1.86 dsl int memcmp(const void *, const void *, size_t); 322 1.86 dsl void *memset(void *, int, size_t); 323 1.103 chs #if __GNUC_PREREQ__(2, 95) && !defined(_STANDALONE) 324 1.128 maxv #if defined(_KERNEL) && defined(KASAN) 325 1.131 maxv void *kasan_memcpy(void *, const void *, size_t); 326 1.131 maxv int kasan_memcmp(const void *, const void *, size_t); 327 1.128 maxv void *kasan_memset(void *, int, size_t); 328 1.128 maxv #define memcpy(d, s, l) kasan_memcpy(d, s, l) 329 1.128 maxv #define memcmp(a, b, l) kasan_memcmp(a, b, l) 330 1.128 maxv #define memset(d, v, l) kasan_memset(d, v, l) 331 1.133 maxv #elif defined(_KERNEL) && defined(KCSAN) 332 1.133 maxv void *kcsan_memcpy(void *, const void *, size_t); 333 1.133 maxv int kcsan_memcmp(const void *, const void *, size_t); 334 1.133 maxv void *kcsan_memset(void *, int, size_t); 335 1.133 maxv #define memcpy(d, s, l) kcsan_memcpy(d, s, l) 336 1.133 maxv #define memcmp(a, b, l) kcsan_memcmp(a, b, l) 337 1.133 maxv #define memset(d, v, l) kcsan_memset(d, v, l) 338 1.134 maxv #elif defined(_KERNEL) && defined(KMSAN) 339 1.134 maxv void *kmsan_memcpy(void *, const void *, size_t); 340 1.134 maxv int kmsan_memcmp(const void *, const void *, size_t); 341 1.134 maxv void *kmsan_memset(void *, int, size_t); 342 1.134 maxv #define memcpy(d, s, l) kmsan_memcpy(d, s, l) 343 1.134 maxv #define memcmp(a, b, l) kmsan_memcmp(a, b, l) 344 1.134 maxv #define memset(d, v, l) kmsan_memset(d, v, l) 345 1.128 maxv #else 346 1.38 thorpej #define memcpy(d, s, l) __builtin_memcpy(d, s, l) 347 1.38 thorpej #define memcmp(a, b, l) __builtin_memcmp(a, b, l) 348 1.38 thorpej #define memset(d, v, l) __builtin_memset(d, v, l) 349 1.133 maxv #endif 350 1.38 thorpej #endif 351 1.140 maxv void *memmem(const void *, size_t, const void *, size_t); 352 1.38 thorpej 353 1.86 dsl char *strcpy(char *, const char *); 354 1.86 dsl int strcmp(const char *, const char *); 355 1.86 dsl size_t strlen(const char *); 356 1.88 tsutsui #if __GNUC_PREREQ__(2, 95) && !defined(_STANDALONE) 357 1.129 maxv #if defined(_KERNEL) && defined(KASAN) 358 1.129 maxv char *kasan_strcpy(char *, const char *); 359 1.129 maxv int kasan_strcmp(const char *, const char *); 360 1.129 maxv size_t kasan_strlen(const char *); 361 1.129 maxv #define strcpy(d, s) kasan_strcpy(d, s) 362 1.129 maxv #define strcmp(a, b) kasan_strcmp(a, b) 363 1.129 maxv #define strlen(a) kasan_strlen(a) 364 1.133 maxv #elif defined(_KERNEL) && defined(KCSAN) 365 1.133 maxv char *kcsan_strcpy(char *, const char *); 366 1.133 maxv int kcsan_strcmp(const char *, const char *); 367 1.133 maxv size_t kcsan_strlen(const char *); 368 1.133 maxv #define strcpy(d, s) kcsan_strcpy(d, s) 369 1.133 maxv #define strcmp(a, b) kcsan_strcmp(a, b) 370 1.133 maxv #define strlen(a) kcsan_strlen(a) 371 1.134 maxv #elif defined(_KERNEL) && defined(KMSAN) 372 1.134 maxv char *kmsan_strcpy(char *, const char *); 373 1.134 maxv int kmsan_strcmp(const char *, const char *); 374 1.134 maxv size_t kmsan_strlen(const char *); 375 1.134 maxv #define strcpy(d, s) kmsan_strcpy(d, s) 376 1.134 maxv #define strcmp(a, b) kmsan_strcmp(a, b) 377 1.134 maxv #define strlen(a) kmsan_strlen(a) 378 1.129 maxv #else 379 1.38 thorpej #define strcpy(d, s) __builtin_strcpy(d, s) 380 1.38 thorpej #define strcmp(a, b) __builtin_strcmp(a, b) 381 1.38 thorpej #define strlen(a) __builtin_strlen(a) 382 1.133 maxv #endif 383 1.39 thorpej #endif 384 1.140 maxv size_t strnlen(const char *, size_t); 385 1.140 maxv char *strsep(char **, const char *); 386 1.39 thorpej 387 1.39 thorpej /* Functions for which we always use built-ins. */ 388 1.39 thorpej #ifdef __GNUC__ 389 1.39 thorpej #define alloca(s) __builtin_alloca(s) 390 1.38 thorpej #endif 391 1.38 thorpej 392 1.140 maxv /* These exist in GCC 3.x, but we don't bother. */ 393 1.139 skrll char *strcat(char *, const char *); 394 1.139 skrll char *strchr(const char *, int); 395 1.139 skrll char *strrchr(const char *, int); 396 1.138 maxv #if defined(_KERNEL) && defined(KASAN) 397 1.138 maxv char *kasan_strcat(char *, const char *); 398 1.138 maxv char *kasan_strchr(const char *, int); 399 1.138 maxv char *kasan_strrchr(const char *, int); 400 1.138 maxv #define strcat(d, s) kasan_strcat(d, s) 401 1.138 maxv #define strchr(s, c) kasan_strchr(s, c) 402 1.138 maxv #define strrchr(s, c) kasan_strrchr(s, c) 403 1.138 maxv #elif defined(_KERNEL) && defined(KMSAN) 404 1.135 maxv char *kmsan_strcat(char *, const char *); 405 1.135 maxv char *kmsan_strchr(const char *, int); 406 1.135 maxv char *kmsan_strrchr(const char *, int); 407 1.135 maxv #define strcat(d, s) kmsan_strcat(d, s) 408 1.135 maxv #define strchr(s, c) kmsan_strchr(s, c) 409 1.135 maxv #define strrchr(s, c) kmsan_strrchr(s, c) 410 1.135 maxv #endif 411 1.114 lneto size_t strcspn(const char *, const char *); 412 1.86 dsl char *strncpy(char *, const char *, size_t); 413 1.112 christos char *strncat(char *, const char *, size_t); 414 1.86 dsl int strncmp(const char *, const char *, size_t); 415 1.86 dsl char *strstr(const char *, const char *); 416 1.114 lneto char *strpbrk(const char *, const char *); 417 1.114 lneto size_t strspn(const char *, const char *); 418 1.38 thorpej 419 1.42 ragge /* 420 1.42 ragge * ffs is an instruction on vax. 421 1.42 ragge */ 422 1.86 dsl int ffs(int); 423 1.69 matt #if __GNUC_PREREQ__(2, 95) && (!defined(__vax__) || __GNUC_PREREQ__(4,1)) 424 1.63 matt #define ffs(x) __builtin_ffs(x) 425 1.41 thorpej #endif 426 1.38 thorpej 427 1.102 christos void kern_assert(const char *, ...) 428 1.102 christos __attribute__((__format__(__printf__, 1, 2))); 429 1.28 simonb u_int32_t 430 1.86 dsl inet_addr(const char *); 431 1.52 christos struct in_addr; 432 1.86 dsl int inet_aton(const char *, struct in_addr *); 433 1.86 dsl char *intoa(u_int32_t); 434 1.28 simonb #define inet_ntoa(a) intoa((a).s_addr) 435 1.86 dsl void *memchr(const void *, int, size_t); 436 1.131 maxv 437 1.86 dsl void *memmove(void *, const void *, size_t); 438 1.131 maxv #if defined(_KERNEL) && defined(KASAN) 439 1.131 maxv void *kasan_memmove(void *, const void *, size_t); 440 1.131 maxv #define memmove(d, s, l) kasan_memmove(d, s, l) 441 1.133 maxv #elif defined(_KERNEL) && defined(KCSAN) 442 1.133 maxv void *kcsan_memmove(void *, const void *, size_t); 443 1.133 maxv #define memmove(d, s, l) kcsan_memmove(d, s, l) 444 1.134 maxv #elif defined(_KERNEL) && defined(KMSAN) 445 1.134 maxv void *kmsan_memmove(void *, const void *, size_t); 446 1.134 maxv #define memmove(d, s, l) kmsan_memmove(d, s, l) 447 1.131 maxv #endif 448 1.131 maxv 449 1.86 dsl int pmatch(const char *, const char *, const char **); 450 1.53 christos #ifndef SMALL_RANDOM 451 1.86 dsl void srandom(unsigned long); 452 1.86 dsl char *initstate(unsigned long, char *, size_t); 453 1.86 dsl char *setstate(char *); 454 1.53 christos #endif /* SMALL_RANDOM */ 455 1.86 dsl long random(void); 456 1.110 joerg void mi_vector_hash(const void * __restrict, size_t, uint32_t, 457 1.110 joerg uint32_t[3]); 458 1.86 dsl int scanc(u_int, const u_char *, const u_char *, int); 459 1.86 dsl int skpc(int, size_t, u_char *); 460 1.86 dsl int strcasecmp(const char *, const char *); 461 1.147 riastrad size_t strlcpy(char * __restrict, const char * __restrict, size_t); 462 1.147 riastrad size_t strlcat(char * __restrict, const char * __restrict, size_t); 463 1.86 dsl int strncasecmp(const char *, const char *, size_t); 464 1.86 dsl u_long strtoul(const char *, char **, int); 465 1.86 dsl long long strtoll(const char *, char **, int); 466 1.86 dsl unsigned long long strtoull(const char *, char **, int); 467 1.109 lneto intmax_t strtoimax(const char *, char **, int); 468 1.86 dsl uintmax_t strtoumax(const char *, char **, int); 469 1.117 christos intmax_t strtoi(const char * __restrict, char ** __restrict, int, intmax_t, 470 1.117 christos intmax_t, int *); 471 1.117 christos uintmax_t strtou(const char * __restrict, char ** __restrict, int, uintmax_t, 472 1.117 christos uintmax_t, int *); 473 1.126 christos void hexdump(void (*)(const char *, ...) __printflike(1, 2), 474 1.126 christos const char *, const void *, size_t); 475 1.117 christos 476 1.86 dsl int snprintb(char *, size_t, const char *, uint64_t); 477 1.91 pgoyette int snprintb_m(char *, size_t, const char *, uint64_t, size_t); 478 1.84 ad int kheapsort(void *, size_t, size_t, int (*)(const void *, const void *), 479 1.148 riastrad void *); 480 1.148 riastrad int kheapsort_r(void *, size_t, size_t, 481 1.148 riastrad int (*)(const void *, const void *, void *), void *, 482 1.148 riastrad void *); 483 1.90 tls uint32_t crc32(uint32_t, const uint8_t *, size_t); 484 1.120 matt #if __GNUC_PREREQ__(4, 5) \ 485 1.120 matt && (defined(__alpha_cix__) || defined(__mips_popcount)) 486 1.120 matt #define popcount __builtin_popcount 487 1.120 matt #define popcountl __builtin_popcountl 488 1.120 matt #define popcountll __builtin_popcountll 489 1.120 matt #define popcount32 __builtin_popcount 490 1.120 matt #define popcount64 __builtin_popcountll 491 1.120 matt #else 492 1.92 joerg unsigned int popcount(unsigned int) __constfunc; 493 1.92 joerg unsigned int popcountl(unsigned long) __constfunc; 494 1.92 joerg unsigned int popcountll(unsigned long long) __constfunc; 495 1.92 joerg unsigned int popcount32(uint32_t) __constfunc; 496 1.92 joerg unsigned int popcount64(uint64_t) __constfunc; 497 1.120 matt #endif 498 1.106 drochner 499 1.108 riastrad void *explicit_memset(void *, int, size_t); 500 1.107 riastrad int consttime_memequal(const void *, const void *, size_t); 501 1.122 christos int strnvisx(char *, size_t, const char *, size_t, int); 502 1.122 christos #define VIS_OCTAL 0x01 503 1.122 christos #define VIS_SAFE 0x20 504 1.122 christos #define VIS_TRIM 0x40 505 1.115 tls 506 1.143 mrg struct disklabel; 507 1.143 mrg void disklabel_swap(struct disklabel *, struct disklabel *); 508 1.143 mrg uint16_t dkcksum(const struct disklabel *); 509 1.143 mrg uint16_t dkcksum_sized(const struct disklabel *, size_t); 510 1.143 mrg 511 1.29 simonb #endif /* !_LIB_LIBKERN_LIBKERN_H_ */ 512