diff --git a/SDK/CRT/STDIO/wprintf.c b/SDK/CRT/STDIO/wprintf.c new file mode 100644 index 0000000..196f60d --- /dev/null +++ b/SDK/CRT/STDIO/wprintf.c @@ -0,0 +1,92 @@ +/*++ + +Copyright (c) 2024, Quinn Stephens. +Provided under the BSD 3-Clause license. + +Module Name: + + printf.c + +Abstract: + + Provides wide formatted string printing routines. + +--*/ + +#include + +static +size_t +print_hex ( + wchar_t *wcs, + size_t maxlen, + unsigned int num + ) + +{ + wchar_t *dest; + size_t n; + int shift; + unsigned int x; + + dest = wcs; + n = 0; + shift = 28; + while (n < maxlen && shift >= 0) { + x = (num >> shift) & 0xf; + if (x >= 0xa) { + *dest = 'a' + (x - 0xa); + } else { + *dest = '0' + x; + } + + dest++; + n++; + shift -= 4; + } + + return n; +} + +int +vswprintf ( + wchar_t *wcs, + size_t maxlen, + const wchar_t *format, + va_list args + ) + +{ + wchar_t *dest; + size_t n, size; + + dest = wcs; + n = 0; + while (n < maxlen && *format != '\0') { + if (*format != '%') { + *dest++ = *format++; + n++; + continue; + } + + format++; + switch (*format) { + case 'x': + size = print_hex(dest, maxlen - n, va_arg(args, unsigned int)); + n += size; + dest += size; + format++; + break; + case '\0': + break; + case '%': + default: + *dest++ = *format++; + n++; + break; + } + } + + wcs[n] = '\0'; + return (int)n; +} diff --git a/SDK/INC/CRT/wchar.h b/SDK/INC/CRT/wchar.h index 67fac60..c7e0e15 100644 --- a/SDK/INC/CRT/wchar.h +++ b/SDK/INC/CRT/wchar.h @@ -22,6 +22,7 @@ Abstract: extern "C" { #endif +#include #include size_t wcslen(const wchar_t *str); @@ -35,6 +36,8 @@ wchar_t *wmemset(wchar_t *dest, wchar_t c, size_t count); wchar_t *wmemcpy(wchar_t *dest, const wchar_t *src, size_t count); wchar_t *wmemmove(wchar_t *dest, const wchar_t *src, size_t count); +int vswprintf(wchar_t *wcs, size_t maxlen, const wchar_t *format, va_list args); + #ifdef __cplusplus } #endif