# ifdef true
# undef true
# endif /*! true */
-# define false (0)
-# define true (1)
+# define false (unsigned)(0)
+# define true (unsigned)(1)
# ifdef __STDC_VERSION__
# if __STDC_VERSION__ < 199901L && __GNUC__ < 3
typedef int bool;
# define GMQCC_WARN
# define GMQCC_USED
#endif /*! defined(__GNUC__) || defined (__CLANG__) */
-/*
- * This is a hack to silent clang regarding empty
- * body if statements.
- */
-#define GMQCC_SUPPRESS_EMPTY_BODY do { } while (0)
/*
* Inline is not supported in < C90, however some compilers
# include <fcntl.h>
struct dirent {
- long d_ino;
+ long d_ino;
unsigned short d_reclen;
unsigned short d_namlen;
char d_name[FILENAME_MAX];
/*===================================================================*/
/*=========================== util.c ================================*/
/*===================================================================*/
+
+/*
+ * Microsoft implements against the spec versions of ctype.h. Which
+ * means what ever the current set locale is will render the actual
+ * results of say isalpha('A') wrong for what ever retarded locale
+ * is used. Simalerly these are also implemented inefficently on
+ * some toolchains and end up becoming actual library calls. Perhaps
+ * this is why tools like yacc provide their own? Regardless implementing
+ * these as functions is equally as silly, the call overhead is not
+ * justified when this could happen on every character from an input
+ * stream. We provide our own as macros for absolute inlinability.
+ */
+#define util_isalpha(a) ((((unsigned)(a)|32)-'a') < 26)
+#define util_isdigit(a) (((unsigned)(a)-'0') < 10)
+#define util_islower(a) (((unsigned)(a)-'a') < 26)
+#define util_isupper(a) (((unsigned)(a)-'A') < 26)
+#define util_isprint(a) (((unsigned)(a)-0x20) < 0x5F)
+#define util_isspace(a) (((a) >= 9 && (a) <= 13) || (a) == ' ')
+
bool util_filexists (const char *);
bool util_strupper (const char *);
bool util_strdigit (const char *);
/*=========================== code.c ================================*/
/*===================================================================*/
-/* TODO: cleanup */
/* Note: if you change the order, fix type_sizeof in ir.c */
enum {
TYPE_VOID ,
VINSTR_NRCALL
};
+/* TODO: elide */
+extern const char *util_instr_str[VINSTR_END];
+
/* uhh? */
typedef float qcfloat;
typedef int32_t qcint;
bool GMQCC_WARN vcompile_warning(lex_ctx ctx, int warntype, const char *fmt, va_list ap);
void compile_show_werrors(void);
-/*===================================================================*/
-/*========================= assembler.c =============================*/
-/*===================================================================*/
-/* TODO: remove this ... */
-static const struct {
- const char *m; /* menomic */
- const size_t o; /* operands */
- const size_t l; /* menomic len */
-} asm_instr[] = {
- { "DONE" , 1, 4 },
- { "MUL_F" , 3, 5 },
- { "MUL_V" , 3, 5 },
- { "MUL_FV" , 3, 6 },
- { "MUL_VF" , 3, 6 },
- { "DIV" , 0, 3 },
- { "ADD_F" , 3, 5 },
- { "ADD_V" , 3, 5 },
- { "SUB_F" , 3, 5 },
- { "SUB_V" , 3, 5 },
- { "EQ_F" , 0, 4 },
- { "EQ_V" , 0, 4 },
- { "EQ_S" , 0, 4 },
- { "EQ_E" , 0, 4 },
- { "EQ_FNC" , 0, 6 },
- { "NE_F" , 0, 4 },
- { "NE_V" , 0, 4 },
- { "NE_S" , 0, 4 },
- { "NE_E" , 0, 4 },
- { "NE_FNC" , 0, 6 },
- { "LE" , 0, 2 },
- { "GE" , 0, 2 },
- { "LT" , 0, 2 },
- { "GT" , 0, 2 },
- { "FIELD_F" , 0, 7 },
- { "FIELD_V" , 0, 7 },
- { "FIELD_S" , 0, 7 },
- { "FIELD_ENT" , 0, 9 },
- { "FIELD_FLD" , 0, 9 },
- { "FIELD_FNC" , 0, 9 },
- { "ADDRESS" , 0, 7 },
- { "STORE_F" , 0, 7 },
- { "STORE_V" , 0, 7 },
- { "STORE_S" , 0, 7 },
- { "STORE_ENT" , 0, 9 },
- { "STORE_FLD" , 0, 9 },
- { "STORE_FNC" , 0, 9 },
- { "STOREP_F" , 0, 8 },
- { "STOREP_V" , 0, 8 },
- { "STOREP_S" , 0, 8 },
- { "STOREP_ENT", 0, 10},
- { "STOREP_FLD", 0, 10},
- { "STOREP_FNC", 0, 10},
- { "RETURN" , 0, 6 },
- { "NOT_F" , 0, 5 },
- { "NOT_V" , 0, 5 },
- { "NOT_S" , 0, 5 },
- { "NOT_ENT" , 0, 7 },
- { "NOT_FNC" , 0, 7 },
- { "IF" , 0, 2 },
- { "IFNOT" , 0, 5 },
- { "CALL0" , 1, 5 },
- { "CALL1" , 2, 5 },
- { "CALL2" , 3, 5 },
- { "CALL3" , 4, 5 },
- { "CALL4" , 5, 5 },
- { "CALL5" , 6, 5 },
- { "CALL6" , 7, 5 },
- { "CALL7" , 8, 5 },
- { "CALL8" , 9, 5 },
- { "STATE" , 0, 5 },
- { "GOTO" , 0, 4 },
- { "AND" , 0, 3 },
- { "OR" , 0, 2 },
- { "BITAND" , 0, 6 },
- { "BITOR" , 0, 5 },
-
- { "END" , 0, 3 } /* virtual assembler instruction */
-};
/*===================================================================*/
/*============================= ir.c ================================*/
/*===================================================================*/
void opts_backup_non_Werror_all(void);
void opts_restore_non_Werror_all(void);
+
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
# 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) }
-};
enum {
# define GMQCC_TYPE_OPTIMIZATIONS
# include "opts.def"
COUNT_OPTIMIZATIONS
};
-static const opts_flag_def opts_opt_list[] = {
-# define GMQCC_TYPE_OPTIMIZATIONS
-# define GMQCC_DEFINE_FLAG(NAME, MIN_O) { #NAME, LONGBIT(OPTIM_##NAME) },
-# include "opts.def"
- { NULL, LONGBIT(0) }
-};
-static const unsigned int opts_opt_oflag[] = {
-# define GMQCC_TYPE_OPTIMIZATIONS
-# define GMQCC_DEFINE_FLAG(NAME, MIN_O) MIN_O,
-# include "opts.def"
- 0
-};
enum {
# define GMQCC_TYPE_OPTIONS
OPTION_COUNT
};
-extern unsigned int opts_optimizationcount[COUNT_OPTIMIZATIONS];
+extern const opts_flag_def opts_flag_list[COUNT_FLAGS+1];
+extern const opts_flag_def opts_warn_list[COUNT_WARNINGS+1];
+extern const opts_flag_def opts_opt_list[COUNT_OPTIMIZATIONS+1];
+extern const unsigned int opts_opt_oflag[COUNT_OPTIMIZATIONS+1];
+extern unsigned int opts_optimizationcount[COUNT_OPTIMIZATIONS];
/* other options: */
typedef enum {