* SOFTWARE.
*/
#include "gmqcc.h"
+#include <stdio.h>
/*
* isatty/STDERR_FILENO/STDOUT_FILNO
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 icolor;
int state;
- int place;
/* attributes */
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),
state = -1;
}
} else {
- fputc(*str, h);
+ file_putc(*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))
- ln = 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) : file_puts(data, handle);
}
#endif
return ln;
void con_close() {
if (!GMQCC_IS_DEFINE(console.handle_err))
- fclose(console.handle_err);
+ file_close(console.handle_err);
if (!GMQCC_IS_DEFINE(console.handle_out))
- fclose(console.handle_out);
+ file_close(console.handle_out);
}
void con_color(int state) {
int con_change(const char *out, const char *err) {
con_close();
+ if (!out) out = (const char *)((!console.handle_out) ? stdout : console.handle_out);
+ if (!err) err = (const char *)((!console.handle_err) ? stderr : console.handle_err);
+
if (GMQCC_IS_DEFINE(out)) {
console.handle_out = GMQCC_IS_STDOUT(out) ? stdout : stderr;
con_enablecolor();
- } else if (!(console.handle_out = fopen(out, "w"))) return 0;
+ } else if (!(console.handle_out = file_open(out, "w"))) return 0;
if (GMQCC_IS_DEFINE(err)) {
console.handle_err = GMQCC_IS_STDOUT(err) ? stdout : stderr;
con_enablecolor();
- } else if (!(console.handle_err = fopen(err, "w"))) return 0;
+ } else if (!(console.handle_err = file_open(err, "w"))) return 0;
/* no buffering */
setvbuf(console.handle_out, NULL, _IONBF, 0);
else
++compile_warnings;
- con_vprintmsg_c(lvl, ctx.file, ctx.line, (opts.werror ? "error" : "warning"), fmt, ap, warn_name);
+ con_vprintmsg_c(lvl, ctx.file, ctx.line, ((lvl == LVL_ERROR) ? "error" : "warning"), fmt, ap, warn_name);
return OPTS_WERROR(warntype);
}