From c93a4661a3caff5b4d045bfd9d1f4ceccdf4b072 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Thu, 4 Feb 2021 03:30:47 -0800 Subject: [PATCH] Add Cosmopolitan Honeybadger to README.md --- README.md | 2 ++ libc/intrin/asan.c | 4 ++-- libc/str/decodentsutf16.c | 41 ---------------------------------- libc/str/undeflate.c | 18 +++++++-------- tool/build/blinkenlights.c | 13 +++++++++-- tool/build/lib/dis.c | 10 +++++++-- tool/build/lib/loader.c | 2 +- usr/share/img/honeybadger.png | Bin 0 -> 21281 bytes 8 files changed, 32 insertions(+), 58 deletions(-) delete mode 100644 libc/str/decodentsutf16.c create mode 100644 usr/share/img/honeybadger.png diff --git a/README.md b/README.md index 2b00b5ab4..793536229 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +![Cosmopolitan Honeybadger](usr/share/img/honeybadger.png) + # Cosmopolitan [Cosmopolitan Libc](https://justine.lol/cosmopolitan/index.html) makes C diff --git a/libc/intrin/asan.c b/libc/intrin/asan.c index 70dbdd877..3d029d2dd 100644 --- a/libc/intrin/asan.c +++ b/libc/intrin/asan.c @@ -321,7 +321,7 @@ static size_t __asan_int2str(int64_t i, char *a) { return 1 + __asan_uint2str(-i, a); } -flattenout void __asan_poison(uintptr_t p, size_t n, int kind) { +void __asan_poison(uintptr_t p, size_t n, int kind) { int k; char *s; if (!n) return; @@ -343,7 +343,7 @@ flattenout void __asan_poison(uintptr_t p, size_t n, int kind) { } } -flattenout void __asan_unpoison(uintptr_t p, size_t n) { +void __asan_unpoison(uintptr_t p, size_t n) { int k; char *s; if (!n) return; diff --git a/libc/str/decodentsutf16.c b/libc/str/decodentsutf16.c deleted file mode 100644 index b0ff37546..000000000 --- a/libc/str/decodentsutf16.c +++ /dev/null @@ -1,41 +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/str/str.h" -#include "libc/str/utf16.h" - -/** - * Helps runtime decode UTF-16 with slightly smaller code size. - */ -wint_t DecodeNtsUtf16(const char16_t **s) { - wint_t x, y; - for (;;) { - if (!(x = *(*s)++)) break; - if (IsUtf16Cont(x)) continue; - if (IsUcs2(x)) { - return x; - } else { - if ((y = *(*s)++)) { - return MergeUtf16(x, y); - } else { - return 0; - } - } - } - return x; -} diff --git a/libc/str/undeflate.c b/libc/str/undeflate.c index 9c7523159..b79ed1e5a 100644 --- a/libc/str/undeflate.c +++ b/libc/str/undeflate.c @@ -69,8 +69,8 @@ static const struct DeflateConsts { {{144, 8}, {112, 9}, {24, 7}, {8, 8}, {32, 5}, {0, 0}}, }; -static noasan uint32_t undeflatetree(struct DeflateState *ds, uint32_t *tree, - const uint8_t *lens, size_t symcount) { +static uint32_t undeflatetree(struct DeflateState *ds, uint32_t *tree, + const uint8_t *lens, size_t symcount) { size_t i, len; uint32_t code, slot; uint16_t codes[16], first[16], counts[16]; @@ -96,10 +96,10 @@ static noasan uint32_t undeflatetree(struct DeflateState *ds, uint32_t *tree, return first[15]; } -static noasan struct DeflateHold undeflatesymbol(struct DeflateHold hold, - const uint32_t *tree, - size_t treecount, - uint32_t *out_symbol) { +static struct DeflateHold undeflatesymbol(struct DeflateHold hold, + const uint32_t *tree, + size_t treecount, + uint32_t *out_symbol) { size_t left, right, m; uint32_t search, key; left = 0; @@ -122,8 +122,6 @@ static noasan struct DeflateHold undeflatesymbol(struct DeflateHold hold, return hold; } -/* TODO(jart): Do we really need noasan? */ - /** * Decompresses raw DEFLATE data. * @@ -134,8 +132,8 @@ static noasan struct DeflateHold undeflatesymbol(struct DeflateHold hold, * are part of the design of this algorithm * @note h/t Phil Katz, David Huffman, Claude Shannon */ -noasan ssize_t undeflate(void *output, size_t outputsize, void *input, - size_t inputsize, struct DeflateState *ds) { +ssize_t undeflate(void *output, size_t outputsize, void *input, + size_t inputsize, struct DeflateState *ds) { struct DeflateHold hold; bool isfinalblock; size_t i, nlit, ndist; diff --git a/tool/build/blinkenlights.c b/tool/build/blinkenlights.c index 0e14cd992..82be8de2f 100644 --- a/tool/build/blinkenlights.c +++ b/tool/build/blinkenlights.c @@ -50,6 +50,7 @@ #include "libc/str/str.h" #include "libc/str/thompike.h" #include "libc/str/tpdecode.internal.h" +#include "libc/str/tpenc.h" #include "libc/str/tpencode.internal.h" #include "libc/sysv/consts/auxv.h" #include "libc/sysv/consts/ex.h" @@ -1957,12 +1958,16 @@ static int GetVidyaByte(unsigned char b) { } static void OnVidyaServiceWriteCharacter(void) { + uint64_t w; int i, n, y, x; char *p, buf[32]; p = buf; p += FormatCga(m->bx[0], p); p = stpcpy(p, "\e7"); - p += tpencode(p, 8, GetVidyaByte(m->ax[0]), false); + w = tpenc(GetVidyaByte(m->ax[0])); + do { + *p++ = w; + } while ((w >>= 8)); p = stpcpy(p, "\e8"); for (i = Read16(m->cx); i--;) { PtyWrite(pty, buf, p - buf); @@ -1984,9 +1989,13 @@ static char16_t VidyaServiceXlatTeletype(uint8_t c) { static void OnVidyaServiceTeletypeOutput(void) { int n; + uint64_t w; char buf[12]; n = FormatCga(m->bx[0], buf); - n += tpencode(buf + n, 6, VidyaServiceXlatTeletype(m->ax[0]), false); + w = tpenc(VidyaServiceXlatTeletype(m->ax[0])); + do { + buf[n++] = w; + } while ((w >>= 8)); PtyWrite(pty, buf, n); } diff --git a/tool/build/lib/dis.c b/tool/build/lib/dis.c index 91c01244b..24b008cbb 100644 --- a/tool/build/lib/dis.c +++ b/tool/build/lib/dis.c @@ -28,7 +28,7 @@ #include "libc/mem/mem.h" #include "libc/runtime/runtime.h" #include "libc/str/str.h" -#include "libc/str/tpencode.internal.h" +#include "libc/str/tpenc.h" #include "third_party/xed/x86.h" #include "tool/build/lib/case.h" #include "tool/build/lib/demangle.h" @@ -134,12 +134,18 @@ static char *DisLineCode(struct Dis *d, char *p) { static char *DisLineData(struct Dis *d, char *p, const uint8_t *b, size_t n) { size_t i; + uint64_t w; p = DisColumn(DisAddr(d, p), p, ADDRLEN); p = DisColumn(DisByte(p, b, n), p, 64); p = HighStart(p, g_high.comment); *p++ = '#'; *p++ = ' '; - for (i = 0; i < n; ++i) p += tpencode(p, 8, bing(b[i], 0), false); + for (i = 0; i < n; ++i) { + w = tpenc(bing(b[i], 0)); + do { + *p++ = w; + } while ((w >>= 8)); + } p = HighEnd(p); *p = '\0'; return p; diff --git a/tool/build/lib/loader.c b/tool/build/lib/loader.c index e1d5ddce7..ed3313bdb 100644 --- a/tool/build/lib/loader.c +++ b/tool/build/lib/loader.c @@ -140,7 +140,7 @@ void LoadProgram(struct Machine *m, const char *prog, char **args, char **vars, size_t i, mappedsize; DCHECK_NOTNULL(prog); elf->prog = prog; - if ((fd = open(prog, O_RDONLY)) == -1 || + if ((fd = open(prog, O_RDWR)) == -1 || (fstat(fd, &st) == -1 || !st.st_size)) { fputs(prog, stderr); fputs(": not found\n", stderr); diff --git a/usr/share/img/honeybadger.png b/usr/share/img/honeybadger.png new file mode 100644 index 0000000000000000000000000000000000000000..6f9d154fa72ccb03e5053f8762c46ce6e9d35d8d GIT binary patch literal 21281 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