diff --git a/axl_io.c b/axl_io.c index 950edc4..0b32845 100644 --- a/axl_io.c +++ b/axl_io.c @@ -2,27 +2,57 @@ #include #include "axl_string.h" -i8 axl_putchar(i32 c) +i32 axl_putchar(i32 c) { - HANDLE console_handle = GetStdHandle(STD_OUTPUT_HANDLE); - - if(console_handle == INVALID_HANDLE_VALUE) - { - return AXL_EOF; - } - - i8 char_to_write = (i8)c; - DWORD bytes_written = 0; + u8 buf[4]; + int len = 0; - BOOL status = WriteConsoleA(console_handle, &char_to_write, 1, - &bytes_written, NULL); - - if(!status || bytes_written != 1) + if (c <= 0x7F) + { + buf[0] = (u8)c; + len = 1; + } + else if (c <= 0x07FF) + { + buf[0] = 0xC0 | (u8)(c >> 6); + buf[1] = 0x80 | (u8)(c & 0x3F); + len = 2; + } + else if (c <= 0xFFFF) + { + buf[0] = 0xE0 | (u8)(c >> 12); + buf[1] = 0x80 | (u8)((c >> 6) & 0x3F); + buf[2] = 0x80 | (u8)(c & 0x3F); + len = 3; + } + else if (c <= 0x10FFFF) + { + buf[0] = 0xF0 | (u8)(c >> 18); + buf[1] = 0x80 | (u8)((c >> 12) & 0x3F); + buf[2] = 0x80 | (u8)((c >> 6) & 0x3F); + buf[3] = 0x80 | (u8)(c & 0x3F); + len = 4; + } + else { return AXL_EOF; } - - return char_to_write; + + HANDLE console_handle = GetStdHandle(STD_OUTPUT_HANDLE); + if (console_handle == INVALID_HANDLE_VALUE) + { + return AXL_EOF; + } + + DWORD bytes_written = 0; + BOOL status = WriteConsoleA(console_handle, buf, len, &bytes_written, NULL); + + if (!status || bytes_written != (DWORD)len) + { + return AXL_EOF; + } + + return c; } i32 axl_puts(const i8* str) diff --git a/axl_io.h b/axl_io.h index bc72f90..50160de 100644 --- a/axl_io.h +++ b/axl_io.h @@ -4,7 +4,7 @@ #define AXL_EOF -1 #define AXL_SUCCESS 0 -i8 axl_putchar(i32 c); +i32 axl_putchar(i32 c); i32 axl_puts(const i8* str); #endif // !AXL_IO_H diff --git a/main.c b/main.c index cc0c142..71d97ca 100644 --- a/main.c +++ b/main.c @@ -1,15 +1,21 @@ #include "axl.h" +#include int _start(void) { + SetConsoleOutputCP(CP_UTF8); axl_init(); - axl_puts("Potato activated"); - axl_puts("Quack quack motherducker"); - axl_puts("Meowdy partner"); - axl_puts("I am a meat popsicle"); - axl_puts("My spoon is too big"); - axl_puts("Blin!"); + axl_puts("Привет, мир!"); + axl_puts("Hello, world!"); + axl_puts("Bonjour le monde!"); + axl_puts("Hola mundo!"); + axl_puts("こんにちは世界!"); + axl_puts("你好世界!"); + axl_puts("안녕하세요 세계!"); + axl_puts("สวัสดีชาวโลก!"); + axl_puts("नमस्ते दुनिया!"); + axl_puts("مرحبا بالعالم!"); void* fds = axl_malloc(83);