mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-08-08 19:00:27 +00:00
Bare metal VGA: use bing & unbing to map between CP437 & UTF-8
This commit is contained in:
parent
d4d24482ce
commit
88217deddc
4 changed files with 8 additions and 21 deletions
4
Makefile
4
Makefile
|
@ -111,12 +111,12 @@ include libc/linux/linux.mk # │ You can manipulate arrays
|
|||
include libc/tinymath/tinymath.mk # │ You can issue raw system calls
|
||||
include third_party/compiler_rt/compiler_rt.mk # │
|
||||
include libc/str/str.mk # │
|
||||
include libc/vga/vga.mk # │
|
||||
include third_party/xed/xed.mk # │
|
||||
include third_party/zlib/zlib.mk # │
|
||||
include libc/elf/elf.mk # │
|
||||
include ape/ape.mk # │
|
||||
include libc/fmt/fmt.mk #─┘
|
||||
include libc/fmt/fmt.mk # │
|
||||
include libc/vga/vga.mk #─┘
|
||||
include libc/calls/calls.mk #─┐
|
||||
include libc/runtime/runtime.mk # ├──SYSTEMS RUNTIME
|
||||
include libc/crt/crt.mk # │ You can issue system calls
|
||||
|
|
|
@ -51,8 +51,7 @@ LIBC_CALLS_A_DIRECTDEPS = \
|
|||
LIBC_STR \
|
||||
LIBC_STUBS \
|
||||
LIBC_SYSV_CALLS \
|
||||
LIBC_SYSV \
|
||||
LIBC_VGA
|
||||
LIBC_SYSV
|
||||
|
||||
LIBC_CALLS_A_DEPS := \
|
||||
$(call uniq,$(foreach x,$(LIBC_CALLS_A_DIRECTDEPS),$($(x))))
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/fmt/bing.internal.h"
|
||||
#include "libc/fmt/itoa.h"
|
||||
#include "libc/intrin/bits.h"
|
||||
#include "libc/intrin/safemacros.internal.h"
|
||||
|
@ -107,7 +108,7 @@ void _StartTty(struct Tty *tty, unsigned short yn, unsigned short xn,
|
|||
if (SetWcs(tty, wcs)) {
|
||||
size_t n = (size_t)yn * xn, i;
|
||||
for (i = 0; i < n; ++i)
|
||||
wcs[i] = kCp437[ccs[i].ch];
|
||||
wcs[i] = bing(ccs[i].ch, 0);
|
||||
}
|
||||
_TtyResetOutputMode(tty);
|
||||
}
|
||||
|
@ -361,20 +362,6 @@ static void TtyAdvance(struct Tty *tty) {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME(tkchia): use something more efficient and flexible like unbing(),
|
||||
* but without creating a circular library dependency.
|
||||
*/
|
||||
static int TtyUnBing(wint_t wc) {
|
||||
uint8_t c;
|
||||
if (wc >= 0x20 && wc <= 0x7E)
|
||||
return (int)(uint8_t)wc;
|
||||
for (c = 0x7F; c != 0x20; ++c)
|
||||
if (kCp437[c] == wc)
|
||||
return c;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void TtyWriteGlyph(struct Tty *tty, wint_t wc, int w) {
|
||||
uint8_t attr = TtyGetVgaAttr(tty);
|
||||
size_t i;
|
||||
|
@ -385,7 +372,7 @@ static void TtyWriteGlyph(struct Tty *tty, wint_t wc, int w) {
|
|||
TtyAdvance(tty);
|
||||
}
|
||||
i = tty->y * Xn(tty) + tty->x;
|
||||
c = TtyUnBing(wc);
|
||||
c = unbing(wc);
|
||||
if (c == -1)
|
||||
c = 0xFE;
|
||||
tty->ccs[i] = (struct VgaTextCharCell){ c, attr };
|
||||
|
|
|
@ -31,7 +31,8 @@ LIBC_VGA_A_DIRECTDEPS = \
|
|||
LIBC_SYSV \
|
||||
LIBC_STR \
|
||||
LIBC_INTRIN \
|
||||
LIBC_STUBS
|
||||
LIBC_STUBS \
|
||||
LIBC_FMT
|
||||
|
||||
LIBC_VGA_A_DEPS := \
|
||||
$(call uniq,$(foreach x,$(LIBC_VGA_A_DIRECTDEPS),$($(x))))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue