CONSOLE_SCREEN_BUFFER_INFO cinfo;
GetConsoleScreenBufferInfo(
- (h == stdout) ?
+ (GMQCC_IS_STDOUT(h)) ?
GetStdHandle(STD_OUTPUT_HANDLE) :
GetStdHandle(STD_ERROR_HANDLE), &cinfo
);
}
/* restore */
SetConsoleTextAttribute(
- (h == stdout) ?
+ (GMQCC_IS_STDOUT(h)) ?
GetStdHandle(STD_OUTPUT_HANDLE) :
GetStdHandle(STD_ERROR_HANDLE),
icolor
con_close();
if (GMQCC_IS_DEFINE((FILE*)out)) {
- console.handle_out = (((FILE*)err) == stdout) ? stdout : stderr;
+ console.handle_out = (((FILE*)out) == stdout) ? stdout : stderr;
con_enablecolor();
} else if (!(console.handle_out = fopen(out, "w"))) return 0;
con_enablecolor();
} else if (!(console.handle_err = fopen(err, "w"))) return 0;
+ // no buffering
+ setvbuf(console.handle_out, NULL, _IONBF, 0);
+ setvbuf(console.handle_err, NULL, _IONBF, 0);
+
return 1;
}
return ln;
}
-
/*
* Utility console message writes for lexer contexts. These will allow
* for reporting of file:line based on lexer context, These are used
CON_CYAN,
CON_RED
};
-
- int err = !!(level == LVL_ERROR);
- int color = (err) ? console.color_err : console.color_out;
-
- /* this might confuse you :P */
- ((err) ? &con_err : &con_out)(
- (color) ?
- "\033[0;%dm%s:%d: \033[0;%dm%s: \033[0m" :
- "%s:%d: %s: ",
-
- CON_CYAN,
- name,
- (int)line,
- sel[level],
- msgtype
- );
-
- con_verr(msg, ap);
- fprintf (stderr, "\n");
+
+ int err = !!(level == LVL_ERROR);
+ int color = (err) ? console.color_err : console.color_out;
+ int (*print)(const char *, ...) = (err) ? &con_err : &con_out;
+ int (*vprint)(const char *, va_list) = (err) ? &con_verr : &con_vout;
+
+ if (color)
+ print("\033[0;%dm%s:%d: \033[0;%dm%s: \033[0m", CON_CYAN, name, (int)line, sel[level], msgtype);
+ else
+ print("%s:%d: %s: ", name, (int)line, msgtype);
+
+ vprint(msg, ap);
+ print("\n");
}
void con_printmsg(int level, const char *name, size_t line, const char *msgtype, const char *msg, ...) {