MAGENTA,
CYAN,
GRAY,
- WHITE
+ WHITE = GRAY
};
enum {
WMAGENTA = WBLUE | WRED,
WYELLOW = WGREEN | WRED,
WWHITE = WBLUE | WGREEN | WRED
-}
+};
-static const ansi2win[] = {
+static const int ansi2win[] = {
WBLACK,
WRED,
WGREEN,
WWHITE
};
-static void win_fputs(char *str, FILE *h) {
+static int win_fputs(const char *str, FILE *h) {
/* state for translate */
int acolor;
int wcolor;
int intense = -1;
int colors[] = {-1, -1 };
int colorpos = 1;
-
+ int length = 0;
CONSOLE_SCREEN_BUFFER_INFO cinfo;
GetConsoleScreenBufferInfo (
(GMQCC_IS_STDOUT(h)) ?
icolor = cinfo.wAttributes;
while (*str) {
- if (*str == '\e')
- state = '\e';
- else if (state == '\e' && *str == '[')
+ if (*str == '\x1B')
+ state = '\x1B';
+ else if (state == '\x1B' && *str == '[')
state = '[';
else if (state == '[') {
if (*str != 'm') {
intense = WBLACK;
wcolor = icolor;
}
- else if (BLACK < acolor && acolor <= WHITE)
+ else if (BLACK <= acolor && acolor <= WHITE)
wcolor = ansi2win[acolor - 30];
else if (acolor == 90) {
/* special gray really white man */
}
SetConsoleTextAttribute (
- (h == stdout) ?
+ (GMQCC_IS_STDOUT(h)) ?
GetStdHandle(STD_OUTPUT_HANDLE) :
GetStdHandle(STD_ERROR_HANDLE),
}
} else {
fputc(*str, h);
+ length ++;
}
+ str++;
}
/* restore */
SetConsoleTextAttribute(
GetStdHandle(STD_ERROR_HANDLE),
icolor
);
+ return length;
}
#endif
ln = vfprintf(handle, fmt, va);
#else
{
- char *data = NULL;
- ln = _vscprintf(fmt, va);
- data = malloc(ln + 1);
- data[ln] = 0;
- vsprintf(data, fmt, va);
- if (GMQCC_IS_DEFINE(handle))
- win_fputs(data, handle);
- else
- ln = fputs(data, handle);
- free(data);
+ char data[4096];
+ memset(data, 0, sizeof(data));
+ vsnprintf(data, sizeof(data), fmt, va);
+ ln = (GMQCC_IS_DEFINE(handle)) ? win_fputs(data, handle) : fputs(data, handle);
}
#endif
return ln;