Make unbing() not need initialization

This commit is contained in:
Justine Tunney 2022-10-07 14:36:44 -07:00
parent 7d6835c0dd
commit 29d695f4c9
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
3 changed files with 222 additions and 48 deletions

View file

@ -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];
}

View file

@ -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};

View file

@ -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();