X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=conout.c;h=9d0659b4b691c3a9f44fb1b011af5f514b608cf2;hp=c22758be9c178a43a7ac61617405a7124fcd7b4f;hb=dc510baf4f2c8aeec289abf4abd81596c9fe7a8c;hpb=82afdb1e2cc2b9171ac79ef45b1d3743c590f0ec diff --git a/conout.c b/conout.c index c22758b..9d0659b 100644 --- a/conout.c +++ b/conout.c @@ -1,43 +1,17 @@ -/* - * Copyright (C) 2012, 2013 - * Dale Weiler - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is furnished to do - * so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ #include #include "gmqcc.h" -#define GMQCC_IS_STDOUT(X) ((fs_file_t*)((void*)X) == (fs_file_t*)stdout) -#define GMQCC_IS_STDERR(X) ((fs_file_t*)((void*)X) == (fs_file_t*)stderr) +#define GMQCC_IS_STDOUT(X) ((X) == stdout) +#define GMQCC_IS_STDERR(X) ((X) == stderr) #define GMQCC_IS_DEFINE(X) (GMQCC_IS_STDERR(X) || GMQCC_IS_STDOUT(X)) typedef struct { - fs_file_t *handle_err; - fs_file_t *handle_out; - int color_err; - int color_out; + FILE *handle_err; + FILE *handle_out; + int color_err; + int color_out; } con_t; -/* - * We use standard files as default. These can be changed at any time - * with con_change(F, F) - */ static con_t console; /* @@ -58,8 +32,8 @@ static void con_enablecolor(void) { * arguments. This colorizes for windows as well via translate * step. */ -static int con_write(fs_file_t *handle, const char *fmt, va_list va) { - return vfprintf((FILE*)handle, fmt, va); +static int con_write(FILE *handle, const char *fmt, va_list va) { + return vfprintf(handle, fmt, va); } /********************************************************************** @@ -68,9 +42,9 @@ static int con_write(fs_file_t *handle, const char *fmt, va_list va) { void con_close() { if (!GMQCC_IS_DEFINE(console.handle_err)) - fs_file_close(console.handle_err); + fclose(console.handle_err); if (!GMQCC_IS_DEFINE(console.handle_out)) - fs_file_close(console.handle_out); + fclose(console.handle_out); } void con_color(int state) { @@ -83,54 +57,26 @@ void con_color(int state) { } void con_init() { - console.handle_err = (fs_file_t*)stderr; - console.handle_out = (fs_file_t*)stdout; + console.handle_err = stderr; + console.handle_out = stdout; con_enablecolor(); } void con_reset() { con_close(); - con_init (); -} - -/* - * This is clever, say you want to change the console to use two - * files for out/err. You pass in two strings, it will properly - * close the existing handles (if they're not std* handles) and - * open them. Now say you want TO use stdout and stderr, this - * allows you to do that so long as you cast them to (char*). - * Say you need stdout for out, but want a file for error, you can - * do this too, just cast the stdout for (char*) and stick to a - * string for the error file. - */ -int con_change(const char *out, const char *err) { - con_close(); - - if (!out) out = (const char *)((!console.handle_out) ? (fs_file_t*)stdout : console.handle_out); - if (!err) err = (const char *)((!console.handle_err) ? (fs_file_t*)stderr : console.handle_err); - - if (GMQCC_IS_DEFINE(out)) { - console.handle_out = (fs_file_t*)(GMQCC_IS_STDOUT(out) ? stdout : stderr); - con_enablecolor(); - } else if (!(console.handle_out = fs_file_open(out, "w"))) return 0; - - if (GMQCC_IS_DEFINE(err)) { - console.handle_err = (fs_file_t*)(GMQCC_IS_STDOUT(err) ? stdout : stderr); - con_enablecolor(); - } else if (!(console.handle_err = fs_file_open(err, "w"))) return 0; - - return 1; + con_init(); } /* * Defaultizer because stdio.h shouldn't be used anywhere except here * and inside file.c To prevent mis-match of wrapper-interfaces. */ -fs_file_t *con_default_out() { - return (fs_file_t*)(console.handle_out = (fs_file_t*)stdout); +FILE *con_default_out() { + return console.handle_out = stdout; } -fs_file_t *con_default_err() { - return (fs_file_t*)(console.handle_err = (fs_file_t*)stderr); + +FILE *con_default_err() { + return console.handle_err = stderr; } int con_verr(const char *fmt, va_list va) { @@ -145,20 +91,20 @@ int con_vout(const char *fmt, va_list va) { * to be used. */ int con_err(const char *fmt, ...) { - va_list va; - int ln = 0; + va_list va; + int ln = 0; va_start(va, fmt); con_verr(fmt, va); - va_end (va); - return ln; + va_end(va); + return ln; } int con_out(const char *fmt, ...) { - va_list va; - int ln = 0; + va_list va; + int ln = 0; va_start(va, fmt); con_vout(fmt, va); - va_end (va); - return ln; + va_end (va); + return ln; } /* @@ -213,8 +159,7 @@ void con_cprintmsg(lex_ctx_t ctx, int lvl, const char *msgtype, const char *msg, va_end (va); } -#ifndef QCVM_EXECUTOR -/* General error interface */ +/* General error interface: TODO seperate as part of the compiler front-end */ size_t compile_errors = 0; size_t compile_warnings = 0; size_t compile_Werrors = 0; @@ -279,4 +224,3 @@ bool GMQCC_WARN compile_warning(lex_ctx_t ctx, int warntype, const char *fmt, .. va_end(ap); return r; } -#endif