From 29d695f4c92bfe5c33b26faf7467e3f513f63464 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Fri, 7 Oct 2022 14:36:44 -0700 Subject: [PATCH] Make unbing() not need initialization --- libc/fmt/bing.c | 5 +- libc/fmt/unbing.c | 235 ++++++++++++++++++++++++++++++++++-------- net/turfwar/turfwar.c | 30 +++++- 3 files changed, 222 insertions(+), 48 deletions(-) diff --git a/libc/fmt/bing.c b/libc/fmt/bing.c index 92eafdbf0..9dcc6215c 100644 --- a/libc/fmt/bing.c +++ b/libc/fmt/bing.c @@ -18,7 +18,6 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/assert.h" #include "libc/fmt/bing.internal.h" -#include "libc/str/str.h" #include "libc/str/tab.internal.h" /** @@ -56,6 +55,6 @@ * @see unbing() for inverse */ int bing(int b, int intent) { - assert(0 <= b && b < 256); - return kCp437[b & 0xff]; /* TODO(jart): multimappings */ + _unassert(0 <= b && b < 256); + return kCp437[b & 0xff]; } diff --git a/libc/fmt/unbing.c b/libc/fmt/unbing.c index 9bf2c6112..89f894d96 100644 --- a/libc/fmt/unbing.c +++ b/libc/fmt/unbing.c @@ -16,40 +16,197 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/fmt/bing.internal.h" #include "libc/macros.internal.h" -#include "libc/mem/alg.h" -#include "libc/nexgen32e/nexgen32e.h" -#include "libc/runtime/runtime.h" -#include "libc/str/str.h" -#include "libc/str/tab.internal.h" -static const int kCp437iMultimappings[] = { - u'\n' << 8 | '\n', // NEWLINE - u'\r' << 8 | '\r', // CARRIAGE RETURN - u'?' << 8 | '?', // TRIGRAPH - u'\'' << 8 | '\'', // CHARACTER LITERAL - u'\"' << 8 | '\"', // STRING LITERAL - u'\\' << 8 | '\\', // ESCAPE LITERAL - u'∅' << 8 | '\0', // EMPTY SET - u'␀' << 8 | '\0', // SYMBOL FOR NULL [sic] - 0x20A7 << 8 | 0x9E, // PESETA SIGN - u'Π' << 8 | 0xE3, // GREEK CAPITAL LETTER PI - u'∏' << 8 | 0xE3, // N-ARY PRODUCT - u'∑' << 8 | 0xE4, // N-ARY SUMMATION - u'µ' << 8 | 0xE6, // MICRO SIGN - u'Ω' << 8 | 0xEA, // OHM SIGN - u'∂' << 8 | 0xEB, // PARTIAL DIFFERENTIAL - u'ϕ' << 8 | 0xED, // PHI SMALL (CLOSED FORM) - u'ε' << 8 | 0xEE, // LATIN SMALL LETTER EPSILON - u'∊' << 8 | 0xEE, // SMALL ELEMENT OF - u'∈' << 8 | 0xEE, // ELEMENT-OF SIGN - u'β' << 8 | 0xE1, // GREEK SMALL BETA - u'ſ' << 8 | 0xF4, // LATIN SMALL LETTER LONG S - u'·' << 8 | 0xFA // MIDDLE DOT +static const int kCp437i[] = { + 0x000a << 8 | 10, // \n NEWLINE + 0x000d << 8 | 13, // \r CARRIAGE RETURN + 0x0022 << 8 | 34, // " QUOTATION MARK + 0x0027 << 8 | 39, // ' APOSTROPHE + 0x003f << 8 | 63, // ? QUESTION MARK + 0x005c << 8 | 92, // \ REVERSE SOLIDUS + 0x00a0 << 8 | 0, //   NO-BREAK SPACE + 0x00a1 << 8 | 173, // ¡ INVERTED EXCLAMATION MARK + 0x00a2 << 8 | 155, // ¢ CENT SIGN + 0x00a3 << 8 | 156, // £ POUND SIGN + 0x00a5 << 8 | 157, // ¥ YEN SIGN + 0x00a7 << 8 | 21, // § SECTION SIGN + 0x00aa << 8 | 166, // ª FEMININE ORDINAL INDICATOR + 0x00ab << 8 | 174, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac << 8 | 170, // ¬ NOT SIGN + 0x00b0 << 8 | 248, // ° DEGREE SIGN + 0x00b1 << 8 | 241, // ± PLUS-MINUS SIGN + 0x00b2 << 8 | 253, // ² SUPERSCRIPT TWO + 0x00b5 << 8 | 230, // µ MICRO SIGN + 0x00b6 << 8 | 20, // ¶ PILCROW SIGN + 0x00b7 << 8 | 250, // · MIDDLE DOT + 0x00ba << 8 | 167, // º MASCULINE ORDINAL INDICATOR + 0x00bb << 8 | 175, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc << 8 | 172, // ¼ VULGAR FRACTION ONE QUARTER + 0x00bd << 8 | 171, // ½ VULGAR FRACTION ONE HALF + 0x00bf << 8 | 168, // ¿ INVERTED QUESTION MARK + 0x00c4 << 8 | 142, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5 << 8 | 143, // Å LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6 << 8 | 146, // Æ LATIN CAPITAL LETTER AE + 0x00c7 << 8 | 128, // Ç LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9 << 8 | 144, // É LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1 << 8 | 165, // Ñ LATIN CAPITAL LETTER N WITH TILDE + 0x00d6 << 8 | 153, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7 << 8 | 250, // × MULTIPLICATION SIGN + 0x00dc << 8 | 154, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df << 8 | 225, // ß LATIN SMALL LETTER SHARP S + 0x00e0 << 8 | 133, // à LATIN SMALL LETTER A WITH GRAVE + 0x00e1 << 8 | 160, // á LATIN SMALL LETTER A WITH ACUTE + 0x00e2 << 8 | 131, // â LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4 << 8 | 132, // ä LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5 << 8 | 134, // å LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6 << 8 | 145, // æ LATIN SMALL LETTER AE + 0x00e7 << 8 | 135, // ç LATIN SMALL LETTER C WITH CEDILLA + 0x00e8 << 8 | 138, // è LATIN SMALL LETTER E WITH GRAVE + 0x00e9 << 8 | 130, // é LATIN SMALL LETTER E WITH ACUTE + 0x00ea << 8 | 136, // ê LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb << 8 | 137, // ë LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec << 8 | 141, // ì LATIN SMALL LETTER I WITH GRAVE + 0x00ed << 8 | 161, // í LATIN SMALL LETTER I WITH ACUTE + 0x00ee << 8 | 140, // î LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef << 8 | 139, // ï LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1 << 8 | 164, // ñ LATIN SMALL LETTER N WITH TILDE + 0x00f2 << 8 | 149, // ò LATIN SMALL LETTER O WITH GRAVE + 0x00f3 << 8 | 162, // ó LATIN SMALL LETTER O WITH ACUTE + 0x00f4 << 8 | 147, // ô LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6 << 8 | 148, // ö LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7 << 8 | 246, // ÷ DIVISION SIGN + 0x00f9 << 8 | 151, // ù LATIN SMALL LETTER U WITH GRAVE + 0x00fa << 8 | 163, // ú LATIN SMALL LETTER U WITH ACUTE + 0x00fb << 8 | 150, // û LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc << 8 | 129, // ü LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff << 8 | 152, // ÿ LATIN SMALL LETTER Y WITH DIAERESIS + 0x017f << 8 | 244, // ſ LATIN SMALL LETTER LONG S + 0x0192 << 8 | 159, // ƒ LATIN SMALL LETTER F WITH HOOK + 0x0393 << 8 | 226, // Γ GREEK CAPITAL LETTER GAMMA + 0x0398 << 8 | 233, // Θ GREEK CAPITAL LETTER THETA + 0x03a0 << 8 | 227, // Π GREEK CAPITAL LETTER PI + 0x03a3 << 8 | 228, // Σ GREEK CAPITAL LETTER SIGMA + 0x03a6 << 8 | 232, // Φ GREEK CAPITAL LETTER PHI + 0x03a9 << 8 | 234, // Ω GREEK CAPITAL LETTER OMEGA + 0x03b1 << 8 | 224, // α GREEK SMALL LETTER ALPHA + 0x03b2 << 8 | 225, // β GREEK SMALL LETTER BETA + 0x03b4 << 8 | 235, // δ GREEK SMALL LETTER DELTA + 0x03b5 << 8 | 238, // ε GREEK SMALL LETTER EPSILON + 0x03bb << 8 | 255, // λ GREEK SMALL LETTER LAMDA + 0x03bc << 8 | 230, // μ GREEK SMALL LETTER MU + 0x03c0 << 8 | 227, // π GREEK SMALL LETTER PI + 0x03c3 << 8 | 229, // σ GREEK SMALL LETTER SIGMA + 0x03c4 << 8 | 231, // τ GREEK SMALL LETTER TAU + 0x03c6 << 8 | 237, // φ GREEK SMALL LETTER PHI + 0x03d5 << 8 | 237, // ϕ GREEK PHI SYMBOL + 0x2018 << 8 | 39, // ‘ LEFT SINGLE QUOTATION MARK + 0x201c << 8 | 34, // “ LEFT DOUBLE QUOTATION MARK + 0x2022 << 8 | 7, // • BULLET + 0x203c << 8 | 19, // ‼ DOUBLE EXCLAMATION MARK + 0x2047 << 8 | 63, // ⁇ DOUBLE QUESTION MARK + 0x207f << 8 | 252, // ⁿ SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7 << 8 | 158, // ₧ PESETA SIGN + 0x20ac << 8 | 158, // € EURO SIGN + 0x2126 << 8 | 234, // Ω OHM SIGN + 0x2190 << 8 | 27, // ← LEFTWARDS ARROW + 0x2191 << 8 | 24, // ↑ UPWARDS ARROW + 0x2192 << 8 | 26, // → RIGHTWARDS ARROW + 0x2193 << 8 | 25, // ↓ DOWNWARDS ARROW + 0x2194 << 8 | 29, // ↔ LEFT RIGHT ARROW + 0x2195 << 8 | 18, // ↕ UP DOWN ARROW + 0x21a8 << 8 | 23, // ↨ UP DOWN ARROW WITH BASE + 0x2202 << 8 | 235, // ∂ PARTIAL DIFFERENTIAL + 0x2205 << 8 | 0, // ∅ EMPTY SET + 0x2208 << 8 | 238, // ∈ ELEMENT OF + 0x220a << 8 | 238, // ∊ SMALL ELEMENT OF + 0x220f << 8 | 227, // ∏ N-ARY PRODUCT + 0x2211 << 8 | 228, // ∑ N-ARY SUMMATION + 0x2219 << 8 | 249, // ∙ BULLET OPERATOR + 0x221a << 8 | 251, // √ SQUARE ROOT + 0x221e << 8 | 236, // ∞ INFINITY + 0x221f << 8 | 28, // ∟ RIGHT ANGLE + 0x2229 << 8 | 239, // ∩ INTERSECTION + 0x2248 << 8 | 247, // ≈ ALMOST EQUAL TO + 0x2261 << 8 | 240, // ≡ IDENTICAL TO + 0x2264 << 8 | 243, // ≤ LESS-THAN OR EQUAL TO + 0x2265 << 8 | 242, // ≥ GREATER-THAN OR EQUAL TO + 0x2302 << 8 | 127, // ⌂ HOUSE + 0x2310 << 8 | 169, // ⌐ REVERSED NOT SIGN + 0x2320 << 8 | 244, // ⌠ TOP HALF INTEGRAL + 0x2321 << 8 | 245, // ⌡ BOTTOM HALF INTEGRAL + 0x2400 << 8 | 0, // ␀ SYMBOL FOR NULL + 0x2500 << 8 | 196, // ─ BOX DRAWS LIGHT HORIZONTAL + 0x2502 << 8 | 179, // │ BOX DRAWS LIGHT VERTICAL + 0x250c << 8 | 218, // ┌ BOX DRAWS LIGHT DOWN AND RIGHT + 0x2510 << 8 | 191, // ┐ BOX DRAWS LIGHT DOWN AND LEFT + 0x2514 << 8 | 192, // └ BOX DRAWS LIGHT UP AND RIGHT + 0x2518 << 8 | 217, // ┘ BOX DRAWS LIGHT UP AND LEFT + 0x251c << 8 | 195, // ├ BOX DRAWS LIGHT VERTICAL AND RIGHT + 0x2524 << 8 | 180, // ┤ BOX DRAWS LIGHT VERTICAL AND LEFT + 0x252c << 8 | 194, // ┬ BOX DRAWS LIGHT DOWN AND HORIZONTAL + 0x2534 << 8 | 193, // ┴ BOX DRAWS LIGHT UP AND HORIZONTAL + 0x253c << 8 | 197, // ┼ BOX DRAWS LIGHT VERTICAL AND HORIZONTAL + 0x2550 << 8 | 205, // ═ BOX DRAWS DOUBLE HORIZONTAL + 0x2551 << 8 | 186, // ║ BOX DRAWS DOUBLE VERTICAL + 0x2552 << 8 | 213, // ╒ BOX DRAWS DOWN SINGLE AND RIGHT DOUBLE + 0x2553 << 8 | 214, // ╓ BOX DRAWS DOWN DOUBLE AND RIGHT SINGLE + 0x2554 << 8 | 201, // ╔ BOX DRAWS DOUBLE DOWN AND RIGHT + 0x2555 << 8 | 184, // ╕ BOX DRAWS DOWN SINGLE AND LEFT DOUBLE + 0x2556 << 8 | 183, // ╖ BOX DRAWS DOWN DOUBLE AND LEFT SINGLE + 0x2557 << 8 | 187, // ╗ BOX DRAWS DOUBLE DOWN AND LEFT + 0x2558 << 8 | 212, // ╘ BOX DRAWS UP SINGLE AND RIGHT DOUBLE + 0x2559 << 8 | 211, // ╙ BOX DRAWS UP DOUBLE AND RIGHT SINGLE + 0x255a << 8 | 200, // ╚ BOX DRAWS DOUBLE UP AND RIGHT + 0x255b << 8 | 190, // ╛ BOX DRAWS UP SINGLE AND LEFT DOUBLE + 0x255c << 8 | 189, // ╜ BOX DRAWS UP DOUBLE AND LEFT SINGLE + 0x255d << 8 | 188, // ╝ BOX DRAWS DOUBLE UP AND LEFT + 0x255e << 8 | 198, // ╞ BOX DRAWS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f << 8 | 199, // ╟ BOX DRAWS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560 << 8 | 204, // ╠ BOX DRAWS DOUBLE VERTICAL AND RIGHT + 0x2561 << 8 | 181, // ╡ BOX DRAWS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562 << 8 | 182, // ╢ BOX DRAWS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563 << 8 | 185, // ╣ BOX DRAWS DOUBLE VERTICAL AND LEFT + 0x2564 << 8 | 209, // ╤ BOX DRAWS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565 << 8 | 210, // ╥ BOX DRAWS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566 << 8 | 203, // ╦ BOX DRAWS DOUBLE DOWN AND HORIZONTAL + 0x2567 << 8 | 207, // ╧ BOX DRAWS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568 << 8 | 208, // ╨ BOX DRAWS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569 << 8 | 202, // ╩ BOX DRAWS DOUBLE UP AND HORIZONTAL + 0x256a << 8 | 216, // ╪ BOX DRAWS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b << 8 | 215, // ╫ BOX DRAWS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c << 8 | 206, // ╬ BOX DRAWS DOUBLE VERTICAL AND HORIZONTAL + 0x2580 << 8 | 223, // ▀ UPPER HALF BLOCK + 0x2584 << 8 | 220, // ▄ LOWER HALF BLOCK + 0x2588 << 8 | 219, // █ FULL BLOCK + 0x258c << 8 | 221, // ▌ LEFT HALF BLOCK + 0x2590 << 8 | 222, // ▐ RIGHT HALF BLOCK + 0x2591 << 8 | 176, // ░ LIGHT SHADE + 0x2592 << 8 | 177, // ▒ MEDIUM SHADE + 0x2593 << 8 | 178, // ▓ DARK SHADE + 0x25a0 << 8 | 254, // ■ BLACK SQUARE + 0x25ac << 8 | 22, // ▬ BLACK RECTANGLE + 0x25b2 << 8 | 30, // ▲ BLACK UP-POINTING TRIANGLE + 0x25ba << 8 | 16, // ► BLACK RIGHT-POINTING POINTER + 0x25bc << 8 | 31, // ▼ BLACK DOWN-POINTING TRIANGLE + 0x25c4 << 8 | 17, // ◄ BLACK LEFT-POINTING POINTER + 0x25cb << 8 | 9, // ○ WHITE CIRCLE + 0x25d8 << 8 | 8, // ◘ INVERSE BULLET + 0x25d9 << 8 | 10, // ◙ INVERSE WHITE CIRCLE + 0x263a << 8 | 1, // ☺ WHITE SMILING FACE + 0x263b << 8 | 2, // ☻ BLACK SMILING FACE + 0x263c << 8 | 15, // ☼ WHITE SUN WITH RAYS + 0x2640 << 8 | 12, // ♀ FEMALE SIGN + 0x2642 << 8 | 11, // ♂ MALE SIGN + 0x2660 << 8 | 6, // ♠ BLACK SPADE SUIT + 0x2663 << 8 | 5, // ♣ BLACK CLUB SUIT + 0x2665 << 8 | 3, // ♥ BLACK HEART SUIT + 0x2666 << 8 | 4, // ♦ BLACK DIAMOND SUIT + 0x266a << 8 | 13, // ♪ EIGHTH NOTE + 0x266b << 8 | 14, // ♫ BEAMED EIGHTH NOTES }; -static int g_cp437i[256 + ARRAYLEN(kCp437iMultimappings)]; - /** * Turns CP437 unicode glyph into its binary representation. * @@ -59,26 +216,18 @@ static int g_cp437i[256 + ARRAYLEN(kCp437iMultimappings)]; */ int unbing(int c) { int m, l, r; + if (32 <= c && c < 127) return c; l = 0; - r = ARRAYLEN(g_cp437i) - 1; + r = ARRAYLEN(kCp437i) - 1; while (l <= r) { m = (l + r) >> 1; - if ((g_cp437i[m] >> 8) < c) { + if ((kCp437i[m] >> 8) < c) { l = m + 1; - } else if ((g_cp437i[m] >> 8) > c) { + } else if ((kCp437i[m] >> 8) > c) { r = m - 1; } else { - return g_cp437i[m] & 0xff; + return kCp437i[m] & 255; } } return -1; } - -static textstartup void g_cp437i_init() { - unsigned i; - for (i = 0; i < 256; ++i) g_cp437i[i] = kCp437[i] << 8 | i; - memcpy(g_cp437i + 256, kCp437iMultimappings, sizeof(kCp437iMultimappings)); - _intsort(g_cp437i, ARRAYLEN(g_cp437i)); -} - -const void *const g_cp437i_ctor[] initarray = {g_cp437i_init}; diff --git a/net/turfwar/turfwar.c b/net/turfwar/turfwar.c index 1567ab104..c8234edbe 100644 --- a/net/turfwar/turfwar.c +++ b/net/turfwar/turfwar.c @@ -112,10 +112,11 @@ #define INBUF_SIZE PAGESIZE #define OUTBUF_SIZE 8192 -#define GETOPTS "dvp:w:k:" +#define GETOPTS "idvp:w:k:" #define USAGE \ "\ Usage: turfwar.com [-dv] ARGS...\n\ + -i integrity check and vacuum at startup\n\ -d daemonize\n\ -v verbosity\n\ -p INT port\n\ @@ -227,6 +228,7 @@ struct Asset { }; // cli flags +bool g_integrity; bool g_daemonize; int g_port = PORT; int g_workers = WORKERS; @@ -1277,6 +1279,9 @@ static void GetOpts(int argc, char *argv[]) { int opt; while ((opt = getopt(argc, argv, GETOPTS)) != -1) { switch (opt) { + case 'i': + g_integrity = true; + break; case 'd': g_daemonize = true; break; @@ -1692,8 +1697,28 @@ void *Supervisor(void *arg) { return 0; } +void CheckDatabase(void) { + int rc; + sqlite3 *db; + if (g_integrity) { + CHECK_SQL(DbOpen("db.sqlite3", &db)); + LOG("Checking database integrity...\n"); + CHECK_SQL(sqlite3_exec(db, "PRAGMA integrity_check", 0, 0, 0)); + LOG("Vacuuming database...\n"); + CHECK_SQL(sqlite3_exec(db, "VACUUM", 0, 0, 0)); + CHECK_SQL(sqlite3_close(db)); + } + return; +OnError: + exit(1); +} + int main(int argc, char *argv[]) { - // ShowCrashReports(); + ShowCrashReports(); + + // we don't have proper futexes on these platforms + // so choose a smaller number of workers + g_workers = MIN(g_workers, 4); // user interface GetOpts(argc, argv); @@ -1722,6 +1747,7 @@ int main(int argc, char *argv[]) { // library init __enable_threads(); sqlite3_initialize(); + CheckDatabase(); // server lifecycle locks g_started = _timespec_real();