size_t winansi_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) { size_t lsize, lmemb; char *str; int rv; lsize = MIN(size, nmemb); lmemb = MAX(size, nmemb); if (lsize != 1) return fwrite(ptr, size, nmemb, stream); if (!isatty(fileno(stream))) return fwrite(ptr, size, nmemb, stream); init(); if (!console) return fwrite(ptr, size, nmemb, stream); str = xmalloc(lmemb+1); memcpy(str, ptr, lmemb); str[lmemb] = '\0'; rv = ansi_emulate(str, stream); free(str); return rv; }
int winansi_vfprintf(FILE *stream, const char *format, va_list list) { int len, rv; char small_buf[256]; char *buf = small_buf; va_list cp; if (!is_console(stream)) goto abort; va_copy(cp, list); len = vsnprintf(small_buf, sizeof(small_buf), format, cp); va_end(cp); if (len > sizeof(small_buf) - 1) { buf = malloc(len + 1); if (!buf) goto abort; len = vsnprintf(buf, len + 1, format, list); } rv = ansi_emulate(buf, stream); if (buf != small_buf) free(buf); return rv; abort: rv = vfprintf(stream, format, list); return rv; }
int winansi_fputs(const char *str, FILE *stream) { int rv; if (!is_console(stream)) return fputs(str, stream); rv = ansi_emulate(str, stream); if (rv >= 0) return 0; else return EOF; }
int winansi_puts(const char *s) { int rv; if (!isatty(STDOUT_FILENO)) return puts(s); init(); if (!console) return puts(s); rv = ansi_emulate(s, stdout); putchar('\n'); return rv; }
int winansi_vfprintf(FILE *stream, const char *format, va_list list) { int len, rv; char small_buf[256] = { 0 }; char *buf = small_buf; va_list cp; if (!isatty(fileno(stream))) goto abort; init(); if (!console) goto abort; va_copy(cp, list); len = vsnprintf(small_buf, sizeof(small_buf), format, cp); #ifdef WIN32 /* bug on long strings without that */ if (len == -1) len = _vscprintf(format, cp); #endif va_end(cp); if (len > sizeof(small_buf) - 1) { buf = malloc(len + 1); if (!buf) goto abort; len = vsnprintf(buf, len + 1, format, list); #ifdef WIN32 if (len == -1) len = _vscprintf(format, list); #endif } rv = ansi_emulate(buf, stream); if (buf != small_buf) free(buf); return rv; abort: rv = vfprintf(stream, format, list); return rv; }
int winansi_fputs(const char *str, FILE *stream) { int rv; if (!isatty(fileno(stream))) return fputs(str, stream); init(); if (!console) return fputs(str, stream); rv = ansi_emulate(str, stream); if (rv >= 0) return 0; else return EOF; }