+/*===================================================================*/
+/*===================== error.c message printer =====================*/
+/*===================================================================*/
+
+#ifndef WIN32
+enum {
+ CON_BLACK = 30,
+ CON_RED,
+ CON_GREEN,
+ CON_BROWN,
+ CON_BLUE,
+ CON_MAGENTA,
+ CON_CYAN ,
+ CON_WHITE
+};
+#endif
+enum {
+ LVL_MSG,
+ LVL_WARNING,
+ LVL_ERROR
+};
+
+void vprintmsg (int level, const char *name, size_t line, const char *msgtype, const char *msg, va_list ap);
+void printmsg (int level, const char *name, size_t line, const char *msgtype, const char *msg, ...);
+void cvprintmsg(lex_ctx ctx, int lvl, const char *msgtype, const char *msg, va_list ap);
+void cprintmsg (lex_ctx ctx, int lvl, const char *msgtype, const char *msg, ...);
+
+/*===================================================================*/
+/*===================== parser.c commandline ========================*/
+/*===================================================================*/
+
+bool parser_init ();
+bool parser_compile(const char *filename);
+bool parser_finish (const char *output);
+void parser_cleanup();
+
+/*===================================================================*/
+/*======================= main.c commandline ========================*/
+/*===================================================================*/
+
+#if 0
+/* Helpers to allow for a whole lot of flags. Otherwise we'd limit
+ * to 32 or 64 -f options...
+ */
+typedef struct {
+ size_t idx; /* index into an array of 32 bit words */
+ uint8_t bit; /* index _into_ the 32 bit word, thus just uint8 */
+} longbit;
+#define LONGBIT(bit) { ((bit)/32), ((bit)%32) }
+#else
+typedef uint32_t longbit;
+#define LONGBIT(bit) (bit)
+#endif
+
+/* Used to store the list of flags with names */
+typedef struct {
+ const char *name;
+ longbit bit;
+} opts_flag_def;
+
+/*===================================================================*/
+/* list of -f flags, like -fdarkplaces-string-table-bug */
+enum {
+# define GMQCC_TYPE_FLAGS
+# define GMQCC_DEFINE_FLAG(X) X,
+# include "opts.def"
+ COUNT_FLAGS
+};
+static const opts_flag_def opts_flag_list[] = {
+# define GMQCC_TYPE_FLAGS
+# define GMQCC_DEFINE_FLAG(X) { #X, LONGBIT(X) },
+# include "opts.def"
+ { NULL, LONGBIT(0) }
+};
+
+enum {
+# define GMQCC_TYPE_WARNS
+# define GMQCC_DEFINE_FLAG(X) WARN_##X,
+# include "opts.def"
+ COUNT_WARNINGS
+};
+static const opts_flag_def opts_warn_list[] = {
+# define GMQCC_TYPE_WARNS
+# define GMQCC_DEFINE_FLAG(X) { #X, LONGBIT(WARN_##X) },
+# include "opts.def"
+ { NULL, LONGBIT(0) }
+};
+
+/* other options: */
+enum {
+ COMPILER_QCC, /* circa QuakeC */
+ COMPILER_FTEQCC, /* fteqcc QuakeC */
+ COMPILER_QCCX, /* qccx QuakeC */
+ COMPILER_GMQCC /* this QuakeC */
+};
+extern uint32_t opts_O; /* -Ox */
+extern const char *opts_output; /* -o file */
+extern int opts_standard;
+extern bool opts_debug;
+extern bool opts_memchk;
+extern bool opts_dump;
+extern bool opts_werror;
+extern bool opts_forcecrc;
+extern uint16_t opts_forced_crc;
+extern bool opts_pp_only;
+extern size_t opts_max_array_size;
+
+/*===================================================================*/
+#define OPTS_FLAG(i) (!! (opts_flags[(i)/32] & (1<< ((i)%32))))
+extern uint32_t opts_flags[1 + (COUNT_FLAGS / 32)];
+#define OPTS_WARN(i) (!! (opts_warn[(i)/32] & (1<< ((i)%32))))
+extern uint32_t opts_warn[1 + (COUNT_WARNINGS / 32)];
+