From b8a6a989c05c0758b15ab1ec43f0f0fd53d0b67e Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Tue, 6 Jun 2023 03:30:37 -0700 Subject: [PATCH] Create ELF aliases for identical symbols This change greatly reduces the number of modules that need to be compiled. The only issue right now is that sometimes when viewing symbol table entries, the aliased symbol is chosen. --- .github/workflows/build.yml | 2 +- examples/unbourne.c | 10 +-- libc/calls/fadvise.c | 2 + libc/calls/fadvise64.S | 23 ------- libc/calls/fstat.c | 2 + libc/calls/fstat64.S | 23 ------- libc/calls/fstatat.c | 2 + libc/calls/fstatat64.S | 31 --------- libc/calls/ftruncate.c | 2 + libc/calls/ftruncate64.S | 31 --------- libc/calls/lseek.c | 2 + libc/calls/lseek64.S | 23 ------- libc/calls/lstat.c | 2 + libc/calls/lstat64.S | 31 --------- libc/calls/open.c | 2 + libc/calls/open64.S | 22 ------- libc/calls/pread.c | 2 + libc/calls/pread64.S | 23 ------- libc/calls/pwrite.c | 2 + libc/calls/pwrite64.S | 23 ------- libc/calls/stat.c | 2 + libc/calls/stat64.S | 30 --------- libc/elf/elf.h | 2 + libc/fmt/atol.c | 2 + libc/fmt/atoll.c | 31 --------- libc/fmt/div.c | 15 ++++- libc/fmt/i128abs.c | 24 ------- libc/fmt/imaxabs.c | 24 ------- libc/fmt/imaxdiv.c | 32 --------- libc/fmt/itoa.h | 21 ++++++ libc/fmt/ldiv.c | 18 ++++- libc/fmt/leb128.h | 12 ++++ libc/fmt/lldiv.c | 23 ------- libc/fmt/strtoimax.c | 61 ----------------- libc/fmt/strtol.c | 4 ++ libc/fmt/strtoll.c | 38 ----------- libc/fmt/strtoll_l.c | 24 ------- libc/fmt/strtoul.c | 4 ++ libc/fmt/strtoull.c | 38 ----------- libc/fmt/strtoull_l.c | 25 ------- libc/fmt/strtoumax.c | 54 --------------- libc/fmt/wcscoll.c | 25 ------- libc/fmt/wcstoimax.c | 61 ----------------- libc/fmt/wcstol.c | 4 ++ libc/fmt/wcstoll.c | 60 ----------------- libc/fmt/wcstoll_l.c | 25 ------- libc/fmt/wcstoul.c | 4 ++ libc/fmt/wcstoull.c | 54 --------------- libc/fmt/wcstoull_l.c | 25 ------- libc/fmt/wcstoumax.c | 54 --------------- libc/integral/c.inc | 7 +- libc/intrin/aarch64/strchr.S | 2 + libc/intrin/aarch64/strrchr.S | 2 + libc/intrin/abs.c | 8 +-- libc/intrin/bits.h | 5 +- libc/intrin/bsf.c | 21 +----- libc/intrin/bsr.c | 21 +----- libc/{str/explicit_bzero.c => intrin/bswap.c} | 38 +++++++---- libc/intrin/bswap.h | 2 +- libc/intrin/bzero.c | 2 + libc/intrin/exit.c | 2 + libc/intrin/fenv.S | 15 +++++ libc/intrin/ffs.c | 7 +- libc/intrin/gray.c | 28 -------- libc/intrin/hamming.c | 27 -------- libc/intrin/hilbert.h | 4 ++ libc/intrin/kprintf.h | 15 +++++ libc/intrin/likely.h | 2 + libc/intrin/lockxadd.h | 22 ------- libc/intrin/memmove.c | 2 +- libc/intrin/morton.c | 2 +- libc/intrin/morton.h | 18 ++--- libc/intrin/newbie.h | 5 -- libc/intrin/pushpop.h | 2 + libc/intrin/repmovsb.h | 2 + libc/intrin/repstosb.h | 2 + libc/intrin/segmentation.h | 2 + libc/intrin/strchr.c | 2 + libc/intrin/strrchr.c | 2 + libc/intrin/syscall.S | 65 ------------------- libc/intrin/ungray.c | 33 ---------- libc/intrin/unmorton.c | 2 +- libc/intrin/xadd.h | 16 ----- libc/runtime/exit2.c | 34 ---------- libc/sock/sock.h | 8 +-- libc/stdio/append.h | 17 +++-- libc/stdio/fgetc.c | 2 + libc/stdio/fgetc_unlocked.c | 2 + libc/stdio/fgetwc.c | 2 + libc/stdio/fgetwc_unlocked.c | 2 + libc/stdio/fputc.c | 2 + libc/stdio/fputc_unlocked.c | 2 + libc/stdio/fputwc.c | 2 + libc/stdio/fputwc_unlocked.c | 2 + libc/stdio/fseek.c | 36 ---------- libc/stdio/fseeko.c | 2 + libc/stdio/ftell.c | 29 --------- libc/stdio/ftello.c | 2 + libc/stdio/getc.c | 28 -------- libc/stdio/getc_unlocked.c | 27 -------- libc/stdio/getwc.c | 28 -------- libc/stdio/getwc_unlocked.c | 27 -------- libc/stdio/lcg.internal.h | 2 + libc/stdio/putc.c | 30 --------- libc/stdio/putc_unlocked.c | 29 --------- libc/stdio/putwc.c | 29 --------- libc/stdio/rand.h | 7 ++ libc/stdio/xorshift.h | 2 + libc/str/index.c | 31 --------- libc/str/isalnum.c | 2 + libc/str/isalpha.c | 2 + libc/str/isascii.c | 2 + libc/str/isblank.c | 2 + libc/str/iscntrl.c | 2 + libc/str/isdigit.c | 2 + libc/str/isdigit_l.c | 24 ------- libc/str/isgraph.c | 2 + libc/str/islower.c | 2 + libc/str/islower_l.c | 24 ------- libc/str/isprint.c | 2 + libc/str/ispunct.c | 2 + libc/str/isspace.c | 2 + libc/str/isupper.c | 2 + libc/str/isupper_l.c | 24 ------- libc/str/iswalnum.c | 2 + libc/str/iswalpha.c | 2 + libc/str/iswalpha_l.c | 24 ------- libc/str/iswblank.c | 2 + libc/str/iswblank_l.c | 24 ------- libc/str/iswcntrl.c | 2 + libc/str/iswcntrl_l.c | 24 ------- libc/str/iswdigit.c | 2 + libc/str/iswdigit_l.c | 24 ------- libc/str/iswgraph.c | 2 + libc/str/iswlower.c | 2 + libc/str/iswlower_l.c | 24 ------- libc/str/iswprint.c | 2 + libc/str/iswprint_l.c | 24 ------- libc/str/iswpunct.c | 2 + libc/str/iswpunct_l.c | 24 ------- libc/str/iswspace.c | 2 + libc/str/iswspace_l.c | 24 ------- libc/str/iswupper.c | 2 + libc/str/iswupper_l.c | 24 ------- libc/str/iswxdigit.c | 2 + libc/str/iswxdigit_l.c | 24 ------- libc/str/isxdigit.c | 2 + libc/str/isxdigit_l.c | 24 ------- libc/str/rindex.S | 27 -------- libc/str/strcasecmp.c | 2 + libc/str/strcasecmp_l.c | 24 ------- libc/str/strcoll.c | 2 + libc/str/strcoll_l.c | 24 ------- libc/str/strncasecmp.c | 2 + libc/str/strncasecmp_l.c | 24 ------- libc/str/strxfrm.c | 2 + libc/str/strxfrm_l.c | 24 ------- libc/str/toascii.c | 2 + libc/str/tolower.c | 2 + libc/str/tolower_l.c | 24 ------- libc/str/toupper.c | 2 + libc/str/toupper_l.c | 24 ------- libc/str/towlower.c | 2 + libc/str/towlower_l.c | 24 ------- libc/str/towupper.c | 2 + libc/str/towupper_l.c | 24 ------- libc/str/wcscmp.c | 3 + libc/str/wcscoll_l.c | 24 ------- libc/str/wcsxfrm.c | 2 + libc/str/wcsxfrm_l.c | 24 ------- libc/time/struct/tm.h | 9 ++- libc/x/x.h | 39 +++++++++++ libc/x/xbarf.c | 1 + libc/x/xslurp.c | 1 + test/libc/fmt/lengthuint64_test.c | 8 +-- third_party/make/ar.c | 2 +- third_party/make/dep.h | 3 +- third_party/make/dir.c | 3 +- third_party/make/expand.c | 1 + third_party/make/file.c | 2 +- third_party/make/hash.c | 3 +- third_party/make/job.c | 2 +- third_party/make/makeint.inc | 3 - third_party/make/read.c | 2 +- third_party/make/variable.c | 4 +- third_party/sed/compile.c | 2 +- third_party/sed/extern.h | 2 +- third_party/zip/osdep.h | 1 - third_party/zip/unix.c | 1 - tool/build/calculator.c | 13 ++++ tool/emacs/cosmo-asm-mode.el | 1 + 191 files changed, 414 insertions(+), 2190 deletions(-) delete mode 100644 libc/calls/fadvise64.S delete mode 100644 libc/calls/fstat64.S delete mode 100644 libc/calls/fstatat64.S delete mode 100644 libc/calls/ftruncate64.S delete mode 100644 libc/calls/lseek64.S delete mode 100644 libc/calls/lstat64.S delete mode 100644 libc/calls/open64.S delete mode 100644 libc/calls/pread64.S delete mode 100644 libc/calls/pwrite64.S delete mode 100644 libc/calls/stat64.S delete mode 100644 libc/fmt/atoll.c delete mode 100644 libc/fmt/i128abs.c delete mode 100644 libc/fmt/imaxabs.c delete mode 100644 libc/fmt/imaxdiv.c delete mode 100644 libc/fmt/lldiv.c delete mode 100644 libc/fmt/strtoimax.c delete mode 100644 libc/fmt/strtoll.c delete mode 100644 libc/fmt/strtoll_l.c delete mode 100644 libc/fmt/strtoull.c delete mode 100644 libc/fmt/strtoull_l.c delete mode 100644 libc/fmt/strtoumax.c delete mode 100644 libc/fmt/wcscoll.c delete mode 100644 libc/fmt/wcstoimax.c delete mode 100644 libc/fmt/wcstoll.c delete mode 100644 libc/fmt/wcstoll_l.c delete mode 100644 libc/fmt/wcstoull.c delete mode 100644 libc/fmt/wcstoull_l.c delete mode 100644 libc/fmt/wcstoumax.c rename libc/{str/explicit_bzero.c => intrin/bswap.c} (67%) delete mode 100644 libc/intrin/gray.c delete mode 100644 libc/intrin/hamming.c delete mode 100644 libc/intrin/lockxadd.h delete mode 100644 libc/intrin/syscall.S delete mode 100644 libc/intrin/ungray.c delete mode 100644 libc/intrin/xadd.h delete mode 100644 libc/runtime/exit2.c delete mode 100644 libc/stdio/fseek.c delete mode 100644 libc/stdio/ftell.c delete mode 100644 libc/stdio/getc.c delete mode 100644 libc/stdio/getc_unlocked.c delete mode 100644 libc/stdio/getwc.c delete mode 100644 libc/stdio/getwc_unlocked.c delete mode 100644 libc/stdio/putc.c delete mode 100644 libc/stdio/putc_unlocked.c delete mode 100644 libc/stdio/putwc.c delete mode 100644 libc/str/index.c delete mode 100644 libc/str/isdigit_l.c delete mode 100644 libc/str/islower_l.c delete mode 100644 libc/str/isupper_l.c delete mode 100644 libc/str/iswalpha_l.c delete mode 100644 libc/str/iswblank_l.c delete mode 100644 libc/str/iswcntrl_l.c delete mode 100644 libc/str/iswdigit_l.c delete mode 100644 libc/str/iswlower_l.c delete mode 100644 libc/str/iswprint_l.c delete mode 100644 libc/str/iswpunct_l.c delete mode 100644 libc/str/iswspace_l.c delete mode 100644 libc/str/iswupper_l.c delete mode 100644 libc/str/iswxdigit_l.c delete mode 100644 libc/str/isxdigit_l.c delete mode 100644 libc/str/rindex.S delete mode 100644 libc/str/strcasecmp_l.c delete mode 100644 libc/str/strcoll_l.c delete mode 100644 libc/str/strncasecmp_l.c delete mode 100644 libc/str/strxfrm_l.c delete mode 100644 libc/str/tolower_l.c delete mode 100644 libc/str/toupper_l.c delete mode 100644 libc/str/towlower_l.c delete mode 100644 libc/str/towupper_l.c delete mode 100644 libc/str/wcscoll_l.c delete mode 100644 libc/str/wcsxfrm_l.c diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0f663b93f..908e74a8a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - mode: ["", tiny, rel, aarch64] + mode: ["", tiny, rel] steps: - uses: actions/checkout@v3 diff --git a/examples/unbourne.c b/examples/unbourne.c index ef1f576e5..d1850c14e 100644 --- a/examples/unbourne.c +++ b/examples/unbourne.c @@ -1744,14 +1744,14 @@ static char *sstrdup(const char *p) { return memcpy(stalloc(len), p, len); } -int xwrite(int, const void *, uint64_t); +int __xwrite(int, const void *, uint64_t); static void flushout(struct output *dest) { unsigned len; len = dest->nextc - dest->buf; if (!len || dest->fd < 0) return; dest->nextc = dest->buf; - if ((xwrite(dest->fd, dest->buf, len))) dest->flags |= OUTPUT_ERR; + if ((__xwrite(dest->fd, dest->buf, len))) dest->flags |= OUTPUT_ERR; } static void flushall(void) { @@ -1817,7 +1817,7 @@ static void outmem(const char *p, unsigned len, struct output *dest) { } nleft = dest->end - dest->nextc; if (nleft > len) goto buffered; - if ((xwrite(dest->fd, p, len))) { + if ((__xwrite(dest->fd, p, len))) { dest->flags |= OUTPUT_ERR; } } @@ -9179,7 +9179,7 @@ static int64_t openhere(union node *redir) { } len = strlen(p); if (len <= PIPESIZE) { - xwrite(pip[1], p, len); + __xwrite(pip[1], p, len); goto out; } if (forkshell((struct job *)NULL, (union node *)NULL, FORK_NOJOB) == 0) { @@ -9188,7 +9188,7 @@ static int64_t openhere(union node *redir) { signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_DFL); - xwrite(pip[1], p, len); + __xwrite(pip[1], p, len); _exit(0); } out: diff --git a/libc/calls/fadvise.c b/libc/calls/fadvise.c index 265fa103c..2c89cb1ae 100644 --- a/libc/calls/fadvise.c +++ b/libc/calls/fadvise.c @@ -65,3 +65,5 @@ int fadvise(int fd, uint64_t offset, uint64_t len, int advice) { STRACE("fadvise(%d, %'lu, %'lu, %d) → %d% m", fd, offset, len, advice, rc); return rc; } + +__strong_reference(fadvise, fadvise64); diff --git a/libc/calls/fadvise64.S b/libc/calls/fadvise64.S deleted file mode 100644 index 317fdd306..000000000 --- a/libc/calls/fadvise64.S +++ /dev/null @@ -1,23 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" - -fadvise64: - jmp fadvise - .endfn fadvise64,globl diff --git a/libc/calls/fstat.c b/libc/calls/fstat.c index f5773f2ad..ed36fa6b9 100644 --- a/libc/calls/fstat.c +++ b/libc/calls/fstat.c @@ -53,3 +53,5 @@ int fstat(int fd, struct stat *st) { STRACE("fstat(%d, [%s]) → %d% m", fd, DescribeStat(rc, st), rc); return rc; } + +__strong_reference(fstat, fstat64); diff --git a/libc/calls/fstat64.S b/libc/calls/fstat64.S deleted file mode 100644 index f85a9b6c1..000000000 --- a/libc/calls/fstat64.S +++ /dev/null @@ -1,23 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" - -fstat64: - jmp fstat - .endfn fstat64,globl diff --git a/libc/calls/fstatat.c b/libc/calls/fstatat.c index 848fc8c45..be8cb1f03 100644 --- a/libc/calls/fstatat.c +++ b/libc/calls/fstatat.c @@ -75,3 +75,5 @@ int fstatat(int dirfd, const char *path, struct stat *st, int flags) { DescribeStat(rc, st), __strace_fstatat_flags(alloca(12), flags), rc); return rc; } + +__strong_reference(fstatat, fstatat64); diff --git a/libc/calls/fstatat64.S b/libc/calls/fstatat64.S deleted file mode 100644 index 8b0c3e5f8..000000000 --- a/libc/calls/fstatat64.S +++ /dev/null @@ -1,31 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ This is free and unencumbered software released into the public domain. │ -│ │ -│ Anyone is free to copy, modify, publish, use, compile, sell, or │ -│ distribute this software, either in source code form or as a compiled │ -│ binary, for any purpose, commercial or non-commercial, and by any │ -│ means. │ -│ │ -│ In jurisdictions that recognize copyright laws, the author or authors │ -│ of this software dedicate any and all copyright interest in the │ -│ software to the public domain. We make this dedication for the benefit │ -│ of the public at large and to the detriment of our heirs and │ -│ successors. We intend this dedication to be an overt act of │ -│ relinquishment in perpetuity of all present and future rights to this │ -│ software under copyright law. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ -│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ -│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ -│ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR │ -│ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ -│ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR │ -│ OTHER DEALINGS IN THE SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" - -fstatat64: - jmp fstatat - .endfn fstatat64,globl diff --git a/libc/calls/ftruncate.c b/libc/calls/ftruncate.c index a1aa9e86a..a8cb392fa 100644 --- a/libc/calls/ftruncate.c +++ b/libc/calls/ftruncate.c @@ -87,3 +87,5 @@ int ftruncate(int fd, int64_t length) { STRACE("ftruncate(%d, %'ld) → %d% m", fd, length, rc); return rc; } + +__strong_reference(ftruncate, ftruncate64); diff --git a/libc/calls/ftruncate64.S b/libc/calls/ftruncate64.S deleted file mode 100644 index a4a2a5080..000000000 --- a/libc/calls/ftruncate64.S +++ /dev/null @@ -1,31 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ This is free and unencumbered software released into the public domain. │ -│ │ -│ Anyone is free to copy, modify, publish, use, compile, sell, or │ -│ distribute this software, either in source code form or as a compiled │ -│ binary, for any purpose, commercial or non-commercial, and by any │ -│ means. │ -│ │ -│ In jurisdictions that recognize copyright laws, the author or authors │ -│ of this software dedicate any and all copyright interest in the │ -│ software to the public domain. We make this dedication for the benefit │ -│ of the public at large and to the detriment of our heirs and │ -│ successors. We intend this dedication to be an overt act of │ -│ relinquishment in perpetuity of all present and future rights to this │ -│ software under copyright law. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ -│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ -│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ -│ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR │ -│ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ -│ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR │ -│ OTHER DEALINGS IN THE SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" - -ftruncate64: - jmp ftruncate - .endfn ftruncate64,globl diff --git a/libc/calls/lseek.c b/libc/calls/lseek.c index 19d4fda31..ca6bbffa5 100644 --- a/libc/calls/lseek.c +++ b/libc/calls/lseek.c @@ -90,3 +90,5 @@ int64_t lseek(int fd, int64_t offset, int whence) { rc); return rc; } + +__strong_reference(lseek, lseek64); diff --git a/libc/calls/lseek64.S b/libc/calls/lseek64.S deleted file mode 100644 index e6b61d743..000000000 --- a/libc/calls/lseek64.S +++ /dev/null @@ -1,23 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" - -lseek64: - jmp lseek - .endfn lseek64,globl diff --git a/libc/calls/lstat.c b/libc/calls/lstat.c index cb2aa1a98..6d4ab1163 100644 --- a/libc/calls/lstat.c +++ b/libc/calls/lstat.c @@ -26,3 +26,5 @@ int lstat(const char *pathname, struct stat *st) { return fstatat(AT_FDCWD, pathname, st, AT_SYMLINK_NOFOLLOW); } + +__strong_reference(lstat, lstat64); diff --git a/libc/calls/lstat64.S b/libc/calls/lstat64.S deleted file mode 100644 index 7cfe4b329..000000000 --- a/libc/calls/lstat64.S +++ /dev/null @@ -1,31 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ This is free and unencumbered software released into the public domain. │ -│ │ -│ Anyone is free to copy, modify, publish, use, compile, sell, or │ -│ distribute this software, either in source code form or as a compiled │ -│ binary, for any purpose, commercial or non-commercial, and by any │ -│ means. │ -│ │ -│ In jurisdictions that recognize copyright laws, the author or authors │ -│ of this software dedicate any and all copyright interest in the │ -│ software to the public domain. We make this dedication for the benefit │ -│ of the public at large and to the detriment of our heirs and │ -│ successors. We intend this dedication to be an overt act of │ -│ relinquishment in perpetuity of all present and future rights to this │ -│ software under copyright law. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ -│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ -│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ -│ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR │ -│ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ -│ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR │ -│ OTHER DEALINGS IN THE SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" - -lstat64: - jmp lstat - .endfn lstat64,globl diff --git a/libc/calls/open.c b/libc/calls/open.c index 9ac2b3986..98889d3ab 100644 --- a/libc/calls/open.c +++ b/libc/calls/open.c @@ -43,3 +43,5 @@ int open(const char *file, int flags, ...) { va_end(va); return openat(AT_FDCWD, file, flags, mode); } + +__strong_reference(open, open64); diff --git a/libc/calls/open64.S b/libc/calls/open64.S deleted file mode 100644 index f6fe23521..000000000 --- a/libc/calls/open64.S +++ /dev/null @@ -1,22 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" - -open64: jmp open - .endfn open64,globl diff --git a/libc/calls/pread.c b/libc/calls/pread.c index 1bdf10459..b114b272e 100644 --- a/libc/calls/pread.c +++ b/libc/calls/pread.c @@ -83,3 +83,5 @@ ssize_t pread(int fd, void *buf, size_t size, int64_t offset) { MAX(0, MIN(40, rc)), buf, rc > 40 ? "..." : "", size, offset, rc); return rc; } + +__strong_reference(pread, pread64); diff --git a/libc/calls/pread64.S b/libc/calls/pread64.S deleted file mode 100644 index 25682b540..000000000 --- a/libc/calls/pread64.S +++ /dev/null @@ -1,23 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" - -pread64: - jmp pread - .endfn pread64,globl diff --git a/libc/calls/pwrite.c b/libc/calls/pwrite.c index 425a2bdb8..022a4b29d 100644 --- a/libc/calls/pwrite.c +++ b/libc/calls/pwrite.c @@ -80,3 +80,5 @@ ssize_t pwrite(int fd, const void *buf, size_t size, int64_t offset) { MAX(0, MIN(40, rc)), buf, rc > 40 ? "..." : "", size, offset, rc); return rc; } + +__strong_reference(pwrite, pwrite64); diff --git a/libc/calls/pwrite64.S b/libc/calls/pwrite64.S deleted file mode 100644 index 389b984e3..000000000 --- a/libc/calls/pwrite64.S +++ /dev/null @@ -1,23 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" - -pwrite64: - jmp pwrite - .endfn pwrite64,globl diff --git a/libc/calls/stat.c b/libc/calls/stat.c index 4827c7039..dcd741ca4 100644 --- a/libc/calls/stat.c +++ b/libc/calls/stat.c @@ -38,3 +38,5 @@ int stat(const char *path, struct stat *st) { return fstatat(AT_FDCWD, path, st, 0); } + +__strong_reference(stat, stat64); diff --git a/libc/calls/stat64.S b/libc/calls/stat64.S deleted file mode 100644 index e61b7bb04..000000000 --- a/libc/calls/stat64.S +++ /dev/null @@ -1,30 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ This is free and unencumbered software released into the public domain. │ -│ │ -│ Anyone is free to copy, modify, publish, use, compile, sell, or │ -│ distribute this software, either in source code form or as a compiled │ -│ binary, for any purpose, commercial or non-commercial, and by any │ -│ means. │ -│ │ -│ In jurisdictions that recognize copyright laws, the author or authors │ -│ of this software dedicate any and all copyright interest in the │ -│ software to the public domain. We make this dedication for the benefit │ -│ of the public at large and to the detriment of our heirs and │ -│ successors. We intend this dedication to be an overt act of │ -│ relinquishment in perpetuity of all present and future rights to this │ -│ software under copyright law. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ -│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ -│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ -│ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR │ -│ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ -│ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR │ -│ OTHER DEALINGS IN THE SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" - -stat64: jmp stat - .endfn stat64,globl diff --git a/libc/elf/elf.h b/libc/elf/elf.h index 9df8827ac..9669d2a46 100644 --- a/libc/elf/elf.h +++ b/libc/elf/elf.h @@ -7,6 +7,7 @@ #include "libc/runtime/ezmap.internal.h" #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ +#ifdef COSMO /*───────────────────────────────────────────────────────────────────────────│─╗ │ cosmopolitan § executable & linkable format ─╬─│┼ @@ -29,6 +30,7 @@ const char *GetElfSectionName(const Elf64_Ehdr *, size_t, Elf64_Shdr *); Elf64_Sym *GetElfDynSymbolTable(const Elf64_Ehdr *, size_t, Elf64_Xword *); char *GetElfDynStringTable(const Elf64_Ehdr *, size_t); +#endif /* COSMO */ COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_ELF_H_ */ diff --git a/libc/fmt/atol.c b/libc/fmt/atol.c index da13f1484..756cc3620 100644 --- a/libc/fmt/atol.c +++ b/libc/fmt/atol.c @@ -48,3 +48,5 @@ long atol(const char *s) { } return x; } + +__weak_reference(atol, atoll); diff --git a/libc/fmt/atoll.c b/libc/fmt/atoll.c deleted file mode 100644 index 11b25e768..000000000 --- a/libc/fmt/atoll.c +++ /dev/null @@ -1,31 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/fmt/conv.h" -#include "libc/limits.h" - -/** - * Decodes decimal number from ASCII string. - * - * @param s is a non-null nul-terminated string - * @return the decoded signed saturated integer - */ -long long atoll(const char *s) { - _Static_assert(LONG_MAX == LONG_LONG_MAX, "need atoll impl"); - return atol(s); -} diff --git a/libc/fmt/div.c b/libc/fmt/div.c index 4d36dfeee..53e32d70e 100644 --- a/libc/fmt/div.c +++ b/libc/fmt/div.c @@ -18,6 +18,19 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/fmt/conv.h" +/** + * Divides integers yielding numerator and denominator. + */ div_t(div)(int num, int den) { - return div(num, den); + div_t retval; + retval.quot = num / den; + retval.rem = num % den; +#if __STDC_VERSION__ + 0 < 199901L + // satisfy quot*denominator+rem == numerator + if (n > 0 && retval.rem < 0) { + retval.quot += 1; + retval.rem -= d; + } +#endif + return retval; } diff --git a/libc/fmt/i128abs.c b/libc/fmt/i128abs.c deleted file mode 100644 index c35be4f75..000000000 --- a/libc/fmt/i128abs.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/fmt/conv.h" -#include "libc/macros.internal.h" - -int128_t i128abs(int128_t x) { - return ABS(x); -} diff --git a/libc/fmt/imaxabs.c b/libc/fmt/imaxabs.c deleted file mode 100644 index 11a640d9f..000000000 --- a/libc/fmt/imaxabs.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/fmt/conv.h" -#include "libc/macros.internal.h" - -intmax_t imaxabs(intmax_t x) { - return ABS(x); -} diff --git a/libc/fmt/imaxdiv.c b/libc/fmt/imaxdiv.c deleted file mode 100644 index 4268a0813..000000000 --- a/libc/fmt/imaxdiv.c +++ /dev/null @@ -1,32 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/fmt/conv.h" - -imaxdiv_t imaxdiv(intmax_t n, intmax_t d) { - imaxdiv_t retval; - - retval.quot = n / d; - retval.rem = n % d; - // satisfy quot*denominator+rem == numerator - if (n > 0 && retval.rem < 0) { - retval.quot += 1; - retval.rem -= d; - } - return (retval); -} diff --git a/libc/fmt/itoa.h b/libc/fmt/itoa.h index a492328d1..e547a11e3 100644 --- a/libc/fmt/itoa.h +++ b/libc/fmt/itoa.h @@ -2,6 +2,26 @@ #define COSMOPOLITAN_LIBC_FMT_ITOA_H_ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ +#ifdef COSMO + +#define LengthInt64 __LengthInt64 +#define LengthUint64 __LengthUint64 +#define LengthInt64Thousands __LengthInt64Thousands +#define LengthUint64Thousands __LengthUint64Thousands +#define FormatInt32 __FormatInt32 +#define FormatUint32 __FormatUint32 +#define FormatInt64 __FormatInt64 +#define FormatUint64 __FormatUint64 +#define FormatInt64Thousands __FormatInt64Thousands +#define FormatUint64Thousands __FormatUint64Thousands +#define FormatOctal32 __FormatOctal32 +#define FormatOctal64 __FormatOctal64 +#define FormatBinary64 __FormatBinary64 +#define FormatHex64 __FormatHex64 +#define FormatFlex64 __FormatFlex64 +#define uint64toarray_radix16 __uint64toarray_radix16 +#define uint64toarray_fixed16 __uint64toarray_fixed16 +#define uint64toarray_radix8 __uint64toarray_radix8 unsigned LengthInt64(int64_t) pureconst; unsigned LengthUint64(uint64_t) pureconst; @@ -27,6 +47,7 @@ size_t int128toarray_radix10(int128_t, char *); size_t uint128toarray_radix10(uint128_t, char *); #endif +#endif /* COSMO */ COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_FMT_ITOA_H_ */ diff --git a/libc/fmt/ldiv.c b/libc/fmt/ldiv.c index 5068a4572..4e21ceee4 100644 --- a/libc/fmt/ldiv.c +++ b/libc/fmt/ldiv.c @@ -18,6 +18,22 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/fmt/conv.h" +/** + * Divides integers yielding numerator and denominator. + */ ldiv_t(ldiv)(long num, long den) { - return ldiv(num, den); + ldiv_t retval; + retval.quot = num / den; + retval.rem = num % den; +#if __STDC_VERSION__ + 0 < 199901L + // satisfy quot*denominator+rem == numerator + if (n > 0 && retval.rem < 0) { + retval.quot += 1; + retval.rem -= d; + } +#endif + return retval; } + +__weak_reference(ldiv, lldiv); +__weak_reference(ldiv, imaxdiv); diff --git a/libc/fmt/leb128.h b/libc/fmt/leb128.h index a16f2e960..d74d1aefb 100644 --- a/libc/fmt/leb128.h +++ b/libc/fmt/leb128.h @@ -2,6 +2,17 @@ #define COSMOPOLITAN_LIBC_FMT_LEB128_H_ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ +#ifdef COSMO + +#define sleb64 __sleb64 +#define zleb64 __zleb64 +#define uleb64 __uleb64 +#define unzleb64 __unzleb64 +#define unuleb64 __unuleb64 +#define sleb128 __sleb128 +#define zleb128 __zleb128 +#define uleb128 __uleb128 +#define unsleb128 __unsleb128 char *sleb64(char *, int64_t); char *zleb64(char[hasatleast 10], int64_t); @@ -16,6 +27,7 @@ char *uleb128(char *, uint128_t); int unsleb128(const void *, size_t, int128_t *); #endif /* __STRICT_ANSI__ */ +#endif /* COSMO */ COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_FMT_LEB128_H_ */ diff --git a/libc/fmt/lldiv.c b/libc/fmt/lldiv.c deleted file mode 100644 index fe844f7b9..000000000 --- a/libc/fmt/lldiv.c +++ /dev/null @@ -1,23 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/fmt/conv.h" - -lldiv_t(lldiv)(long long num, long long den) { - return lldiv(num, den); -} diff --git a/libc/fmt/strtoimax.c b/libc/fmt/strtoimax.c deleted file mode 100644 index d91291ed0..000000000 --- a/libc/fmt/strtoimax.c +++ /dev/null @@ -1,61 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/errno.h" -#include "libc/fmt/conv.h" -#include "libc/fmt/strtol.internal.h" -#include "libc/limits.h" -#include "libc/str/str.h" -#include "libc/str/tab.internal.h" - -/** - * Decodes intmax_t from ASCII string. - * - * @param s is a non-null nul-terminated string - * @param endptr if non-null will always receive a pointer to the char - * following the last one this function processed, which is usually - * the NUL byte, or in the case of invalid strings, would point to - * the first invalid character - * @param base can be anywhere between [2,36] or 0 to auto-detect based - * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or - * decimal (base 10) by default - * @return decoded saturated integer - * @see strtoumax() - */ -intmax_t strtoimax(const char *s, char **endptr, int base) { - char t = 0; - int d, c = *s; - intmax_t x = 0; - CONSUME_SPACES(s, c); - GET_SIGN(s, c, d); - GET_RADIX(s, c, base); - if ((c = kBase36[c & 255]) && --c < base) { - if (!((t |= 1) & 2)) { - do { - if (__builtin_mul_overflow(x, base, &x) || - __builtin_add_overflow(x, c * d, &x)) { - x = d > 0 ? INTMAX_MAX : INTMAX_MIN; - errno = ERANGE; - t |= 2; - } - } while ((c = kBase36[*++s & 255]) && --c < base); - } - } - if (t && endptr) *endptr = s; - return x; -} diff --git a/libc/fmt/strtol.c b/libc/fmt/strtol.c index b37720662..f1bb38f69 100644 --- a/libc/fmt/strtol.c +++ b/libc/fmt/strtol.c @@ -70,3 +70,7 @@ long strtol(const char *s, char **endptr, int base) { if (t && endptr) *endptr = s; return x; } + +__weak_reference(strtol, strtoimax); +__weak_reference(strtol, strtoll); +__weak_reference(strtol, strtoll_l); diff --git a/libc/fmt/strtoll.c b/libc/fmt/strtoll.c deleted file mode 100644 index 17d04d1cf..000000000 --- a/libc/fmt/strtoll.c +++ /dev/null @@ -1,38 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/fmt/conv.h" -#include "libc/limits.h" - -/** - * Decodes signed integer from ASCII string. - * - * @param s is a non-null nul-terminated string - * @param endptr if non-null will always receive a pointer to the char - * following the last one this function processed, which is usually - * the NUL byte, or in the case of invalid strings, would point to - * the first invalid character - * @param base can be anywhere between [2,36] or 0 to auto-detect based - * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or - * decimal (base 10) by default - * @return decoded signed saturated integer - */ -long long strtoll(const char *s, char **endptr, int base) { - _Static_assert(LONG_MAX == LONG_LONG_MAX, "need strtoll impl"); - return strtol(s, endptr, base); -} diff --git a/libc/fmt/strtoll_l.c b/libc/fmt/strtoll_l.c deleted file mode 100644 index 377bf4cc8..000000000 --- a/libc/fmt/strtoll_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/fmt/conv.h" -#include "libc/str/locale.h" - -long long strtoll_l(const char *nptr, char **endptr, int base, locale_t l) { - return strtoll(nptr, endptr, base); -} diff --git a/libc/fmt/strtoul.c b/libc/fmt/strtoul.c index dc3945a03..ef049fa1e 100644 --- a/libc/fmt/strtoul.c +++ b/libc/fmt/strtoul.c @@ -58,3 +58,7 @@ unsigned long strtoul(const char *s, char **endptr, int base) { if (t && endptr) *endptr = s; return d > 0 ? x : -x; } + +__weak_reference(strtoul, strtoumax); +__weak_reference(strtoul, strtoull); +__weak_reference(strtoul, strtoull_l); diff --git a/libc/fmt/strtoull.c b/libc/fmt/strtoull.c deleted file mode 100644 index 4d2721e89..000000000 --- a/libc/fmt/strtoull.c +++ /dev/null @@ -1,38 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/fmt/conv.h" -#include "libc/limits.h" - -/** - * Decodes unsigned integer from ASCII string. - * - * @param s is a non-null nul-terminated string - * @param endptr if non-null will always receive a pointer to the char - * following the last one this function processed, which is usually - * the NUL byte, or in the case of invalid strings, would point to - * the first invalid character - * @param base can be anywhere between [2,36] or 0 to auto-detect based - * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or - * decimal (base 10) by default - * @return decoded integer mod 2⁶⁴ negated if leading `-` - */ -unsigned long long strtoull(const char *s, char **endptr, int base) { - _Static_assert(LONG_MAX == LONG_LONG_MAX, "need strtoull impl"); - return strtoul(s, endptr, base); -} diff --git a/libc/fmt/strtoull_l.c b/libc/fmt/strtoull_l.c deleted file mode 100644 index 4f526865b..000000000 --- a/libc/fmt/strtoull_l.c +++ /dev/null @@ -1,25 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/fmt/conv.h" -#include "libc/str/locale.h" - -unsigned long long strtoull_l(const char *nptr, char **endptr, int base, - locale_t l) { - return strtoull(nptr, endptr, base); -} diff --git a/libc/fmt/strtoumax.c b/libc/fmt/strtoumax.c deleted file mode 100644 index c1f41910c..000000000 --- a/libc/fmt/strtoumax.c +++ /dev/null @@ -1,54 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/fmt/conv.h" -#include "libc/fmt/strtol.internal.h" -#include "libc/str/str.h" -#include "libc/str/tab.internal.h" - -/** - * Decodes uintmax_t from ASCII string. - * - * @param s is a non-null nul-terminated string - * @param endptr if non-null will always receive a pointer to the char - * following the last one this function processed, which is usually - * the NUL byte, or in the case of invalid strings, would point to - * the first invalid character - * @param base can be anywhere between [2,36] or 0 to auto-detect based - * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or - * decimal (base 10) by default - * @return decoded integer mod 2¹²⁸ negated if leading `-` - * @see strtoimax() - */ -uintmax_t strtoumax(const char *s, char **endptr, int base) { - char t = 0; - int d, c = *s; - uintmax_t x = 0; - CONSUME_SPACES(s, c); - GET_SIGN(s, c, d); - GET_RADIX(s, c, base); - if ((c = kBase36[c & 255]) && --c < base) { - t |= 1; - do { - x *= base; - x += c; - } while ((c = kBase36[*++s & 255]) && --c < base); - } - if (t && endptr) *endptr = s; - return d > 0 ? x : -x; -} diff --git a/libc/fmt/wcscoll.c b/libc/fmt/wcscoll.c deleted file mode 100644 index efef6a1e0..000000000 --- a/libc/fmt/wcscoll.c +++ /dev/null @@ -1,25 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" -#include "libc/thread/tls.h" - -int wcscoll(const wchar_t *p, const wchar_t *q) { - return wcscoll_l(p, q, (locale_t)__get_tls()->tib_locale); -} diff --git a/libc/fmt/wcstoimax.c b/libc/fmt/wcstoimax.c deleted file mode 100644 index 10bf752a1..000000000 --- a/libc/fmt/wcstoimax.c +++ /dev/null @@ -1,61 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/errno.h" -#include "libc/fmt/conv.h" -#include "libc/fmt/strtol.internal.h" -#include "libc/limits.h" -#include "libc/str/str.h" -#include "libc/str/tab.internal.h" - -/** - * Decodes intmax_t from wide string. - * - * @param s is a non-null nul-terminated string - * @param endptr if non-null will always receive a pointer to the char - * following the last one this function processed, which is usually - * the NUL byte, or in the case of invalid strings, would point to - * the first invalid character - * @param base can be anywhere between [2,36] or 0 to auto-detect based - * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or - * decimal (base 10) by default - * @return decoded saturated integer - * @see strtoumax() - */ -intmax_t wcstoimax(const wchar_t *s, wchar_t **endptr, int base) { - char t = 0; - intmax_t x = 0; - int d, c = *s; - CONSUME_SPACES(s, c); - GET_SIGN(s, c, d); - GET_RADIX(s, c, base); - if ((c = kBase36[c & 255]) && --c < base) { - if (!((t |= 1) & 2)) { - do { - if (__builtin_mul_overflow(x, base, &x) || - __builtin_add_overflow(x, c * d, &x)) { - x = d > 0 ? INTMAX_MAX : INTMAX_MIN; - errno = ERANGE; - t |= 2; - } - } while ((c = kBase36[*++s & 255]) && --c < base); - } - } - if (t && endptr) *endptr = s; - return x; -} diff --git a/libc/fmt/wcstol.c b/libc/fmt/wcstol.c index 28562afb4..c7e8b335a 100644 --- a/libc/fmt/wcstol.c +++ b/libc/fmt/wcstol.c @@ -58,3 +58,7 @@ long wcstol(const wchar_t *s, wchar_t **endptr, int base) { if (t && endptr) *endptr = s; return x; } + +__weak_reference(wcstol, wcstoimax); +__weak_reference(wcstol, wcstoll); +__weak_reference(wcstol, wcstoll_l); diff --git a/libc/fmt/wcstoll.c b/libc/fmt/wcstoll.c deleted file mode 100644 index 6851237ed..000000000 --- a/libc/fmt/wcstoll.c +++ /dev/null @@ -1,60 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/errno.h" -#include "libc/fmt/conv.h" -#include "libc/fmt/strtol.internal.h" -#include "libc/limits.h" -#include "libc/str/str.h" -#include "libc/str/tab.internal.h" - -/** - * Decodes signed long long integer from wide string. - * - * @param s is a non-null nul-terminated string - * @param endptr if non-null will always receive a pointer to the char - * following the last one this function processed, which is usually - * the NUL byte, or in the case of invalid strings, would point to - * the first invalid character - * @param base can be anywhere between [2,36] or 0 to auto-detect based - * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or - * decimal (base 10) by default - * @return the decoded signed saturated number - */ -long long wcstoll(const wchar_t *s, wchar_t **endptr, int base) { - char t = 0; - int d, c = *s; - long long x = 0; - CONSUME_SPACES(s, c); - GET_SIGN(s, c, d); - GET_RADIX(s, c, base); - if ((c = kBase36[c & 255]) && --c < base) { - if (!((t |= 1) & 2)) { - do { - if (__builtin_mul_overflow(x, base, &x) || - __builtin_add_overflow(x, c * d, &x)) { - x = d > 0 ? LONG_LONG_MAX : LONG_LONG_MIN; - errno = ERANGE; - t |= 2; - } - } while ((c = kBase36[*++s & 255]) && --c < base); - } - } - if (t && endptr) *endptr = s; - return x; -} diff --git a/libc/fmt/wcstoll_l.c b/libc/fmt/wcstoll_l.c deleted file mode 100644 index 6cd67cea8..000000000 --- a/libc/fmt/wcstoll_l.c +++ /dev/null @@ -1,25 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/fmt/conv.h" -#include "libc/str/locale.h" - -long long wcstoll_l(const wchar_t *nptr, wchar_t **endptr, int base, - locale_t l) { - return wcstoll(nptr, endptr, base); -} diff --git a/libc/fmt/wcstoul.c b/libc/fmt/wcstoul.c index 192bc28c3..14f6d124a 100644 --- a/libc/fmt/wcstoul.c +++ b/libc/fmt/wcstoul.c @@ -57,3 +57,7 @@ unsigned long wcstoul(const wchar_t *s, wchar_t **endptr, int base) { if (t && endptr) *endptr = s; return d > 0 ? x : -x; } + +__weak_reference(wcstoul, wcstoumax); +__weak_reference(wcstoul, wcstoull); +__weak_reference(wcstoul, wcstoull_l); diff --git a/libc/fmt/wcstoull.c b/libc/fmt/wcstoull.c deleted file mode 100644 index 73739c6ca..000000000 --- a/libc/fmt/wcstoull.c +++ /dev/null @@ -1,54 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/errno.h" -#include "libc/fmt/conv.h" -#include "libc/fmt/strtol.internal.h" -#include "libc/str/str.h" -#include "libc/str/tab.internal.h" - -/** - * Decodes unsigned long long integer from wide string. - * - * @param s is a non-null nul-terminated string - * @param endptr if non-null will always receive a pointer to the char - * following the last one this function processed, which is usually - * the NUL byte, or in the case of invalid strings, would point to - * the first invalid character - * @param base can be anywhere between [2,36] or 0 to auto-detect based - * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or - * decimal (base 10) by default - * @return decoded integer mod 2⁶⁴ negated if leading `-` - */ -unsigned long long wcstoull(const wchar_t *s, wchar_t **endptr, int base) { - char t = 0; - int d, c = *s; - unsigned long long x = 0; - CONSUME_SPACES(s, c); - GET_SIGN(s, c, d); - GET_RADIX(s, c, base); - if ((c = kBase36[c & 255]) && --c < base) { - t |= 1; - do { - x *= base; - x += c; - } while ((c = kBase36[*++s & 255]) && --c < base); - } - if (t && endptr) *endptr = s; - return d > 0 ? x : -x; -} diff --git a/libc/fmt/wcstoull_l.c b/libc/fmt/wcstoull_l.c deleted file mode 100644 index e6003b8e0..000000000 --- a/libc/fmt/wcstoull_l.c +++ /dev/null @@ -1,25 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/fmt/conv.h" -#include "libc/str/locale.h" - -unsigned long long wcstoull_l(const wchar_t *nptr, wchar_t **endptr, int base, - locale_t l) { - return wcstoull(nptr, endptr, base); -} diff --git a/libc/fmt/wcstoumax.c b/libc/fmt/wcstoumax.c deleted file mode 100644 index 8fc617813..000000000 --- a/libc/fmt/wcstoumax.c +++ /dev/null @@ -1,54 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/fmt/conv.h" -#include "libc/fmt/strtol.internal.h" -#include "libc/str/str.h" -#include "libc/str/tab.internal.h" - -/** - * Decodes uintmax_t from wide string. - * - * @param s is a non-null nul-terminated string - * @param endptr if non-null will always receive a pointer to the char - * following the last one this function processed, which is usually - * the NUL byte, or in the case of invalid strings, would point to - * the first invalid character - * @param base can be anywhere between [2,36] or 0 to auto-detect based - * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or - * decimal (base 10) by default - * @return decoded integer mod 2¹²⁸ negated if leading `-` - * @see strtoimax() - */ -uintmax_t wcstoumax(const wchar_t *s, wchar_t **endptr, int base) { - char t = 0; - int d, c = *s; - uintmax_t x = 0; - CONSUME_SPACES(s, c); - GET_SIGN(s, c, d); - GET_RADIX(s, c, base); - if ((c = kBase36[c & 255]) && --c < base) { - t |= 1; - do { - x *= base; - x += c; - } while ((c = kBase36[*++s & 255]) && --c < base); - } - if (t && endptr) *endptr = s; - return d > 0 ? x : -x; -} diff --git a/libc/integral/c.inc b/libc/integral/c.inc index f4ba8ff0b..a86663525 100644 --- a/libc/integral/c.inc +++ b/libc/integral/c.inc @@ -859,9 +859,10 @@ void abort(void) wontreturn; #define __strong_reference(sym, aliassym) \ extern typeof(sym) aliassym __attribute__((__alias__(#sym))) -#define __weak_reference(sym, alias) \ - asm(".weak\t" #alias "\n\t" \ - ".equ\t" #alias ", " #sym) +#define __weak_reference(sym, alias) \ + asm(".weak\t" #alias "\n\t" \ + ".equ\t" #alias ", " #sym "\n\t" \ + ".type\t" #alias ",@notype") #define __funline \ extern __inline \ diff --git a/libc/intrin/aarch64/strchr.S b/libc/intrin/aarch64/strchr.S index 6ab0ba2f3..2672c2978 100644 --- a/libc/intrin/aarch64/strchr.S +++ b/libc/intrin/aarch64/strchr.S @@ -28,6 +28,7 @@ #include "libc/intrin/aarch64/asmdefs.internal.h" #define __strchr_aarch64 strchr +#define __index_aarch64 index .ident "\n\n\ Optimized Routines (MIT License)\n\ @@ -77,6 +78,7 @@ Copyright 2022 ARM Limited\n" /* Locals and temporaries. */ +ENTRY_ALIAS (__strchr_aarch64, __index_aarch64) ENTRY (__strchr_aarch64) PTR_ARG (0) /* Magic constant 0xc0300c03 to allow us to identify which lane diff --git a/libc/intrin/aarch64/strrchr.S b/libc/intrin/aarch64/strrchr.S index 162c5b11d..6ce4aa30f 100644 --- a/libc/intrin/aarch64/strrchr.S +++ b/libc/intrin/aarch64/strrchr.S @@ -28,6 +28,7 @@ #include "libc/intrin/aarch64/asmdefs.internal.h" #define __strrchr_aarch64 strrchr +#define __rindex_aarch64 rindex .ident "\n\n\ Optimized Routines (MIT License)\n\ @@ -81,6 +82,7 @@ Copyright 2022 ARM Limited\n" in the original string a count_trailing_zeros() operation will identify exactly which byte is causing the termination, and why. */ +ENTRY_ALIAS (__strrchr_aarch64, __rindex_aarch64) ENTRY (__strrchr_aarch64) PTR_ARG (0) /* Magic constant 0x40100401 to allow us to identify which lane diff --git a/libc/intrin/abs.c b/libc/intrin/abs.c index 8115c7019..f27c4d000 100644 --- a/libc/intrin/abs.c +++ b/libc/intrin/abs.c @@ -41,9 +41,5 @@ long labs(long x) { return x < 0 ? -x : x; } -/** - * Returns absolute value of 𝑥. - */ -long long llabs(long long x) { - return x < 0 ? -x : x; -} +__weak_reference(labs, llabs); +__weak_reference(labs, imaxabs); diff --git a/libc/intrin/bits.h b/libc/intrin/bits.h index d79a1ed8a..586ebeb1c 100644 --- a/libc/intrin/bits.h +++ b/libc/intrin/bits.h @@ -2,6 +2,7 @@ #define COSMOPOLITAN_LIBC_BITS_H_ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ +#ifdef COSMO #define CheckUnsigned(x) ((x) / !((typeof(x))(-1) < 0)) @@ -11,8 +12,6 @@ COSMOPOLITAN_C_START_ extern const uint8_t kReverseBits[256]; -uint32_t gray(uint32_t) pureconst; -uint32_t ungray(uint32_t) pureconst; int _bitreverse8(int) libcesque pureconst; int _bitreverse16(int) libcesque pureconst; uint32_t _bitreverse32(uint32_t) @@ -22,7 +21,6 @@ libcesque pureconst; unsigned long _roundup2pow(unsigned long) libcesque pureconst; unsigned long _roundup2log(unsigned long) libcesque pureconst; unsigned long _rounddown2pow(unsigned long) libcesque pureconst; -unsigned long _hamming(unsigned long, unsigned long) pureconst; unsigned _bextra(const unsigned *, size_t, char); /*───────────────────────────────────────────────────────────────────────────│─╗ @@ -157,6 +155,7 @@ unsigned _bextra(const unsigned *, size_t, char); }) #endif /* __GNUC__ && !__STRICT_ANSI__ */ +#endif /* COSMO */ COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_BITS_H_ */ diff --git a/libc/intrin/bsf.c b/libc/intrin/bsf.c index bc52e568e..da6eca51e 100644 --- a/libc/intrin/bsf.c +++ b/libc/intrin/bsf.c @@ -60,23 +60,4 @@ int(_bsfl)(long x) { return _bsfl(x); } -/** - * Returns position of first bit set. - * - * ctz(𝑥) 31^clz(𝑥) clz(𝑥) - * uint32 𝑥 _bsf(𝑥) tzcnt(𝑥) ffs(𝑥) _bsr(𝑥) lzcnt(𝑥) - * 0x00000000 wut 32 0 wut 32 - * 0x00000001 0 0 1 0 31 - * 0x80000001 0 0 1 31 0 - * 0x80000000 31 31 32 31 0 - * 0x00000010 4 4 5 4 27 - * 0x08000010 4 4 5 27 4 - * 0x08000000 27 27 28 27 4 - * 0xffffffff 0 0 1 31 0 - * - * @param 𝑥 is a 64-bit integer - * @return number in range 0..63 or undefined if 𝑥 is 0 - */ -int(_bsfll)(long long x) { - return _bsfll(x); -} +__weak_reference(_bsfl, _bsfll); diff --git a/libc/intrin/bsr.c b/libc/intrin/bsr.c index d8505a3b6..31e25879e 100644 --- a/libc/intrin/bsr.c +++ b/libc/intrin/bsr.c @@ -60,23 +60,4 @@ int(_bsrl)(long x) { return _bsrl(x); } -/** - * Returns binary logarithm of 𝑥. - * - * ctz(𝑥) 31^clz(𝑥) clz(𝑥) - * uint32 𝑥 _bsf(𝑥) tzcnt(𝑥) ffs(𝑥) _bsr(𝑥) lzcnt(𝑥) - * 0x00000000 wut 32 0 wut 32 - * 0x00000001 0 0 1 0 31 - * 0x80000001 0 0 1 31 0 - * 0x80000000 31 31 32 31 0 - * 0x00000010 4 4 5 4 27 - * 0x08000010 4 4 5 27 4 - * 0x08000000 27 27 28 27 4 - * 0xffffffff 0 0 1 31 0 - * - * @param x is a 64-bit integer - * @return number in range 0..63 or undefined if 𝑥 is 0 - */ -int(_bsrll)(long long x) { - return _bsrll(x); -} +__weak_reference(_bsrl, _bsrll); diff --git a/libc/str/explicit_bzero.c b/libc/intrin/bswap.c similarity index 67% rename from libc/str/explicit_bzero.c rename to libc/intrin/bswap.c index a75103613..6effaa925 100644 --- a/libc/str/explicit_bzero.c +++ b/libc/intrin/bswap.c @@ -16,16 +16,32 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/str.h" +#include "libc/intrin/bswap.h" +#include "libc/intrin/newbie.h" +#include "libc/sock/sock.h" -/** - * Sets memory to zero w/ accompanying non-optimizing macro. - * - * This is intended for security-conscious applications. - * - * @param p points to bytes that'll be cleared - * @param n is number of bytes to clear - */ -void explicit_bzero(void *p, size_t n) { - bzero(p, n); +uint16_t(bswap_16)(uint16_t x) { + return (0x00ff & x) << 010 | (0xff00 & x) >> 010; +} + +__strong_reference(bswap_16, ntohs); +__strong_reference(bswap_16, htons); + +uint32_t(bswap_32)(uint32_t x) { + return (0x000000ffu & x) << 030 | (0x0000ff00u & x) << 010 | + (0x00ff0000u & x) >> 010 | (0xff000000u & x) >> 030; +} + +__strong_reference(bswap_32, ntohl); +__strong_reference(bswap_32, htonl); + +uint64_t(bswap_64)(uint64_t x) { + return (0x00000000000000ffull & x) << 070 | + (0x000000000000ff00ull & x) << 050 | + (0x0000000000ff0000ull & x) << 030 | + (0x00000000ff000000ull & x) << 010 | + (0x000000ff00000000ull & x) >> 010 | + (0x0000ff0000000000ull & x) >> 030 | + (0x00ff000000000000ull & x) >> 050 | + (0xff00000000000000ull & x) >> 070; } diff --git a/libc/intrin/bswap.h b/libc/intrin/bswap.h index 1dad0e4b5..9de9280e0 100644 --- a/libc/intrin/bswap.h +++ b/libc/intrin/bswap.h @@ -5,7 +5,7 @@ COSMOPOLITAN_C_START_ uint16_t bswap_16(uint16_t) pureconst; uint32_t bswap_32(uint32_t) pureconst; -uint32_t bswap_64(uint32_t) pureconst; +uint64_t bswap_64(uint64_t) pureconst; #if defined(__GNUC__) && !defined(__STRICT_ANSI__) #define bswap_16(x) __builtin_bswap16(x) diff --git a/libc/intrin/bzero.c b/libc/intrin/bzero.c index b97233545..a751b7122 100644 --- a/libc/intrin/bzero.c +++ b/libc/intrin/bzero.c @@ -165,3 +165,5 @@ void bzero(void *p, size_t n) { bzero128(b, n); } } + +__weak_reference(bzero, explicit_bzero); diff --git a/libc/intrin/exit.c b/libc/intrin/exit.c index 9c7c0ba8c..8b2b954f7 100644 --- a/libc/intrin/exit.c +++ b/libc/intrin/exit.c @@ -91,3 +91,5 @@ wontreturn void _Exit(int exitcode) { unreachable; #endif } + +__strong_reference(_Exit, _exit); diff --git a/libc/intrin/fenv.S b/libc/intrin/fenv.S index 5c9dfac9c..0ca23467e 100644 --- a/libc/intrin/fenv.S +++ b/libc/intrin/fenv.S @@ -39,7 +39,9 @@ // - `FE_INEXACT` // - `FE_ALL_EXCEPT` (all of the above) // @return 0 on success, or nonzero on error + .ftrace1 feclearexcept: + .ftrace2 #ifdef __x86_64__ // maintain exceptions in the sse mxcsr, clear x87 exceptions mov %edi,%ecx @@ -79,6 +81,7 @@ feclearexcept: // volatile double x = 0, y = 1 / x; // assert(fetestexcept(FE_ALL_EXCEPT) == FE_DIVBYZERO); // + .ftrace1 // @param excepts may bitwise-or the following: // - `FE_INVALID` // - `FE_DIVBYZERO` @@ -88,7 +91,9 @@ feclearexcept: // - `FE_ALL_EXCEPT` (all of the above) // @return mask of which exception status codes are currently set, // or zero if there aren't any floating point exceptions + .ftrace1 fetestexcept: + .ftrace2 #ifdef __x86_64__ and $0x3f,%edi push %rax @@ -106,7 +111,9 @@ fetestexcept: #endif .endfn fetestexcept,globl + .ftrace1 feraiseexcept: + .ftrace2 #ifdef __x86_64__ and $0x3f,%edi stmxcsr -8(%rsp) @@ -124,7 +131,9 @@ feraiseexcept: #endif .endfn feraiseexcept,globl + .ftrace1 __fesetround: + .ftrace2 #ifdef __x86_64__ push %rax xor %eax,%eax @@ -150,7 +159,9 @@ __fesetround: #endif .endfn __fesetround,globl,hidden + .ftrace1 fegetround: + .ftrace2 #ifdef __x86_64__ push %rax stmxcsr (%rsp) @@ -165,7 +176,9 @@ fegetround: #endif .endfn fegetround,globl + .ftrace1 fegetenv: + .ftrace2 #ifdef __x86_64__ xor %eax,%eax fnstenv (%rdi) @@ -180,7 +193,9 @@ fegetenv: #endif .endfn fegetenv,globl + .ftrace1 fesetenv: + .ftrace2 #ifdef __x86_64__ xor %eax,%eax inc %rdi diff --git a/libc/intrin/ffs.c b/libc/intrin/ffs.c index e5ecae566..257adb0ab 100644 --- a/libc/intrin/ffs.c +++ b/libc/intrin/ffs.c @@ -31,9 +31,4 @@ long ffsl(long x) { return __builtin_ffsl(x); } -/** - * Finds lowest set bit in word. - */ -long long ffsll(long long x) { - return __builtin_ffsll(x); -} +__weak_reference(ffsl, ffsll); diff --git a/libc/intrin/gray.c b/libc/intrin/gray.c deleted file mode 100644 index 2d2bef523..000000000 --- a/libc/intrin/gray.c +++ /dev/null @@ -1,28 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/intrin/bits.h" - -/** - * Returns gray code for x. - * @see https://en.wikipedia.org/wiki/Gray_code - * @see ungray() - */ -uint32_t gray(uint32_t x) { - return x ^ (x >> 1); -} diff --git a/libc/intrin/hamming.c b/libc/intrin/hamming.c deleted file mode 100644 index 1b61ee614..000000000 --- a/libc/intrin/hamming.c +++ /dev/null @@ -1,27 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/intrin/popcnt.h" - -/** - * Counts number of different bits. - * @see https://en.wikipedia.org/wiki/Hamming_code - */ -unsigned long _hamming(unsigned long x, unsigned long y) { - return popcnt(x ^ y); -} diff --git a/libc/intrin/hilbert.h b/libc/intrin/hilbert.h index 49ba62a7d..1b4b477ac 100644 --- a/libc/intrin/hilbert.h +++ b/libc/intrin/hilbert.h @@ -2,10 +2,14 @@ #define COSMOPOLITAN_LIBC_BITS_HILBERT_H_ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ +#ifdef COSMO +#define hilbert __hilbert +#define unhilbert __unhilbert long hilbert(long, long, long) pureconst; axdx_t unhilbert(long, long) pureconst; +#endif /* COSMO */ COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_BITS_HILBERT_H_ */ diff --git a/libc/intrin/kprintf.h b/libc/intrin/kprintf.h index 98548985c..6c5d442b4 100644 --- a/libc/intrin/kprintf.h +++ b/libc/intrin/kprintf.h @@ -1,8 +1,22 @@ #ifndef COSMOPOLITAN_LIBC_INTRIN_KPRINTF_H_ #define COSMOPOLITAN_LIBC_INTRIN_KPRINTF_H_ +#ifdef COSMO + +#define kprintf __kprintf +#define ksnprintf __ksnprintf +#define kvprintf __kvprintf +#define kvsnprintf __kvsnprintf +#define kisdangerous __kisdangerous + #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ +void kprintf(const char *, ...); +size_t ksnprintf(char *, size_t, const char *, ...); +void kvprintf(const char *, va_list); +size_t kvsnprintf(char *, size_t, const char *, va_list); +bool kisdangerous(const void *); + void kprintf(const char *, ...); size_t ksnprintf(char *, size_t, const char *, ...); void kvprintf(const char *, va_list); @@ -12,4 +26,5 @@ void _klog(const char *, size_t); COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMO */ #endif /* COSMOPOLITAN_LIBC_INTRIN_KPRINTF_H_ */ diff --git a/libc/intrin/likely.h b/libc/intrin/likely.h index 3f96b4cf8..c05e671c7 100644 --- a/libc/intrin/likely.h +++ b/libc/intrin/likely.h @@ -1,6 +1,7 @@ #ifndef COSMOPOLITAN_LIBC_BITS_LIKELY_H_ #define COSMOPOLITAN_LIBC_BITS_LIKELY_H_ #if !(__ASSEMBLER__ + __LINKER__ + 0) +#ifdef COSMO #define LIKELY(x) __builtin_expect(!!(x), 1) #define UNLIKELY(x) __builtin_expect(!!(x), 0) @@ -17,5 +18,6 @@ #define VERY_UNLIKELY(x) UNLIKELY(x) #endif +#endif /* COSMO */ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_BITS_LIKELY_H_ */ diff --git a/libc/intrin/lockxadd.h b/libc/intrin/lockxadd.h deleted file mode 100644 index b47c53f39..000000000 --- a/libc/intrin/lockxadd.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_BITS_LOCKXADD_H_ -#define COSMOPOLITAN_LIBC_BITS_LOCKXADD_H_ -#if !(__ASSEMBLER__ + __LINKER__ + 0) -COSMOPOLITAN_C_START_ - -intptr_t _lockxadd(void *, intptr_t, size_t); - -#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && defined(__x86__) -#define _lockxadd(PTR, VAL) \ - ({ \ - typeof(*(PTR)) Res; \ - typeof(Res) Val = (VAL); \ - asm volatile("lock xadd\t%0,%1" : "=r"(Res), "+m"(*(PTR)) : "0"(Val)); \ - Res; /* contains *PTR before addition cf. InterlockedAdd() */ \ - }) -#else -#define _lockxadd(MEM, VAL) _lockxadd(MEM, (intptr_t)(VAL), sizeof(*(MEM))) -#endif /* GNUC && !ANSI && x86 */ - -COSMOPOLITAN_C_END_ -#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ -#endif /* COSMOPOLITAN_LIBC_BITS_LOCKXADD_H_ */ diff --git a/libc/intrin/memmove.c b/libc/intrin/memmove.c index 357058d38..a3a0c1018 100644 --- a/libc/intrin/memmove.c +++ b/libc/intrin/memmove.c @@ -342,6 +342,6 @@ void *memmove(void *dst, const void *src, size_t n) { } } -__strong_reference(memmove, memcpy); +__weak_reference(memmove, memcpy); #endif /* __aarch64__ */ diff --git a/libc/intrin/morton.c b/libc/intrin/morton.c index d0d4c5753..ab03b777b 100644 --- a/libc/intrin/morton.c +++ b/libc/intrin/morton.c @@ -23,7 +23,7 @@ * @see https://en.wikipedia.org/wiki/Z-order_curve * @see unmorton() */ -unsigned long(morton)(unsigned long y, unsigned long x) { +unsigned long morton(unsigned long y, unsigned long x) { x = (x | x << 020) & 0x0000FFFF0000FFFF; x = (x | x << 010) & 0x00FF00FF00FF00FF; x = (x | x << 004) & 0x0F0F0F0F0F0F0F0F; diff --git a/libc/intrin/morton.h b/libc/intrin/morton.h index f749573d4..215ece255 100644 --- a/libc/intrin/morton.h +++ b/libc/intrin/morton.h @@ -1,24 +1,16 @@ #ifndef COSMOPOLITAN_LIBC_BITS_MORTON_H_ #define COSMOPOLITAN_LIBC_BITS_MORTON_H_ -#include "libc/intrin/pdep.h" -#include "libc/intrin/pext.h" -#include "libc/nexgen32e/x86feature.h" #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ +#ifdef COSMO + +#define morton __morton +#define unmorton __unmorton unsigned long morton(unsigned long, unsigned long) libcesque; axdx_t unmorton(unsigned long) libcesque; -#ifndef __STRICT_ANSI__ -#define morton(Y, X) \ - (X86_NEED(BMI2) ? pdep(X, 0x5555555555555555) | pdep(Y, 0xAAAAAAAAAAAAAAAA) \ - : morton(Y, X)) -#define unmorton(I) \ - (X86_NEED(BMI2) \ - ? (axdx_t){pext(I, 0xAAAAAAAAAAAAAAAA), pext(I, 0x5555555555555555)} \ - : unmorton(I)) -#endif - +#endif /* COSMO */ COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_BITS_MORTON_H_ */ diff --git a/libc/intrin/newbie.h b/libc/intrin/newbie.h index 2d29f8fba..46528b0ae 100644 --- a/libc/intrin/newbie.h +++ b/libc/intrin/newbie.h @@ -2,11 +2,6 @@ #define COSMOPOLITAN_LIBC_BITS_NEWBIE_H_ #include "libc/intrin/bswap.h" -/* - * Macros for newbies. - * https://justine.lol/endian.html - */ - #define BYTE_ORDER __BYTE_ORDER__ #define LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ #define BIG_ENDIAN __ORDER_BIG_ENDIAN__ diff --git a/libc/intrin/pushpop.h b/libc/intrin/pushpop.h index 1b1f6f185..56bb847ee 100644 --- a/libc/intrin/pushpop.h +++ b/libc/intrin/pushpop.h @@ -2,6 +2,7 @@ #define COSMOPOLITAN_LIBC_BITS_PUSHPOP_H_ #include "libc/macros.internal.h" #if !(__ASSEMBLER__ + __LINKER__ + 0) +#ifdef COSMO #if !defined(__GNUC__) || defined(__STRICT_ANSI__) || !defined(__x86_64__) #define pushpop(x) (x) @@ -51,5 +52,6 @@ }) #endif +#endif /* COSMO */ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_BITS_PUSHPOP_H_ */ diff --git a/libc/intrin/repmovsb.h b/libc/intrin/repmovsb.h index bb15832ed..b6b0b6a01 100644 --- a/libc/intrin/repmovsb.h +++ b/libc/intrin/repmovsb.h @@ -1,6 +1,7 @@ #ifndef COSMOPOLITAN_LIBC_INTRIN_REPMOVSB_H_ #define COSMOPOLITAN_LIBC_INTRIN_REPMOVSB_H_ #if !(__ASSEMBLER__ + __LINKER__ + 0) +#ifdef COSMO forceinline void repmovsb(void **dest, const void **src, size_t cx) { char *di = (char *)*dest; @@ -22,5 +23,6 @@ forceinline void repmovsb(void **dest, const void **src, size_t cx) { }) #endif +#endif /* COSMO */ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_INTRIN_REPMOVSB_H_ */ diff --git a/libc/intrin/repstosb.h b/libc/intrin/repstosb.h index 554682da0..1f2051866 100644 --- a/libc/intrin/repstosb.h +++ b/libc/intrin/repstosb.h @@ -1,6 +1,7 @@ #ifndef COSMOPOLITAN_LIBC_INTRIN_REPSTOSB_H_ #define COSMOPOLITAN_LIBC_INTRIN_REPSTOSB_H_ #if !(__ASSEMBLER__ + __LINKER__ + 0) +#ifdef COSMO forceinline void *repstosb(void *dest, unsigned char al, size_t cx) { unsigned char *di = (unsigned char *)dest; @@ -21,5 +22,6 @@ forceinline void *repstosb(void *dest, unsigned char al, size_t cx) { }) #endif +#endif /* COSMO */ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_INTRIN_REPSTOSB_H_ */ diff --git a/libc/intrin/segmentation.h b/libc/intrin/segmentation.h index 66e281745..862519730 100644 --- a/libc/intrin/segmentation.h +++ b/libc/intrin/segmentation.h @@ -2,6 +2,7 @@ #define COSMOPOLITAN_LIBC_BITS_SEGMENTATION_H_ #if !(__ASSEMBLER__ + __LINKER__ + 0) #if defined(__GNUC__) && !defined(__STRICT_ANSI__) +#ifdef COSMO /** * Reads scalar from memory, offset by segment. @@ -20,6 +21,7 @@ Pk; \ }) +#endif /* COSMO */ #endif /* __GNUC__ && !__STRICT_ANSI__ */ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_BITS_SEGMENTATION_H_ */ diff --git a/libc/intrin/strchr.c b/libc/intrin/strchr.c index 0024fb367..4190b9191 100644 --- a/libc/intrin/strchr.c +++ b/libc/intrin/strchr.c @@ -117,4 +117,6 @@ char *strchr(const char *s, int c) { #endif } +__strong_reference(strchr, index); + #endif /* __aarch64__ */ diff --git a/libc/intrin/strrchr.c b/libc/intrin/strrchr.c index d55a45911..59a230c71 100644 --- a/libc/intrin/strrchr.c +++ b/libc/intrin/strrchr.c @@ -31,4 +31,6 @@ char *strrchr(const char *s, int c) { return memrchr(s, c, strlen(s)); } +__strong_reference(strrchr, rindex); + #endif /* __aarch64__ */ diff --git a/libc/intrin/syscall.S b/libc/intrin/syscall.S deleted file mode 100644 index e94eb339a..000000000 --- a/libc/intrin/syscall.S +++ /dev/null @@ -1,65 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2021 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" -.privileged - -// Invokes SYSCALL for libfatal forceinline asm() routines. -// -// @param rax is ordinal -// @param rdi is arg1 -// @param rsi is arg2 -// @param rdx is arg3 -// @param rcx is arg4 -// @param r8 is arg5 -// @param r9 is arg6 -// @param rsp may contain more args -// @return rdx:rax where rax holds -errno on error -// @clob rax,rdx,memory,cc -__syscall__: - mov %rcx,.Lrcx(%rip) - mov %rdi,.Lrdi(%rip) - mov %rsi,.Lrsi(%rip) - mov %r8,.Lr8(%rip) - mov %r9,.Lr9(%rip) - mov %r10,.Lr10(%rip) - mov %r11,.Lr11(%rip) - mov %rcx,%r10 - clc - syscall - jnc 1f - neg %rax -1: mov .Lrcx(%rip),%rcx - mov .Lrdi(%rip),%rdi - mov .Lrsi(%rip),%rsi - mov .Lr8(%rip),%r8 - mov .Lr9(%rip),%r9 - mov .Lr10(%rip),%r10 - mov .Lr11(%rip),%r11 - ret - .endfn __syscall__,globl,hidden - - .bss - .balign 8 -.Lrcx: .quad 0 // clobbered by syscall -.Lrdi: .quad 0 // just in case -.Lrsi: .quad 0 // just in case -.Lr8: .quad 0 // freebsd bug? -.Lr9: .quad 0 // just in case -.Lr10: .quad 0 // just in case -.Lr11: .quad 0 // clobbered by syscall diff --git a/libc/intrin/ungray.c b/libc/intrin/ungray.c deleted file mode 100644 index f9b3ce120..000000000 --- a/libc/intrin/ungray.c +++ /dev/null @@ -1,33 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/intrin/bits.h" - -/** - * Decodes gray code. - * @see https://en.wikipedia.org/wiki/Gray_code - * @see gray() - */ -uint32_t ungray(uint32_t x) { - x ^= x >> 16; - x ^= x >> 8; - x ^= x >> 4; - x ^= x >> 2; - x ^= x >> 1; - return x; -} diff --git a/libc/intrin/unmorton.c b/libc/intrin/unmorton.c index 5f98e1c28..9c1e3ab84 100644 --- a/libc/intrin/unmorton.c +++ b/libc/intrin/unmorton.c @@ -36,6 +36,6 @@ static unsigned long GetOddBits(unsigned long x) { * @see en.wikipedia.org/wiki/Z-order_curve * @see morton() */ -axdx_t(unmorton)(unsigned long i) { +axdx_t unmorton(unsigned long i) { return (axdx_t){GetOddBits(i >> 1), GetOddBits(i)}; } diff --git a/libc/intrin/xadd.h b/libc/intrin/xadd.h deleted file mode 100644 index c5c1af334..000000000 --- a/libc/intrin/xadd.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_BITS_XADD_H_ -#define COSMOPOLITAN_LIBC_BITS_XADD_H_ -#if !(__ASSEMBLER__ + __LINKER__ + 0) -COSMOPOLITAN_C_START_ - -#define _xadd(p, v) \ - ({ \ - typeof(*(p)) Res; \ - autotype(Res) Val = (v); \ - asm volatile("xadd\t%0,%1" : "=r"(Res), "+m"(*(p)) : "0"(Val)); \ - Res + Val; \ - }) - -COSMOPOLITAN_C_END_ -#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ -#endif /* COSMOPOLITAN_LIBC_BITS_XADD_H_ */ diff --git a/libc/runtime/exit2.c b/libc/runtime/exit2.c deleted file mode 100644 index 438fc680f..000000000 --- a/libc/runtime/exit2.c +++ /dev/null @@ -1,34 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2021 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/runtime/runtime.h" - -/** - * Terminates process, ignoring destructors and atexit() handlers. - * - * When running on bare metal, this function will reboot your computer - * by hosing the interrupt descriptors and triple faulting the system. - * - * @param exitcode is masked with 255 - * @asyncsignalsafe - * @vforksafe - * @noreturn - */ -wontreturn void _exit(int exitcode) { - _Exit(exitcode); -} diff --git a/libc/sock/sock.h b/libc/sock/sock.h index ccfa6b1ad..88de46834 100644 --- a/libc/sock/sock.h +++ b/libc/sock/sock.h @@ -9,10 +9,10 @@ COSMOPOLITAN_C_START_ #define INET_ADDRSTRLEN 22 #define IFHWADDRLEN 6 -uint16_t htons(uint16_t); -uint16_t ntohs(uint16_t); -uint32_t htonl(uint32_t); -uint32_t ntohl(uint32_t); +uint16_t htons(uint16_t) pureconst; +uint16_t ntohs(uint16_t) pureconst; +uint32_t htonl(uint32_t) pureconst; +uint32_t ntohl(uint32_t) pureconst; #if defined(__GNUC__) && !defined(__STRICT_ANSI__) #define htons(x) __builtin_bswap16(x) diff --git a/libc/stdio/append.h b/libc/stdio/append.h index c6560a99d..49817097b 100644 --- a/libc/stdio/append.h +++ b/libc/stdio/append.h @@ -1,9 +1,20 @@ #ifndef COSMOPOLITAN_LIBC_STDIO_APPEND_H_ #define COSMOPOLITAN_LIBC_STDIO_APPEND_H_ #include "libc/fmt/pflink.h" +#ifdef COSMO #define APPEND_COOKIE 21578 +#define appendz __appendz +#define appendr __appendr +#define appendd __appendd +#define appendw __appendw +#define appends __appends +#define appendf __appendf +#define vappendf __vappendf +#define kappendf __kappendf +#define kvappendf __kvappendf + #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ @@ -22,11 +33,7 @@ ssize_t vappendf(char **, const char *, va_list); ssize_t kappendf(char **, const char *, ...); ssize_t kvappendf(char **, const char *, va_list); -#if defined(__GNUC__) && !defined(__STRICT_ANSI__) -#define appendf(BUF, FMT, ...) appendf(BUF, PFLINK(FMT), ##__VA_ARGS__) -#define vappendf(BUF, FMT, VA) vappendf(BUF, PFLINK(FMT), VA) -#endif - COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMO */ #endif /* COSMOPOLITAN_LIBC_STDIO_APPEND_H_ */ diff --git a/libc/stdio/fgetc.c b/libc/stdio/fgetc.c index 8dda15ace..9b8de9fe5 100644 --- a/libc/stdio/fgetc.c +++ b/libc/stdio/fgetc.c @@ -34,3 +34,5 @@ int fgetc(FILE *f) { funlockfile(f); return rc; } + +__strong_reference(fgetc, getc); diff --git a/libc/stdio/fgetc_unlocked.c b/libc/stdio/fgetc_unlocked.c index 51a299220..03fb0c505 100644 --- a/libc/stdio/fgetc_unlocked.c +++ b/libc/stdio/fgetc_unlocked.c @@ -34,3 +34,5 @@ int fgetc_unlocked(FILE *f) { return b[0]; } } + +__strong_reference(fgetc_unlocked, getc_unlocked); diff --git a/libc/stdio/fgetwc.c b/libc/stdio/fgetwc.c index aecf07615..39cc5b2b2 100644 --- a/libc/stdio/fgetwc.c +++ b/libc/stdio/fgetwc.c @@ -34,3 +34,5 @@ wint_t fgetwc(FILE *f) { funlockfile(f); return wc; } + +__strong_reference(fgetwc, getwc); diff --git a/libc/stdio/fgetwc_unlocked.c b/libc/stdio/fgetwc_unlocked.c index 7f5a421d5..62ae0fea2 100644 --- a/libc/stdio/fgetwc_unlocked.c +++ b/libc/stdio/fgetwc_unlocked.c @@ -49,3 +49,5 @@ wint_t fgetwc_unlocked(FILE *f) { } return x; } + +__strong_reference(fgetwc_unlocked, getwc_unlocked); diff --git a/libc/stdio/fputc.c b/libc/stdio/fputc.c index 28b8a3b72..4a4fe5b0b 100644 --- a/libc/stdio/fputc.c +++ b/libc/stdio/fputc.c @@ -33,3 +33,5 @@ int fputc(int c, FILE *f) { funlockfile(f); return rc; } + +__strong_reference(fputc, putc); diff --git a/libc/stdio/fputc_unlocked.c b/libc/stdio/fputc_unlocked.c index 8aa5e1494..41494f8eb 100644 --- a/libc/stdio/fputc_unlocked.c +++ b/libc/stdio/fputc_unlocked.c @@ -36,3 +36,5 @@ int fputc_unlocked(int c, FILE *f) { return b; } } + +__strong_reference(fputc_unlocked, putc_unlocked); diff --git a/libc/stdio/fputwc.c b/libc/stdio/fputwc.c index 6356c1aed..9cecb6f8f 100644 --- a/libc/stdio/fputwc.c +++ b/libc/stdio/fputwc.c @@ -34,3 +34,5 @@ wint_t fputwc(wchar_t wc, FILE *f) { funlockfile(f); return rc; } + +__strong_reference(fputwc, putwc); diff --git a/libc/stdio/fputwc_unlocked.c b/libc/stdio/fputwc_unlocked.c index ede03584d..0c6338022 100644 --- a/libc/stdio/fputwc_unlocked.c +++ b/libc/stdio/fputwc_unlocked.c @@ -40,3 +40,5 @@ wint_t fputwc_unlocked(wchar_t wc, FILE *f) { return -1; } } + +__strong_reference(fputwc_unlocked, putwc_unlocked); diff --git a/libc/stdio/fseek.c b/libc/stdio/fseek.c deleted file mode 100644 index f9c92c79f..000000000 --- a/libc/stdio/fseek.c +++ /dev/null @@ -1,36 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/stdio/stdio.h" - -/** - * Repositions open file stream. - * - * This function flushes the buffer (unless it's currently in the EOF - * state) and then calls lseek() on the underlying file. If the stream - * is in the EOF state, this function can be used to restore it without - * needing to reopen the file. - * - * @param f is a non-null stream handle - * @param offset is the byte delta - * @param whence can be SEET_SET, SEEK_CUR, or SEEK_END - * @returns 0 on success or -1 on error - */ -int fseek(FILE *f, long offset, int whence) { - return fseeko(f, offset, whence); -} diff --git a/libc/stdio/fseeko.c b/libc/stdio/fseeko.c index c20380c31..4d0bb3b93 100644 --- a/libc/stdio/fseeko.c +++ b/libc/stdio/fseeko.c @@ -44,3 +44,5 @@ int fseeko(FILE *f, int64_t offset, int whence) { funlockfile(f); return rc; } + +__strong_reference(fseeko, fseek); diff --git a/libc/stdio/ftell.c b/libc/stdio/ftell.c deleted file mode 100644 index 1f843eab1..000000000 --- a/libc/stdio/ftell.c +++ /dev/null @@ -1,29 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/stdio/stdio.h" - -/** - * Returns current position of stream. - * - * @param stream is a non-null stream handle - * @returns current byte offset from beginning, or -1 w/ errno - */ -long ftell(FILE *f) { - return ftello(f); -} diff --git a/libc/stdio/ftello.c b/libc/stdio/ftello.c index 0f12ba119..782f3579b 100644 --- a/libc/stdio/ftello.c +++ b/libc/stdio/ftello.c @@ -55,3 +55,5 @@ int64_t ftello(FILE *f) { funlockfile(f); return rc; } + +__strong_reference(ftello, ftell); diff --git a/libc/stdio/getc.c b/libc/stdio/getc.c deleted file mode 100644 index 906621ee6..000000000 --- a/libc/stdio/getc.c +++ /dev/null @@ -1,28 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=8 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/stdio/stdio.h" - -/** - * Reads byte from stream. - * @return byte in range 0..255, or -1 w/ errno - * @threadsafe - */ -int(getc)(FILE *f) { - return fgetc(f); -} diff --git a/libc/stdio/getc_unlocked.c b/libc/stdio/getc_unlocked.c deleted file mode 100644 index 8f4ea49c2..000000000 --- a/libc/stdio/getc_unlocked.c +++ /dev/null @@ -1,27 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=8 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/stdio/stdio.h" - -/** - * Reads byte from stream. - * @return byte in range 0..255, or -1 w/ errno - */ -int(getc_unlocked)(FILE *f) { - return fgetc_unlocked(f); -} diff --git a/libc/stdio/getwc.c b/libc/stdio/getwc.c deleted file mode 100644 index e8ee98759..000000000 --- a/libc/stdio/getwc.c +++ /dev/null @@ -1,28 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/stdio/stdio.h" - -/** - * Reads UTF-8 character from stream. - * @return wide character or -1 on EOF or error - * @threadsafe - */ -wint_t(getwc)(FILE *f) { - return fgetwc(f); -} diff --git a/libc/stdio/getwc_unlocked.c b/libc/stdio/getwc_unlocked.c deleted file mode 100644 index 0bb9975e6..000000000 --- a/libc/stdio/getwc_unlocked.c +++ /dev/null @@ -1,27 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/stdio/stdio.h" - -/** - * Reads UTF-8 character from stream. - * @return wide character or -1 on EOF or error - */ -wint_t(getwc_unlocked)(FILE *f) { - return fgetwc_unlocked(f); -} diff --git a/libc/stdio/lcg.internal.h b/libc/stdio/lcg.internal.h index 6efd36d42..845c12026 100644 --- a/libc/stdio/lcg.internal.h +++ b/libc/stdio/lcg.internal.h @@ -1,6 +1,7 @@ #ifndef COSMOPOLITAN_LIBC_LCG_H_ #define COSMOPOLITAN_LIBC_LCG_H_ #if !(__ASSEMBLER__ + __LINKER__ + 0) +#ifdef COSMO forceinline uint64_t KnuthLinearCongruentialGenerator(uint64_t prev[1]) { /* Knuth, D.E., "The Art of Computer Programming," Vol 2, @@ -10,5 +11,6 @@ forceinline uint64_t KnuthLinearCongruentialGenerator(uint64_t prev[1]) { return prev[0]; /* be sure to shift! */ } +#endif /* COSMO */ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_LCG_H_ */ diff --git a/libc/stdio/putc.c b/libc/stdio/putc.c deleted file mode 100644 index a71b6fa05..000000000 --- a/libc/stdio/putc.c +++ /dev/null @@ -1,30 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=8 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/stdio/stdio.h" - -/** - * Writes byte to stream. - * - * @param c is byte to buffer or write, which is masked - * @return c as unsigned char if written or -1 w/ errno - * @threadsafe - */ -int(putc)(int c, FILE *f) { - return fputc(c, f); -} diff --git a/libc/stdio/putc_unlocked.c b/libc/stdio/putc_unlocked.c deleted file mode 100644 index a587d245d..000000000 --- a/libc/stdio/putc_unlocked.c +++ /dev/null @@ -1,29 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=8 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/stdio/stdio.h" - -/** - * Writes byte to stream. - * - * @param c is byte to buffer or write, which is masked - * @return c as unsigned char if written or -1 w/ errno - */ -int(putc_unlocked)(int c, FILE *f) { - return fputc_unlocked(c, f); -} diff --git a/libc/stdio/putwc.c b/libc/stdio/putwc.c deleted file mode 100644 index eafe3212f..000000000 --- a/libc/stdio/putwc.c +++ /dev/null @@ -1,29 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/stdio/stdio.h" - -/** - * Writes wide character to stream. - * - * @return wc if written or -1 w/ errno - * @threadsafe - */ -wint_t(putwc)(wchar_t wc, FILE *f) { - return fputwc(wc, f); -} diff --git a/libc/stdio/rand.h b/libc/stdio/rand.h index 76ff8b4ff..37c42dc97 100644 --- a/libc/stdio/rand.h +++ b/libc/stdio/rand.h @@ -22,6 +22,12 @@ char *setstate(char *); long random(void); void srandom(unsigned); +#ifdef COSMO +#define vigna __vigna +#define vigna_r __vigna_r +#define rngset __rngset +#define rdrand __rdrand +#define rdseed __rdseed uint64_t lemur64(void); uint64_t _rand64(void); uint64_t vigna(void); @@ -37,6 +43,7 @@ double _real2(uint64_t); double _real3(uint64_t); double MeasureEntropy(const char *, size_t); void *rngset(void *, size_t, uint64_t (*)(void), size_t); +#endif /* COSMO */ COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/stdio/xorshift.h b/libc/stdio/xorshift.h index 8ff8ad571..585ec65a5 100644 --- a/libc/stdio/xorshift.h +++ b/libc/stdio/xorshift.h @@ -1,5 +1,6 @@ #ifndef COSMOPOLITAN_LIBC_RAND_XORSHIFT_H_ #define COSMOPOLITAN_LIBC_RAND_XORSHIFT_H_ +#ifdef COSMO #define kMarsagliaXorshift64Seed 88172645463325252 #define kMarsagliaXorshift32Seed 2463534242 @@ -12,4 +13,5 @@ uint64_t MarsagliaXorshift64(uint64_t[hasatleast 1]); COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMO */ #endif /* COSMOPOLITAN_LIBC_RAND_XORSHIFT_H_ */ diff --git a/libc/str/index.c b/libc/str/index.c deleted file mode 100644 index 6e1decccf..000000000 --- a/libc/str/index.c +++ /dev/null @@ -1,31 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2021 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/str.h" - -/** - * Returns pointer to first instance of character, the BSD way. - * - * @param s is a NUL-terminated string - * @param is masked with 255 as byte to search for - * @return is pointer to first instance of c or NULL if not found, - * noting that c being NUL will return a pointer to terminator - */ -char *index(const char *s, int c) { - return strchr(s, c); -} diff --git a/libc/str/isalnum.c b/libc/str/isalnum.c index f4866bbba..c1cd5fe69 100644 --- a/libc/str/isalnum.c +++ b/libc/str/isalnum.c @@ -25,3 +25,5 @@ int isalnum(int c) { return ('0' <= c && c <= '9') || ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z'); } + +__weak_reference(isalnum, isalnum_l); diff --git a/libc/str/isalpha.c b/libc/str/isalpha.c index 583053d61..8230c02f0 100644 --- a/libc/str/isalpha.c +++ b/libc/str/isalpha.c @@ -24,3 +24,5 @@ int isalpha(int c) { return ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z'); } + +__weak_reference(isalpha, isalpha_l); diff --git a/libc/str/isascii.c b/libc/str/isascii.c index b545e51a6..bcb152e55 100644 --- a/libc/str/isascii.c +++ b/libc/str/isascii.c @@ -24,3 +24,5 @@ int isascii(int c) { return 0x00 <= c && c <= 0x7F; } + +__weak_reference(isascii, isascii_l); diff --git a/libc/str/isblank.c b/libc/str/isblank.c index 3e0a4b94c..141855a72 100644 --- a/libc/str/isblank.c +++ b/libc/str/isblank.c @@ -24,3 +24,5 @@ int isblank(int c) { return c == ' ' || c == '\t'; } + +__weak_reference(isblank, isblank_l); diff --git a/libc/str/iscntrl.c b/libc/str/iscntrl.c index 4f484e722..2d8570f75 100644 --- a/libc/str/iscntrl.c +++ b/libc/str/iscntrl.c @@ -24,3 +24,5 @@ int iscntrl(int c) { return (0x00 <= c && c <= 0x1F) || c == 0x7F; } + +__weak_reference(iscntrl, iscntrl_l); diff --git a/libc/str/isdigit.c b/libc/str/isdigit.c index f7fca46a7..4758f1d0d 100644 --- a/libc/str/isdigit.c +++ b/libc/str/isdigit.c @@ -24,3 +24,5 @@ int isdigit(int c) { return '0' <= c && c <= '9'; } + +__weak_reference(isdigit, isdigit_l); diff --git a/libc/str/isdigit_l.c b/libc/str/isdigit_l.c deleted file mode 100644 index c6aa06f73..000000000 --- a/libc/str/isdigit_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int isdigit_l(int c, locale_t l) { - return iswdigit(c); -} diff --git a/libc/str/isgraph.c b/libc/str/isgraph.c index 16a91cf94..2deb852d3 100644 --- a/libc/str/isgraph.c +++ b/libc/str/isgraph.c @@ -24,3 +24,5 @@ int isgraph(int c) { return 0x21 <= c && c <= 0x7E; } + +__weak_reference(isgraph, isgraph_l); diff --git a/libc/str/islower.c b/libc/str/islower.c index c7079e22b..e83fec919 100644 --- a/libc/str/islower.c +++ b/libc/str/islower.c @@ -24,3 +24,5 @@ int islower(int c) { return 'a' <= c && c <= 'z'; } + +__weak_reference(islower, islower_l); diff --git a/libc/str/islower_l.c b/libc/str/islower_l.c deleted file mode 100644 index 0a437afd5..000000000 --- a/libc/str/islower_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int islower_l(int c, locale_t l) { - return islower(c); -} diff --git a/libc/str/isprint.c b/libc/str/isprint.c index 1746288e5..147d97f0f 100644 --- a/libc/str/isprint.c +++ b/libc/str/isprint.c @@ -24,3 +24,5 @@ int isprint(int c) { return 0x20 <= c && c <= 0x7E; } + +__weak_reference(isprint, isprint_l); diff --git a/libc/str/ispunct.c b/libc/str/ispunct.c index f792c7eed..25277c275 100644 --- a/libc/str/ispunct.c +++ b/libc/str/ispunct.c @@ -25,3 +25,5 @@ int ispunct(int c) { return (0x21 <= c && c <= 0x7E) && !('0' <= c && c <= '9') && !('A' <= c && c <= 'Z') && !('a' <= c && c <= 'z'); } + +__weak_reference(ispunct, ispunct_l); diff --git a/libc/str/isspace.c b/libc/str/isspace.c index 2c18305c7..dad06361f 100644 --- a/libc/str/isspace.c +++ b/libc/str/isspace.c @@ -26,3 +26,5 @@ int isspace(int c) { return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == '\f' || c == '\v'; } + +__weak_reference(isspace, isspace_l); diff --git a/libc/str/isupper.c b/libc/str/isupper.c index 6c6d6cd5e..b2afc3083 100644 --- a/libc/str/isupper.c +++ b/libc/str/isupper.c @@ -24,3 +24,5 @@ int isupper(int c) { return 'A' <= c && c <= 'Z'; } + +__weak_reference(isupper, isupper_l); diff --git a/libc/str/isupper_l.c b/libc/str/isupper_l.c deleted file mode 100644 index f4c2c61ea..000000000 --- a/libc/str/isupper_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int isupper_l(int c, locale_t l) { - return isupper(c); -} diff --git a/libc/str/iswalnum.c b/libc/str/iswalnum.c index 58e54da55..c4d36543b 100644 --- a/libc/str/iswalnum.c +++ b/libc/str/iswalnum.c @@ -24,3 +24,5 @@ int iswalnum(wint_t c) { return iswdigit(c) || iswalpha(c); } + +__weak_reference(iswalnum, iswalnum_l); diff --git a/libc/str/iswalpha.c b/libc/str/iswalpha.c index fa246056c..a853a60c8 100644 --- a/libc/str/iswalpha.c +++ b/libc/str/iswalpha.c @@ -24,3 +24,5 @@ int iswalpha(wint_t c) { return iswupper(c) || iswlower(c); } + +__weak_reference(iswalpha, iswalpha_l); diff --git a/libc/str/iswalpha_l.c b/libc/str/iswalpha_l.c deleted file mode 100644 index 2382dd560..000000000 --- a/libc/str/iswalpha_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int iswalpha_l(wint_t c, locale_t l) { - return iswalpha(c); -} diff --git a/libc/str/iswblank.c b/libc/str/iswblank.c index d3af4a1ba..06c56c734 100644 --- a/libc/str/iswblank.c +++ b/libc/str/iswblank.c @@ -24,3 +24,5 @@ int iswblank(wint_t c) { return c == ' ' || c == '\t'; } + +__weak_reference(iswblank, iswblank_l); diff --git a/libc/str/iswblank_l.c b/libc/str/iswblank_l.c deleted file mode 100644 index fd2320500..000000000 --- a/libc/str/iswblank_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int iswblank_l(wint_t c, locale_t l) { - return iswblank(c); -} diff --git a/libc/str/iswcntrl.c b/libc/str/iswcntrl.c index 5ce225bcb..1197136b1 100644 --- a/libc/str/iswcntrl.c +++ b/libc/str/iswcntrl.c @@ -24,3 +24,5 @@ int iswcntrl(wint_t c) { return (0x00 <= c && c <= 0x1F) || (0x7F <= c && c <= 0x9F); } + +__weak_reference(iswcntrl, iswcntrl_l); diff --git a/libc/str/iswcntrl_l.c b/libc/str/iswcntrl_l.c deleted file mode 100644 index e38525447..000000000 --- a/libc/str/iswcntrl_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int iswcntrl_l(wint_t c, locale_t l) { - return iswcntrl(c); -} diff --git a/libc/str/iswdigit.c b/libc/str/iswdigit.c index 9a008c422..6c98046a8 100644 --- a/libc/str/iswdigit.c +++ b/libc/str/iswdigit.c @@ -24,3 +24,5 @@ int iswdigit(wint_t c) { return '0' <= c && c <= '9'; } + +__weak_reference(iswdigit, iswdigit_l); diff --git a/libc/str/iswdigit_l.c b/libc/str/iswdigit_l.c deleted file mode 100644 index 5738a1dc0..000000000 --- a/libc/str/iswdigit_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int iswdigit_l(wint_t c, locale_t l) { - return iswdigit(c); -} diff --git a/libc/str/iswgraph.c b/libc/str/iswgraph.c index b4c740b02..efe2dadba 100644 --- a/libc/str/iswgraph.c +++ b/libc/str/iswgraph.c @@ -24,3 +24,5 @@ int iswgraph(wint_t c) { return iswprint(c) && !iswspace(c); } + +__weak_reference(iswgraph, iswgraph_l); diff --git a/libc/str/iswlower.c b/libc/str/iswlower.c index 5173701c0..57d9ed92a 100644 --- a/libc/str/iswlower.c +++ b/libc/str/iswlower.c @@ -516,3 +516,5 @@ int iswlower(wint_t c) { } } } + +__weak_reference(iswlower, iswlower_l); diff --git a/libc/str/iswlower_l.c b/libc/str/iswlower_l.c deleted file mode 100644 index e5fc19f31..000000000 --- a/libc/str/iswlower_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int iswlower_l(wint_t c, locale_t l) { - return iswlower(c); -} diff --git a/libc/str/iswprint.c b/libc/str/iswprint.c index bb794f612..6f98ed127 100644 --- a/libc/str/iswprint.c +++ b/libc/str/iswprint.c @@ -25,3 +25,5 @@ int iswprint(wint_t c) { return !((0x00 <= c && c <= 0x1F) || (0x7F <= c && c <= 0x9F) || (0xFFF9 <= c && c <= 0xFFFB) || c == 0x2028 || c == 0x2029); } + +__weak_reference(iswprint, iswprint_l); diff --git a/libc/str/iswprint_l.c b/libc/str/iswprint_l.c deleted file mode 100644 index d95218571..000000000 --- a/libc/str/iswprint_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int iswprint_l(wint_t c, locale_t l) { - return iswprint(c); -} diff --git a/libc/str/iswpunct.c b/libc/str/iswpunct.c index e0410a885..df8c20ffb 100644 --- a/libc/str/iswpunct.c +++ b/libc/str/iswpunct.c @@ -539,3 +539,5 @@ int iswpunct(wint_t c) { return 0; } } + +__weak_reference(iswpunct, iswpunct_l); diff --git a/libc/str/iswpunct_l.c b/libc/str/iswpunct_l.c deleted file mode 100644 index e99c93b2b..000000000 --- a/libc/str/iswpunct_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int iswpunct_l(wint_t c, locale_t l) { - return iswpunct(c); -} diff --git a/libc/str/iswspace.c b/libc/str/iswspace.c index b1b08cd7f..8712b90a9 100644 --- a/libc/str/iswspace.c +++ b/libc/str/iswspace.c @@ -54,3 +54,5 @@ int iswspace(wint_t c) { return 0; } } + +__weak_reference(iswspace, iswspace_l); diff --git a/libc/str/iswspace_l.c b/libc/str/iswspace_l.c deleted file mode 100644 index e79eeaa74..000000000 --- a/libc/str/iswspace_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int iswspace_l(wint_t c, locale_t l) { - return iswspace(c); -} diff --git a/libc/str/iswupper.c b/libc/str/iswupper.c index d746628c4..e13ca81d8 100644 --- a/libc/str/iswupper.c +++ b/libc/str/iswupper.c @@ -160,3 +160,5 @@ int iswupper(wint_t c) { } } } + +__weak_reference(iswupper, iswupper_l); diff --git a/libc/str/iswupper_l.c b/libc/str/iswupper_l.c deleted file mode 100644 index 517eb31c9..000000000 --- a/libc/str/iswupper_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int iswupper_l(wint_t c, locale_t l) { - return iswupper(c); -} diff --git a/libc/str/iswxdigit.c b/libc/str/iswxdigit.c index 5abc42c37..dd697b03b 100644 --- a/libc/str/iswxdigit.c +++ b/libc/str/iswxdigit.c @@ -25,3 +25,5 @@ int iswxdigit(wint_t c) { return ('0' <= c && c <= '9') || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f'); } + +__weak_reference(iswxdigit, iswxdigit_l); diff --git a/libc/str/iswxdigit_l.c b/libc/str/iswxdigit_l.c deleted file mode 100644 index f7fb95fbd..000000000 --- a/libc/str/iswxdigit_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int iswxdigit_l(wint_t c, locale_t l) { - return iswxdigit(c); -} diff --git a/libc/str/isxdigit.c b/libc/str/isxdigit.c index 2aae1c040..190c7eadf 100644 --- a/libc/str/isxdigit.c +++ b/libc/str/isxdigit.c @@ -28,3 +28,5 @@ int isxdigit(int c) { return ('0' <= c && c <= '9') || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f'); } + +__weak_reference(isxdigit, isxdigit_l); diff --git a/libc/str/isxdigit_l.c b/libc/str/isxdigit_l.c deleted file mode 100644 index 1cc1214e4..000000000 --- a/libc/str/isxdigit_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int isxdigit_l(int c, locale_t l) { - return iswxdigit(c); -} diff --git a/libc/str/rindex.S b/libc/str/rindex.S deleted file mode 100644 index c90367706..000000000 --- a/libc/str/rindex.S +++ /dev/null @@ -1,27 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" - -// Returns pointer to last instance of character the BSD way. -// -// @param rdi is a non-null NUL-terminated string pointer -// @param esi is the search byte -// @return rax points to result, or NULL if not found -rindex: jmp strrchr - .endfn rindex,globl diff --git a/libc/str/strcasecmp.c b/libc/str/strcasecmp.c index cc05da1ec..70e06e8ab 100644 --- a/libc/str/strcasecmp.c +++ b/libc/str/strcasecmp.c @@ -63,3 +63,5 @@ noasan int strcasecmp(const char *a, const char *b) { return x - y; } } + +__weak_reference(strcasecmp, strcasecmp_l); diff --git a/libc/str/strcasecmp_l.c b/libc/str/strcasecmp_l.c deleted file mode 100644 index 607ed4fa1..000000000 --- a/libc/str/strcasecmp_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int strcasecmp_l(const char *a, const char *b, locale_t l) { - return strcasecmp(a, b); -} diff --git a/libc/str/strcoll.c b/libc/str/strcoll.c index aaeb9e164..b7445fa90 100644 --- a/libc/str/strcoll.c +++ b/libc/str/strcoll.c @@ -24,3 +24,5 @@ int strcoll(const char *p, const char *q) { return strcmp(p, q); } + +__weak_reference(strcoll, strcoll_l); diff --git a/libc/str/strcoll_l.c b/libc/str/strcoll_l.c deleted file mode 100644 index 4509e2654..000000000 --- a/libc/str/strcoll_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int strcoll_l(const char *p, const char *q, locale_t l) { - return strcmp(p, q); -} diff --git a/libc/str/strncasecmp.c b/libc/str/strncasecmp.c index f63658d01..d82c5296e 100644 --- a/libc/str/strncasecmp.c +++ b/libc/str/strncasecmp.c @@ -37,3 +37,5 @@ int strncasecmp(const char *a, const char *b, size_t n) { } return x - y; } + +__weak_reference(strncasecmp, strncasecmp_l); diff --git a/libc/str/strncasecmp_l.c b/libc/str/strncasecmp_l.c deleted file mode 100644 index 782313b2e..000000000 --- a/libc/str/strncasecmp_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int strncasecmp_l(const char *a, const char *b, size_t n, locale_t l) { - return strncasecmp(a, b, n); -} diff --git a/libc/str/strxfrm.c b/libc/str/strxfrm.c index 1a28b2610..ff665250f 100644 --- a/libc/str/strxfrm.c +++ b/libc/str/strxfrm.c @@ -45,3 +45,5 @@ size_t strxfrm(char *dest, const char *src, size_t count) { _unassert(dest == NULL ? count == 0 : 1); return strlcpy(dest, src, count); } + +__weak_reference(strxfrm, strxfrm_l); diff --git a/libc/str/strxfrm_l.c b/libc/str/strxfrm_l.c deleted file mode 100644 index 6672189f1..000000000 --- a/libc/str/strxfrm_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -size_t strxfrm_l(char *dest, const char *src, size_t count, locale_t l) { - return strxfrm(dest, src, count); -} diff --git a/libc/str/toascii.c b/libc/str/toascii.c index e631a798c..acf7b039c 100644 --- a/libc/str/toascii.c +++ b/libc/str/toascii.c @@ -21,3 +21,5 @@ int toascii(int c) { return c & 127; } + +__weak_reference(toascii, toascii_l); diff --git a/libc/str/tolower.c b/libc/str/tolower.c index 7b0d7b8ae..91956e17b 100644 --- a/libc/str/tolower.c +++ b/libc/str/tolower.c @@ -24,3 +24,5 @@ int tolower(int c) { return 'A' <= c && c <= 'Z' ? c + ('a' - 'A') : c; } + +__weak_reference(tolower, tolower_l); diff --git a/libc/str/tolower_l.c b/libc/str/tolower_l.c deleted file mode 100644 index 91ad9fd0a..000000000 --- a/libc/str/tolower_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int tolower_l(int c, locale_t l) { - return tolower(c); -} diff --git a/libc/str/toupper.c b/libc/str/toupper.c index 28f4f21b3..e7ce4e1c8 100644 --- a/libc/str/toupper.c +++ b/libc/str/toupper.c @@ -24,3 +24,5 @@ int toupper(int c) { return 'a' <= c && c <= 'z' ? c - ('a' - 'A') : c; } + +__weak_reference(toupper, toupper_l); diff --git a/libc/str/toupper_l.c b/libc/str/toupper_l.c deleted file mode 100644 index 47fb05bd3..000000000 --- a/libc/str/toupper_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int toupper_l(int c, locale_t l) { - return toupper(c); -} diff --git a/libc/str/towlower.c b/libc/str/towlower.c index fcea20604..93cacfd9d 100644 --- a/libc/str/towlower.c +++ b/libc/str/towlower.c @@ -232,3 +232,5 @@ wint_t towlower(wint_t c) { } } } + +__weak_reference(towlower, towlower_l); diff --git a/libc/str/towlower_l.c b/libc/str/towlower_l.c deleted file mode 100644 index 0f9bd9ca0..000000000 --- a/libc/str/towlower_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -wint_t towlower_l(wint_t c, locale_t l) { - return towlower(c); -} diff --git a/libc/str/towupper.c b/libc/str/towupper.c index 26126f505..791d425b4 100644 --- a/libc/str/towupper.c +++ b/libc/str/towupper.c @@ -195,3 +195,5 @@ wint_t towupper(wint_t c) { } } } + +__weak_reference(towupper, towupper_l); diff --git a/libc/str/towupper_l.c b/libc/str/towupper_l.c deleted file mode 100644 index f8498db9b..000000000 --- a/libc/str/towupper_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -wint_t towupper_l(wint_t c, locale_t l) { - return towupper(c); -} diff --git a/libc/str/wcscmp.c b/libc/str/wcscmp.c index 2a39814b1..3a0f49e57 100644 --- a/libc/str/wcscmp.c +++ b/libc/str/wcscmp.c @@ -32,3 +32,6 @@ int wcscmp(const wchar_t *a, const wchar_t *b) { while (a[i] == b[i] && b[i]) ++i; return (int)a[i] < (int)b[i] ? -1 : (int)a[i] > (int)b[i]; } + +__weak_reference(wcscmp, wcscoll); +__weak_reference(wcscmp, wcscoll_l); diff --git a/libc/str/wcscoll_l.c b/libc/str/wcscoll_l.c deleted file mode 100644 index a4e5e27f6..000000000 --- a/libc/str/wcscoll_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -int wcscoll_l(const wchar_t *p, const wchar_t *q, locale_t l) { - return wcscmp(p, q); -} diff --git a/libc/str/wcsxfrm.c b/libc/str/wcsxfrm.c index 28a96d245..35d6d79f4 100644 --- a/libc/str/wcsxfrm.c +++ b/libc/str/wcsxfrm.c @@ -29,3 +29,5 @@ size_t wcsxfrm(wchar_t *d, const wchar_t *s, size_t n) { } return m; } + +__weak_reference(wcsxfrm, wcsxfrm_l); diff --git a/libc/str/wcsxfrm_l.c b/libc/str/wcsxfrm_l.c deleted file mode 100644 index 9c11f6869..000000000 --- a/libc/str/wcsxfrm_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/str/locale.h" -#include "libc/str/str.h" - -size_t wcsxfrm_l(wchar_t *dest, const wchar_t *src, size_t count, locale_t l) { - return wcsxfrm(dest, src, count); -} diff --git a/libc/time/struct/tm.h b/libc/time/struct/tm.h index c682aec01..945d5926f 100644 --- a/libc/time/struct/tm.h +++ b/libc/time/struct/tm.h @@ -19,8 +19,6 @@ struct tm { char *asctime(const struct tm *); char *asctime_r(const struct tm *, char[hasatleast 26]); -char *iso8601(char[hasatleast 20], struct tm *); -char *iso8601us(char[hasatleast 27], struct tm *, long); char *strptime(const char *, const char *, struct tm *); int64_t mktime(struct tm *); int64_t timegm(struct tm *); @@ -34,6 +32,13 @@ struct tm *gmtime_r(const int64_t *, struct tm *); struct tm *localtime(const int64_t *); struct tm *localtime_r(const int64_t *, struct tm *); +#ifdef COSMO +#define iso8601 __iso8601 +#define iso8601us __iso8601us +char *iso8601(char[hasatleast 20], struct tm *); +char *iso8601us(char[hasatleast 27], struct tm *, long); +#endif /* COSMO */ + COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_TIME_STRUCT_TM_H_ */ diff --git a/libc/x/x.h b/libc/x/x.h index ae4a07cab..0c5e4ed03 100644 --- a/libc/x/x.h +++ b/libc/x/x.h @@ -2,6 +2,44 @@ #define COSMOPOLITAN_LIBC_X_H_ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ +#ifdef COSMO + +#define xwrite __xwrite +#define xdie __xdie +#define xdtoa __xdtoa +#define xdtoaf __xdtoaf +#define xdtoal __xdtoal +#define xmalloc __xmalloc +#define xrealloc __xrealloc +#define xcalloc __xcalloc +#define xvalloc __xvalloc +#define xmemalign __xmemalign +#define xmemalignzero __xmemalignzero +#define xstrdup __xstrdup +#define xstrndup __xstrndup +#define xstrmul __xstrmul +#define xinet_ntop __xinet_ntop +#define xunbinga __xunbinga +#define xunbing __xunbing +#define utf8to16 __utf8to16 +#define utf16to8 __utf16to8 +#define utf8to32 __utf8to32 +#define utf16to32 __utf16to32 +#define utf32to8 __utf32to8 +#define xhomedir __xhomedir +#define xstripext __xstripext +#define xstripexts __xstripexts +#define xload __xload +#define xloadzd __xloadzd +#define rmrf __rmrf +#define xbasename __xbasename +#define xdirname __xdirname +#define xjoinpaths __xjoinpaths +#define xreadlink __xreadlink +#define xreadlinkat __xreadlinkat +#define xfixpath __xfixpath +#define xslurp __xslurp +#define xbarf __xbarf int xwrite(int, const void *, uint64_t); void xdie(void) wontreturn; @@ -68,6 +106,7 @@ void *xslurp(const char *, size_t *) returnsaligned((PAGESIZE)) dontdiscard; int xbarf(const char *, const void *, size_t); +#endif /* COSMO */ COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_X_H_ */ diff --git a/libc/x/xbarf.c b/libc/x/xbarf.c index 9041dca8d..e6c6d9ed6 100644 --- a/libc/x/xbarf.c +++ b/libc/x/xbarf.c @@ -21,6 +21,7 @@ #include "libc/str/str.h" #include "libc/sysv/consts/madv.h" #include "libc/sysv/consts/o.h" +#include "libc/x/x.h" /** * Writes data to file. diff --git a/libc/x/xslurp.c b/libc/x/xslurp.c index b43cf2f87..1a1a85e6b 100644 --- a/libc/x/xslurp.c +++ b/libc/x/xslurp.c @@ -23,6 +23,7 @@ #include "libc/runtime/runtime.h" #include "libc/sysv/consts/madv.h" #include "libc/sysv/consts/o.h" +#include "libc/x/x.h" /** * Reads entire file into memory. diff --git a/test/libc/fmt/lengthuint64_test.c b/test/libc/fmt/lengthuint64_test.c index fbc8b1605..bbfd93fba 100644 --- a/test/libc/fmt/lengthuint64_test.c +++ b/test/libc/fmt/lengthuint64_test.c @@ -95,10 +95,10 @@ TEST(LengthInt64Thousands, test) { } BENCH(LengthInt64, bench) { - unsigned LengthInt64_(int64_t) asm("LengthInt64"); - unsigned LengthUint64_(uint64_t) asm("LengthUint64"); - unsigned LengthInt64Thousands_(int64_t) asm("LengthInt64Thousands"); - unsigned LengthUint64Thousands_(uint64_t) asm("LengthUint64Thousands"); + unsigned LengthInt64_(int64_t) asm("__LengthInt64"); + unsigned LengthUint64_(uint64_t) asm("__LengthUint64"); + unsigned LengthInt64Thousands_(int64_t) asm("__LengthInt64Thousands"); + unsigned LengthUint64Thousands_(uint64_t) asm("__LengthUint64Thousands"); EZBENCH2("LengthInt64", donothing, LengthInt64_(INT64_MIN)); EZBENCH2("LengthUint64", donothing, LengthUint64_(UINT64_MAX)); EZBENCH2("LengthInt64Thousands", donothing, LengthInt64Thousands_(INT64_MIN)); diff --git a/third_party/make/ar.c b/third_party/make/ar.c index 9bf476220..696647305 100644 --- a/third_party/make/ar.c +++ b/third_party/make/ar.c @@ -193,7 +193,7 @@ ar_glob_match (int desc UNUSED, const char *mem, int truncated UNUSED, if (fnmatch (state->pattern, mem, FNM_PATHNAME|FNM_PERIOD) == 0) { /* We have a match. Add it to the chain. */ - struct nameseq *new = xcalloc (state->size); + struct nameseq *new = xcalloc (1, state->size); new->name = strcache_add(concat(4, state->arname, "(", mem, ")")); new->next = state->chain; state->chain = new; diff --git a/third_party/make/dep.h b/third_party/make/dep.h index b816ff62c..a5237b550 100644 --- a/third_party/make/dep.h +++ b/third_party/make/dep.h @@ -15,6 +15,7 @@ A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ +#include "libc/x/x.h" /* Structure used in chains of names, for parsing and globbing. */ @@ -98,7 +99,7 @@ struct nameseq *ar_glob (const char *arname, const char *member_pattern, size_t #define dep_name(d) ((d)->name ? (d)->name : (d)->file->name) -#define alloc_seq_elt(_t) xcalloc (sizeof (_t)) +#define alloc_seq_elt(_t) xcalloc (1, sizeof (_t)) void free_ns_chain (struct nameseq *n); #if defined(MAKE_MAINTAINER_MODE) && defined(__GNUC__) && !defined(__STRICT_ANSI__) diff --git a/third_party/make/dir.c b/third_party/make/dir.c index 37e22820f..363e957de 100644 --- a/third_party/make/dir.c +++ b/third_party/make/dir.c @@ -17,6 +17,7 @@ this program. If not, see . */ #include "third_party/make/makeint.inc" /**/ #include "libc/calls/struct/dirent.h" +#include "libc/x/x.h" #include "third_party/make/dep.h" #include "third_party/make/filedef.h" #include "third_party/make/hash.h" @@ -584,7 +585,7 @@ void file_impossible(const char *filename) { if (dir->contents == 0) /* The directory could not be stat'd. We allocate a contents structure for it, but leave it out of the contents hash table. */ - dir->contents = xcalloc(sizeof(struct directory_contents)); + dir->contents = xcalloc(1, sizeof(struct directory_contents)); if (dir->contents->dirfiles.ht_vec == 0) { hash_init(&dir->contents->dirfiles, DIRFILE_BUCKETS, dirfile_hash_1, diff --git a/third_party/make/expand.c b/third_party/make/expand.c index 713acd6a9..dec21e2fd 100644 --- a/third_party/make/expand.c +++ b/third_party/make/expand.c @@ -21,6 +21,7 @@ this program. If not, see . */ #include "third_party/make/job.h" #include "third_party/make/commands.h" #include "third_party/make/variable.h" +#include "libc/x/x.h" #include "third_party/make/rule.h" /* Initially, any errors reported when expanding strings will be reported diff --git a/third_party/make/file.c b/third_party/make/file.c index 64c19216d..010ce1265 100644 --- a/third_party/make/file.c +++ b/third_party/make/file.c @@ -130,7 +130,7 @@ enter_file (const char *name) return f; } - new = xcalloc (sizeof (struct file)); + new = xcalloc (1, sizeof (struct file)); new->name = new->hname = name; new->update_status = us_none; diff --git a/third_party/make/hash.c b/third_party/make/hash.c index 798edb5a6..d2e321418 100644 --- a/third_party/make/hash.c +++ b/third_party/make/hash.c @@ -21,10 +21,11 @@ this program. If not, see . */ #include "libc/intrin/bsr.h" #include "libc/intrin/likely.h" #include "libc/log/check.h" +#include "libc/x/x.h" #include "third_party/make/hash.h" /* clang-format off */ -#define CALLOC(t, n) ((t *) xcalloc (sizeof (t) * (n))) +#define CALLOC(t, n) ((t *) xcalloc (1, sizeof (t) * (n))) #define MALLOC(t, n) ((t *) xmalloc (sizeof (t) * (n))) #define REALLOC(o, t, n) ((t *) xrealloc ((o), sizeof (t) * (n))) #define CLONE(o, t, n) ((t *) memcpy (MALLOC (t, (n)), (o), sizeof (t) * (n))) diff --git a/third_party/make/job.c b/third_party/make/job.c index e0bf03a19..29ae16217 100644 --- a/third_party/make/job.c +++ b/third_party/make/job.c @@ -1315,7 +1315,7 @@ new_job (struct file *file) /* Start the command sequence, record it in a new 'struct child', and add that to the chain. */ - c = xcalloc (sizeof (struct child)); + c = xcalloc (1, sizeof (struct child)); output_init (&c->output); c->file = file; diff --git a/third_party/make/makeint.inc b/third_party/make/makeint.inc index 192e84fa4..3f5ca5f14 100644 --- a/third_party/make/makeint.inc +++ b/third_party/make/makeint.inc @@ -50,7 +50,6 @@ this program. If not, see . */ #include "libc/sysv/consts/w.h" #include "libc/time/struct/tm.h" #include "libc/time/time.h" -#include "libc/x/x.h" #include "third_party/gdtoa/gdtoa.h" #include "third_party/musl/glob.h" /* clang-format off */ @@ -395,8 +394,6 @@ void pfatal_with_name (const char *) NORETURN; void perror_with_name (const char *, const char *); #define xstrlen(_s) ((_s)==NULL ? 0 : strlen (_s)) void *xmalloc (size_t); -// void *xcalloc (size_t); -#define xcalloc(size) ((xcalloc)(1, (size))) void *xrealloc (void *, size_t); char *xstrdup (const char *); char *xstrndup (const char *, size_t); diff --git a/third_party/make/read.c b/third_party/make/read.c index ddf8da149..3e67ee375 100644 --- a/third_party/make/read.c +++ b/third_party/make/read.c @@ -3121,7 +3121,7 @@ parse_file_seq (char **stringp, size_t size, int stopmap, struct nameseq **newp = &new; #define NEWELT(_n) do { \ const char *__n = (_n); \ - *newp = xcalloc (size); \ + *newp = xcalloc (1, size); \ (*newp)->name = (cachep ? strcache_add (__n) : xstrdup (__n)); \ newp = &(*newp)->next; \ } while(0) diff --git a/third_party/make/variable.c b/third_party/make/variable.c index 7f7582bad..1097a3abe 100644 --- a/third_party/make/variable.c +++ b/third_party/make/variable.c @@ -47,7 +47,7 @@ struct pattern_var * create_pattern_var (const char *target, const char *suffix) { size_t len = strlen (target); - struct pattern_var *p = xcalloc (sizeof (struct pattern_var)); + struct pattern_var *p = xcalloc (1, sizeof (struct pattern_var)); if (pattern_vars != 0) { @@ -235,7 +235,7 @@ define_variable_in_set (const char *name, size_t length, /* Create a new variable definition and add it to the hash table. */ - v = xcalloc (sizeof (struct variable)); + v = xcalloc (1, sizeof (struct variable)); v->name = xstrndup (name, length); v->length = (unsigned int) length; hash_insert_at (&set->table, v, var_slot); diff --git a/third_party/sed/compile.c b/third_party/sed/compile.c index f50e8c20b..f610c309c 100644 --- a/third_party/sed/compile.c +++ b/third_party/sed/compile.c @@ -164,7 +164,7 @@ compile(void) fixuplabel(prog, NULL); uselabel(); if (appendnum > 0) - appends = xmalloc(sizeof(struct s_appends) * appendnum); + appends_ = xmalloc(sizeof(struct s_appends) * appendnum); g_match = xmalloc((maxnsub + 1) * sizeof(regmatch_t)); } diff --git a/third_party/sed/extern.h b/third_party/sed/extern.h index c39caa36d..8fcb5f414 100644 --- a/third_party/sed/extern.h +++ b/third_party/sed/extern.h @@ -9,7 +9,7 @@ COSMOPOLITAN_C_START_ // clang-format off extern struct s_command *prog; -extern struct s_appends *appends; +extern struct s_appends *appends_; extern regmatch_t *g_match; extern size_t maxnsub; extern u_long linenum; diff --git a/third_party/zip/osdep.h b/third_party/zip/osdep.h index 90c58457e..c2dfca459 100644 --- a/third_party/zip/osdep.h +++ b/third_party/zip/osdep.h @@ -33,7 +33,6 @@ #include "libc/thread/thread.h" #include "libc/calls/typedef/u.h" #include "libc/calls/weirdtypes.h" -#include "libc/intrin/newbie.h" #include "libc/sock/select.h" #include "libc/sysv/consts/endian.h" #include "libc/calls/calls.h" diff --git a/third_party/zip/unix.c b/third_party/zip/unix.c index aac0d93dc..b815c35c5 100644 --- a/third_party/zip/unix.c +++ b/third_party/zip/unix.c @@ -702,7 +702,6 @@ char *d; /* directory to delete */ #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__386BSD__) || \ defined(__OpenBSD__) || defined(__bsdi__) -#include "libc/intrin/newbie.h" #include "libc/calls/calls.h" #include "libc/calls/struct/rlimit.h" #include "libc/calls/struct/rusage.h" diff --git a/tool/build/calculator.c b/tool/build/calculator.c index ba146fd50..f1871005e 100644 --- a/tool/build/calculator.c +++ b/tool/build/calculator.c @@ -155,6 +155,19 @@ struct History history; struct Value stack[128]; int sp, comment, line, column, interactive; +uint32_t gray(uint32_t x) { + return x ^ (x >> 1); +} + +uint32_t ungray(uint32_t x) { + x ^= x >> 16; + x ^= x >> 8; + x ^= x >> 4; + x ^= x >> 2; + x ^= x >> 1; + return x; +} + INT Popcnt(INT x) { uint128_t word = x; return popcnt(word >> 64) + popcnt(word); diff --git a/tool/emacs/cosmo-asm-mode.el b/tool/emacs/cosmo-asm-mode.el index 26ea86309..580fa0b01 100644 --- a/tool/emacs/cosmo-asm-mode.el +++ b/tool/emacs/cosmo-asm-mode.el @@ -57,6 +57,7 @@ "gottpoff" "function" "object" + "notype" "got" "size" "gotoff"