cosmopolitan/libc/fmt/unbing.c
Jōshin 6e6fc38935
Apply clang-format update to repo (#1154)
Commit bc6c183 introduced a bunch of discrepancies between what files
look like in the repo and what clang-format says they should look like.
However, there were already a few discrepancies prior to that. Most of
these discrepancies seemed to be unintentional, but a few of them were
load-bearing (e.g., a #include that violated header ordering needing
something to have been #defined by a 'later' #include.)

I opted to take what I hope is a relatively smooth-brained approach: I
reverted the .clang-format change, ran clang-format on the whole repo,
reapplied the .clang-format change, reran clang-format again, and then
reverted the commit that contained the first run. Thus the full effect
of this PR should only be to apply the changed formatting rules to the
repo, and from skimming the results, this seems to be the case.

My work can be checked by applying the short, manual commits, and then
rerunning the command listed in the autogenerated commits (those whose
messages I have prefixed auto:) and seeing if your results agree.

It might be that the other diffs should be fixed at some point but I'm
leaving that aside for now.

fd '\.c(c|pp)?$' --print0| xargs -0 clang-format -i
2024-04-25 10:38:00 -07:00

235 lines
12 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
│ vi: set et 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/bing.internal.h"
#include "libc/macros.internal.h"
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
};
/**
* Turns CP437 unicode glyph into its binary representation.
*
* @param c is a unicode character
* @return byte representation, or -1 if ch wasn't ibm cp437
* @see bing()
*/
int unbing(int c) {
int m, l, r;
if (32 <= c && c < 127)
return c;
l = 0;
r = ARRAYLEN(kCp437i) - 1;
while (l <= r) {
m = (l & r) + ((l ^ r) >> 1); // floor((a+b)/2)
if ((kCp437i[m] >> 8) < c) {
l = m + 1;
} else if ((kCp437i[m] >> 8) > c) {
r = m - 1;
} else {
return kCp437i[m] & 255;
}
}
return -1;
}