Last active
December 24, 2023 02:05
-
-
Save louisswarren/e0f38344fd1bbe84342d6b8e18639361 to your computer and use it in GitHub Desktop.
Fullwidth text conversion without libc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <sys/syscall.h> | |
#define EOF (-1) | |
static unsigned char buf[3 * 8192]; | |
long | |
read(void) | |
{ | |
long ret; | |
__asm__ volatile ( | |
"syscall" | |
: "=a"(ret) | |
: "a"(SYS_read), "D"(0), "S"(buf), "d"(1) | |
: "rcx", "r11", "memory" | |
); | |
return ret; | |
} | |
long | |
write(long len) | |
{ | |
long ret; | |
__asm__ volatile ( | |
"syscall" | |
: "=a"(ret) | |
: "a"(SYS_write), "D"(1), "S"(buf), "d"(len) | |
: "rcx", "r11", "memory" | |
); | |
return ret; | |
} | |
void | |
fullwidth(long len) | |
{ | |
unsigned char *x = buf + len; | |
unsigned char *y = buf + sizeof(buf); | |
do { | |
--x; | |
unsigned char d = *x & 0x1f; | |
if ((*x | 0x20) > 0x60 && d < 26) { | |
*(--y) = 0xa0 + d; | |
*(--y) = 0xbc; | |
*(--y) = 0xef; | |
} else { | |
*(--y) = *x; | |
} | |
} while (buf < x); | |
long written = 0; | |
do { | |
long writelen = sizeof(buf) - (y - buf); | |
__asm__ volatile ( | |
"syscall" | |
: "=a"(written) | |
: "a"(SYS_write), "D"(1), "S"(y), "d"(writelen) | |
: "rcx", "r11", "memory" | |
); | |
y += written; | |
} while (written == -1); | |
} | |
void | |
_start(void) | |
{ | |
long len; | |
while ((len = read())) { | |
if (len == -1) | |
continue; | |
fullwidth(len); | |
} | |
/* Exit */ | |
__asm__ volatile ( | |
"syscall" | |
: | |
: "a"(SYS_exit), "D"(0) | |
); | |
__builtin_unreachable(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CFLAGS = -ffreestanding -fno-stack-protector | |
LDFLAGS = -nostdlib -static | |
fullwidth-freestanding: fullwidth-freestanding.o | |
fullwidth-freestanding.o: fullwidth-freestanding.c |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment