mirror of
				https://github.com/isar/rusqlite.git
				synced 2025-10-31 22:08:55 +08:00 
			
		
		
		
	wasm32
This commit is contained in:
		| @@ -115,22 +115,14 @@ mod build_bundled { | ||||
|             .flag("-DSQLITE_CORE") | ||||
|             .flag("-DSQLITE_DEFAULT_FOREIGN_KEYS=1") | ||||
|             .flag("-DSQLITE_ENABLE_API_ARMOR") | ||||
|             .flag("-DSQLITE_ENABLE_COLUMN_METADATA") | ||||
|             .flag("-DSQLITE_ENABLE_DBSTAT_VTAB") | ||||
|             .flag("-DSQLITE_ENABLE_FTS3") | ||||
|             .flag("-DSQLITE_ENABLE_FTS3_PARENTHESIS") | ||||
|             .flag("-DSQLITE_ENABLE_FTS5") | ||||
|             .flag("-DSQLITE_ENABLE_JSON1") | ||||
|             .flag("-DSQLITE_ENABLE_LOAD_EXTENSION=1") | ||||
|             .flag("-DSQLITE_ENABLE_MEMORY_MANAGEMENT") | ||||
|             .flag("-DSQLITE_ENABLE_RTREE") | ||||
|             .flag("-DSQLITE_ENABLE_STAT2") | ||||
|             .flag("-DSQLITE_ENABLE_STAT4") | ||||
|             .flag("-DSQLITE_SOUNDEX") | ||||
|             .flag("-DSQLITE_THREADSAFE=1") | ||||
|             .flag("-DSQLITE_USE_URI") | ||||
|             .flag("-DHAVE_USLEEP=1") | ||||
|             .flag("-D_POSIX_THREAD_SAFE_FUNCTIONS") // cross compile with MinGW | ||||
|             .flag("-DSQLITE_DEFAULT_MEMSTATUS=0") | ||||
|             .flag("-DSQLITE_MAX_EXPR_DEPTH=0") | ||||
|             .flag("-DSQLITE_OMIT_DECLTYPE") | ||||
|             .flag("-DSQLITE_OMIT_DEPRECATED") | ||||
|             .flag("-DSQLITE_OMIT_PROGRESS_CALLBACK") | ||||
|             .flag("-DSQLITE_LIKE_DOESNT_MATCH_BLOBS") | ||||
|             .warnings(false); | ||||
|  | ||||
|         if cfg!(feature = "bundled-sqlcipher") { | ||||
| @@ -234,7 +226,7 @@ mod build_bundled { | ||||
|             if vs_has_nan { | ||||
|                 cfg.flag("-DHAVE_ISNAN"); | ||||
|             } | ||||
|         } else { | ||||
|         } else if env::var("TARGET") != Ok("wasm32-unknown-unknown".to_string()) { | ||||
|             cfg.flag("-DHAVE_ISNAN"); | ||||
|         } | ||||
|         if !win_target() { | ||||
| @@ -249,6 +241,37 @@ mod build_bundled { | ||||
|                 cfg.file("sqlite3/wasm32-wasi-vfs.c"); | ||||
|             } | ||||
|         } | ||||
|         if env::var("TARGET") == Ok("wasm32-unknown-unknown".to_string()) { | ||||
|             // Apple clang doesn't support wasm32, so use Homebrew clang by default. | ||||
|             if env::var("HOST") == Ok("x86_64-apple-darwin".to_string()) { | ||||
|                 if env::var("CC").is_err() { | ||||
|                     std::env::set_var("CC", "/usr/local/opt/llvm/bin/clang"); | ||||
|                 } | ||||
|                 if env::var("AR").is_err() { | ||||
|                     std::env::set_var("AR", "/usr/local/opt/llvm/bin/llvm-ar"); | ||||
|                 } | ||||
|             } else if env::var("HOST") == Ok("aarch64-apple-darwin".to_string()) { | ||||
|                 if env::var("CC").is_err() { | ||||
|                     std::env::set_var("CC", "/opt/homebrew/opt/llvm/bin/clang"); | ||||
|                 } | ||||
|                 if env::var("AR").is_err() { | ||||
|                     std::env::set_var("AR", "/opt/homebrew/opt/llvm/bin/llvm-ar"); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             cfg.flag("-DSQLITE_OS_OTHER") | ||||
|                 .flag("-DSQLITE_TEMP_STORE=3") | ||||
|                 // https://github.com/rust-lang/rust/issues/74393 | ||||
|                 .flag("-DLONGDOUBLE_TYPE=double") | ||||
|                 .flag("-DSQLITE_OMIT_LOCALTIME"); | ||||
|             cfg.include("sqlite3/wasm32-unknown-unknown/include"); | ||||
|             cfg.file("sqlite3/wasm32-unknown-unknown/libc/stdlib/qsort.c"); | ||||
|             cfg.file("sqlite3/wasm32-unknown-unknown/libc/string/strcmp.c"); | ||||
|             cfg.file("sqlite3/wasm32-unknown-unknown/libc/string/strcspn.c"); | ||||
|             cfg.file("sqlite3/wasm32-unknown-unknown/libc/string/strlen.c"); | ||||
|             cfg.file("sqlite3/wasm32-unknown-unknown/libc/string/strncmp.c"); | ||||
|             cfg.file("sqlite3/wasm32-unknown-unknown/libc/string/strrchr.c"); | ||||
|         } | ||||
|         if cfg!(feature = "unlock_notify") { | ||||
|             cfg.flag("-DSQLITE_ENABLE_UNLOCK_NOTIFY"); | ||||
|         } | ||||
|   | ||||
| @@ -0,0 +1 @@ | ||||
| #define assert(x) (void)0 | ||||
| @@ -0,0 +1 @@ | ||||
| double log(double x); | ||||
| @@ -0,0 +1 @@ | ||||
| #define FILENAME_MAX 4096 | ||||
| @@ -0,0 +1,9 @@ | ||||
| #include <stddef.h> | ||||
|  | ||||
| void *malloc(size_t size); | ||||
| void free(void *ptr); | ||||
| void *realloc(void *ptr, size_t size); | ||||
|  | ||||
| void qsort(void *a, size_t n, size_t es, int (*cmp)(const void *, const void *)); | ||||
|  | ||||
| #define DEF_STRONG(x) | ||||
| @@ -0,0 +1,15 @@ | ||||
| #include <stddef.h> | ||||
|  | ||||
| int strcmp(const char *s1, const char *s2); | ||||
| size_t strcspn(const char *s1, const char *s2); | ||||
| size_t strlen(const char *str); | ||||
| int strncmp(const char *s1, const char *s2, size_t n); | ||||
| char *strrchr(const char *p, int ch); | ||||
|  | ||||
| int memcmp(const void *str1, const void *str2, size_t n); | ||||
| void *memcpy(void *dest, const void *src, size_t n); | ||||
| void *memmove(void *str1, const void *str2, size_t n); | ||||
| void *memset(void *str, int c, size_t n); | ||||
|  | ||||
| #define DEF_STRONG(x) | ||||
| #define __weak_alias(x, y) | ||||
| @@ -0,0 +1,167 @@ | ||||
| /*$OpenBSD : qsort.c, v 1.14 2017 / 01 / 04 15 : 20 : 30 millert Exp $ * / | ||||
| /*- | ||||
|  * Copyright (c) 1992, 1993 | ||||
|  *	The Regents of the University of California.  All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. Neither the name of the University nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| #include <sys/types.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| static __inline char *med3(char *, char *, char *, int (*)(const void *, const void *)); | ||||
| static __inline void swapfunc(char *, char *, size_t, int); | ||||
|  | ||||
| #define min(a, b) (a) < (b) ? a : b | ||||
|  | ||||
| /* | ||||
|  * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". | ||||
|  */ | ||||
| #define swapcode(TYPE, parmi, parmj, n) \ | ||||
|     {                                   \ | ||||
|         size_t i = (n) / sizeof(TYPE);  \ | ||||
|         TYPE *pi = (TYPE *)(parmi);     \ | ||||
|         TYPE *pj = (TYPE *)(parmj);     \ | ||||
|         do                              \ | ||||
|         {                               \ | ||||
|             TYPE t = *pi;               \ | ||||
|             *pi++ = *pj;                \ | ||||
|             *pj++ = t;                  \ | ||||
|         } while (--i > 0);              \ | ||||
|     } | ||||
|  | ||||
| #define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \ | ||||
|                                            es % sizeof(long)                 \ | ||||
|                                        ? 2                                   \ | ||||
|                                    : es == sizeof(long) ? 0                  \ | ||||
|                                                         : 1; | ||||
|  | ||||
| static __inline void | ||||
| swapfunc(char *a, char *b, size_t n, int swaptype) | ||||
| { | ||||
|     if (swaptype <= 1) | ||||
|         swapcode(long, a, b, n) else swapcode(char, a, b, n) | ||||
| } | ||||
|  | ||||
| #define swap(a, b)                   \ | ||||
|     if (swaptype == 0)               \ | ||||
|     {                                \ | ||||
|         long t = *(long *)(a);       \ | ||||
|         *(long *)(a) = *(long *)(b); \ | ||||
|         *(long *)(b) = t;            \ | ||||
|     }                                \ | ||||
|     else                             \ | ||||
|         swapfunc(a, b, es, swaptype) | ||||
|  | ||||
| #define vecswap(a, b, n) \ | ||||
|     if ((n) > 0)         \ | ||||
|     swapfunc(a, b, n, swaptype) | ||||
|  | ||||
| static __inline char * | ||||
| med3(char *a, char *b, char *c, int (*cmp)(const void *, const void *)) | ||||
| { | ||||
|     return cmp(a, b) < 0 ? (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a)) | ||||
|                          : (cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c)); | ||||
| } | ||||
|  | ||||
| void qsort(void *aa, size_t n, size_t es, int (*cmp)(const void *, const void *)) | ||||
| { | ||||
|     char *pa, *pb, *pc, *pd, *pl, *pm, *pn; | ||||
|     int cmp_result, swaptype; | ||||
|     size_t d, r; | ||||
|     char *a = aa; | ||||
|  | ||||
| loop: | ||||
|     SWAPINIT(a, es); | ||||
|     if (n < 7) | ||||
|     { | ||||
|         for (pm = a + es; pm < a + n * es; pm += es) | ||||
|             for (pl = pm; pl > a && cmp(pl - es, pl) > 0; | ||||
|                  pl -= es) | ||||
|                 swap(pl, pl - es); | ||||
|         return; | ||||
|     } | ||||
|     pm = a + (n / 2) * es; | ||||
|     if (n > 7) | ||||
|     { | ||||
|         pl = a; | ||||
|         pn = a + (n - 1) * es; | ||||
|         if (n > 40) | ||||
|         { | ||||
|             d = (n / 8) * es; | ||||
|             pl = med3(pl, pl + d, pl + 2 * d, cmp); | ||||
|             pm = med3(pm - d, pm, pm + d, cmp); | ||||
|             pn = med3(pn - 2 * d, pn - d, pn, cmp); | ||||
|         } | ||||
|         pm = med3(pl, pm, pn, cmp); | ||||
|     } | ||||
|     swap(a, pm); | ||||
|     pa = pb = a + es; | ||||
|  | ||||
|     pc = pd = a + (n - 1) * es; | ||||
|     for (;;) | ||||
|     { | ||||
|         while (pb <= pc && (cmp_result = cmp(pb, a)) <= 0) | ||||
|         { | ||||
|             if (cmp_result == 0) | ||||
|             { | ||||
|                 swap(pa, pb); | ||||
|                 pa += es; | ||||
|             } | ||||
|             pb += es; | ||||
|         } | ||||
|         while (pb <= pc && (cmp_result = cmp(pc, a)) >= 0) | ||||
|         { | ||||
|             if (cmp_result == 0) | ||||
|             { | ||||
|                 swap(pc, pd); | ||||
|                 pd -= es; | ||||
|             } | ||||
|             pc -= es; | ||||
|         } | ||||
|         if (pb > pc) | ||||
|             break; | ||||
|         swap(pb, pc); | ||||
|         pb += es; | ||||
|         pc -= es; | ||||
|     } | ||||
|  | ||||
|     pn = a + n * es; | ||||
|     r = min(pa - a, pb - pa); | ||||
|     vecswap(a, pb - r, r); | ||||
|     r = min(pd - pc, pn - pd - es); | ||||
|     vecswap(pb, pn - r, r); | ||||
|     if ((r = pb - pa) > es) | ||||
|         qsort(a, r / es, es, cmp); | ||||
|     if ((r = pd - pc) > es) | ||||
|     { | ||||
|         /* Iterate rather than recurse to save stack space */ | ||||
|         a = pn - r; | ||||
|         n = r / es; | ||||
|         goto loop; | ||||
|     } | ||||
|     /*		qsort(pn - r, r / es, es, cmp);*/ | ||||
| } | ||||
| DEF_STRONG(qsort); | ||||
| @@ -0,0 +1,47 @@ | ||||
| /*	$OpenBSD: strcmp.c,v 1.9 2015/08/31 02:53:57 guenther Exp $	*/ | ||||
|  | ||||
| /*- | ||||
|  * Copyright (c) 1990 The Regents of the University of California. | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * This code is derived from software contributed to Berkeley by | ||||
|  * Chris Torek. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. Neither the name of the University nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| /* | ||||
|  * Compare strings. | ||||
|  */ | ||||
| int strcmp(const char *s1, const char *s2) | ||||
| { | ||||
|     while (*s1 == *s2++) | ||||
|         if (*s1++ == 0) | ||||
|             return (0); | ||||
|     return (*(unsigned char *)s1 - *(unsigned char *)--s2); | ||||
| } | ||||
| DEF_STRONG(strcmp); | ||||
| @@ -0,0 +1,61 @@ | ||||
| /*	$OpenBSD: strcspn.c,v 1.6 2015/08/31 02:53:57 guenther Exp $ */ | ||||
| /*- | ||||
|  * Copyright (c) 1990 The Regents of the University of California. | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * This code is derived from software contributed to Berkeley by | ||||
|  * Chris Torek. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. Neither the name of the University nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| /* | ||||
|  * Span the complement of string s2. | ||||
|  */ | ||||
| size_t | ||||
| strcspn(const char *s1, const char *s2) | ||||
| { | ||||
|     const char *p, *spanp; | ||||
|     char c, sc; | ||||
|  | ||||
|     /* | ||||
|      * Stop as soon as we find any character from s2.  Note that there | ||||
|      * must be a NUL in s2; it suffices to stop when we find that, too. | ||||
|      */ | ||||
|     for (p = s1;;) | ||||
|     { | ||||
|         c = *p++; | ||||
|         spanp = s2; | ||||
|         do | ||||
|         { | ||||
|             if ((sc = *spanp++) == c) | ||||
|                 return (p - 1 - s1); | ||||
|         } while (sc != 0); | ||||
|     } | ||||
|     /* NOTREACHED */ | ||||
| } | ||||
| DEF_STRONG(strcspn); | ||||
| @@ -0,0 +1,44 @@ | ||||
| /*	$OpenBSD: strlen.c,v 1.9 2015/08/31 02:53:57 guenther Exp $	*/ | ||||
|  | ||||
| /*- | ||||
|  * Copyright (c) 1990, 1993 | ||||
|  *	The Regents of the University of California.  All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. Neither the name of the University nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| size_t | ||||
| strlen(const char *str) | ||||
| { | ||||
|     const char *s; | ||||
|  | ||||
|     for (s = str; *s; ++s) | ||||
|         ; | ||||
|     return (s - str); | ||||
| } | ||||
|  | ||||
| DEF_STRONG(strlen); | ||||
| @@ -0,0 +1,48 @@ | ||||
| /*	$OpenBSD: strncmp.c,v 1.9 2015/08/31 02:53:57 guenther Exp $	*/ | ||||
|  | ||||
| /* | ||||
|  * Copyright (c) 1989 The Regents of the University of California. | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. Neither the name of the University nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| int strncmp(const char *s1, const char *s2, size_t n) | ||||
| { | ||||
|  | ||||
|     if (n == 0) | ||||
|         return (0); | ||||
|     do | ||||
|     { | ||||
|         if (*s1 != *s2++) | ||||
|             return (*(unsigned char *)s1 - *(unsigned char *)--s2); | ||||
|         if (*s1++ == 0) | ||||
|             break; | ||||
|     } while (--n != 0); | ||||
|     return (0); | ||||
| } | ||||
| DEF_STRONG(strncmp); | ||||
| @@ -0,0 +1,49 @@ | ||||
| /*	$OpenBSD: strrchr.c,v 1.4 2018/10/01 06:37:37 martijn Exp $ */ | ||||
| /* | ||||
|  * Copyright (c) 1988 Regents of the University of California. | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. Neither the name of the University nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| __weak_alias(rindex, strrchr); | ||||
|  | ||||
| char * | ||||
| strrchr(const char *p, int ch) | ||||
| { | ||||
|     char *save; | ||||
|  | ||||
|     for (save = NULL;; ++p) | ||||
|     { | ||||
|         if (*p == (char)ch) | ||||
|             save = (char *)p; | ||||
|         if (!*p) | ||||
|             return (save); | ||||
|     } | ||||
|     /* NOTREACHED */ | ||||
| } | ||||
| DEF_STRONG(strrchr); | ||||
		Reference in New Issue
	
	Block a user