* SOFTWARE.
*/
#include "gmqcc.h"
-#include <stdio.h>
/*
* isatty/STDERR_FILENO/STDOUT_FILNO
int wcolor;
int icolor;
- int state;
+ int state = 0;
/* attributes */
int intense = -1;
state = -1;
}
} else {
- file_putc(h, *str);
+ fs_file_write(str, 1, 1, stdout);
length ++;
}
str++;
{
char data[4096];
memset(data, 0, sizeof(data));
+#ifdef _MSC_VER
+ vsnprintf_s(data, sizeof(data), sizeof(data), fmt, va);
+#else
vsnprintf(data, sizeof(data), fmt, va);
- ln = (GMQCC_IS_DEFINE(handle)) ? win_fputs(handle, data) : file_puts(handle, data);
+#endif
+ ln = (GMQCC_IS_DEFINE(handle)) ? win_fputs(handle, data) : fs_file_puts(handle, data);
}
#endif
return ln;
void con_close() {
if (!GMQCC_IS_DEFINE(console.handle_err))
- file_close(console.handle_err);
+ fs_file_close(console.handle_err);
if (!GMQCC_IS_DEFINE(console.handle_out))
- file_close(console.handle_out);
+ fs_file_close(console.handle_out);
}
void con_color(int state) {
if (GMQCC_IS_DEFINE(out)) {
console.handle_out = GMQCC_IS_STDOUT(out) ? stdout : stderr;
con_enablecolor();
- } else if (!(console.handle_out = file_open(out, "w"))) return 0;
+ } else if (!(console.handle_out = fs_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 = file_open(err, "w"))) return 0;
-
- /* no buffering */
- setvbuf(console.handle_out, NULL, _IONBF, 0);
- setvbuf(console.handle_err, NULL, _IONBF, 0);
+ } else if (!(console.handle_err = fs_file_open(err, "w"))) return 0;
return 1;
}
/*
* Defaultizer because stdio.h shouldn't be used anywhere except here
* and inside file.c To prevent mis-match of wrapper-interfaces.
- */
+ */
FILE *con_default_out() {
return (console.handle_out = stdout);
}
* for reporting of file:line based on lexer context, These are used
* heavily in the parser/ir/ast.
*/
-void con_vprintmsg_c(int level, const char *name, size_t line, const char *msgtype, const char *msg, va_list ap, const char *condname) {
+static void con_vprintmsg_c(int level, const char *name, size_t line, size_t column, const char *msgtype, const char *msg, va_list ap, const char *condname) {
/* color selection table */
static int sel[] = {
CON_WHITE,
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);
+ print("\033[0;%dm%s:%d:%d: \033[0;%dm%s: \033[0m", CON_CYAN, name, (int)line, (int)column, sel[level], msgtype);
else
- print("%s:%d: %s: ", name, (int)line, msgtype);
+ print("%s:%d:%d: %s: ", name, (int)line, (int)column, msgtype);
vprint(msg, ap);
if (condname)
print("\n");
}
-void con_vprintmsg(int level, const char *name, size_t line, const char *msgtype, const char *msg, va_list ap) {
- con_vprintmsg_c(level, name, line, msgtype, msg, ap, NULL);
+void con_vprintmsg(int level, const char *name, size_t line, size_t column, const char *msgtype, const char *msg, va_list ap) {
+ con_vprintmsg_c(level, name, line, column, msgtype, msg, ap, NULL);
}
-void con_printmsg(int level, const char *name, size_t line, const char *msgtype, const char *msg, ...) {
+void con_printmsg(int level, const char *name, size_t line, size_t column, const char *msgtype, const char *msg, ...) {
va_list va;
va_start(va, msg);
- con_vprintmsg(level, name, line, msgtype, msg, va);
+ con_vprintmsg(level, name, line, column, msgtype, msg, va);
va_end (va);
}
void con_cvprintmsg(void *ctx, int lvl, const char *msgtype, const char *msg, va_list ap) {
- con_vprintmsg(lvl, ((lex_ctx*)ctx)->file, ((lex_ctx*)ctx)->line, msgtype, msg, ap);
+ con_vprintmsg(lvl, ((lex_ctx*)ctx)->file, ((lex_ctx*)ctx)->line, ((lex_ctx*)ctx)->column, msgtype, msg, ap);
}
void con_cprintmsg (void *ctx, int lvl, const char *msgtype, const char *msg, ...) {
lvl = LVL_ERROR;
}
- con_vprintmsg_c(lvl, ctx.file, ctx.line, msgtype, fmt, ap, warn_name);
+ con_vprintmsg_c(lvl, ctx.file, ctx.line, ctx.column, msgtype, fmt, ap, warn_name);
return OPTS_WERROR(warntype) && OPTS_FLAG(BAIL_ON_WERROR);
}