static int __win32_fputs(const char *str, HANDLE hStdout) { DWORD ret; wchar_t *wstr; wstr = get_wstring_from_utf8(str, wstr=NULL); if (WriteConsoleW(hStdout, wstr, wcslen(wstr), &ret, NULL) == 0) { free(wstr); return EOF; } free(wstr); return ret; }
int win32_putc(int c, FILE *fp) { const int fd = fileno(fp); HANDLE hStdout; DWORD ret; wchar_t wstr[3]; static int len = 0; static char buff[5], *str; if (!((fd == fileno(stdout) || fd == fileno(stderr)) && _isatty(fd) && file_system_codepage == CP_UTF8)) return putc(c, fp); hStdout = (fd == fileno(stdout)) ? GetStdHandle(STD_OUTPUT_HANDLE) : GetStdHandle(STD_ERROR_HANDLE); c &= 0xff; if (c < 0x80) { str = buff; len = 1; } if (c < 0xc0) { /* ASCII or trailer */ *str++ = c; len--; if (len == 0) { *str = '\0'; get_wstring_from_utf8(buff, wstr); if (WriteConsoleW(hStdout, wstr, wcslen(wstr), &ret, NULL) == 0) { len = 0; return EOF; } } else if (len < 0) return EOF; return c; } else if (c < 0xc2) { len = 0; return EOF; } /* illegal */ else if (c < 0xe0) len = 2; else if (c < 0xf0) len = 3; else if (c < 0xf5) len = 4; else { len = 0; return EOF; } str = buff; *str++ = c; len--; return c; }
int kpathsea_win32_putc(kpathsea kpse, int c, FILE *fp) { const int fd = fileno(fp); HANDLE hStdout; DWORD ret; wchar_t wstr[3]; if (!((fd == fileno(stdout) || fd == fileno(stderr)) && _isatty(fd) && kpse->File_system_codepage == CP_UTF8)) return putc(c, fp); hStdout = (fd == fileno(stdout)) ? GetStdHandle(STD_OUTPUT_HANDLE) : GetStdHandle(STD_ERROR_HANDLE); c &= 0xff; if (c < 0x80) { kpse->st_str = kpse->st_buff; kpse->st_len = 1; } if (c < 0xc0) { /* ASCII or trailer */ *(kpse->st_str)++ = c; kpse->st_len--; if (kpse->st_len == 0) { *(kpse->st_str) = '\0'; get_wstring_from_utf8(kpse->st_buff, wstr); if (WriteConsoleW(hStdout, wstr, wcslen(wstr), &ret, NULL) == 0) { kpse->st_len = 0; return EOF; } } else if (kpse->st_len < 0) return EOF; return c; } else if (c < 0xc2) { kpse->st_len = 0; return EOF; } /* illegal */ else if (c < 0xe0) kpse->st_len = 2; else if (c < 0xf0) kpse->st_len = 3; else if (c < 0xf5) kpse->st_len = 4; else { kpse->st_len = 0; return EOF; } kpse->st_str = kpse->st_buff; *(kpse->st_str)++ = c; kpse->st_len--; return c; }