]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - gmqcc.h
Move some things around
[xonotic/gmqcc.git] / gmqcc.h
diff --git a/gmqcc.h b/gmqcc.h
index d6055dbeedf2d27ac8e8a9061744302027fcb515..4595be9192f2710cf1941930bd55c64842cea8bf 100644 (file)
--- a/gmqcc.h
+++ b/gmqcc.h
@@ -81,8 +81,8 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \
 #   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;
@@ -106,11 +106,6 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \
 #   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
@@ -259,7 +254,7 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \
 #   include <fcntl.h>
 
     struct dirent {
-        long d_ino;
+        long               d_ino;
         unsigned short     d_reclen;
         unsigned short     d_namlen;
         char               d_name[FILENAME_MAX];
@@ -305,6 +300,25 @@ void *stat_mem_allocate  (size_t, size_t, const char *);
 /*===================================================================*/
 /*=========================== 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 *);
@@ -465,7 +479,6 @@ void  correct_free(correction_t *);
 /*=========================== code.c ================================*/
 /*===================================================================*/
 
-/* TODO: cleanup */
 /* Note: if you change the order, fix type_sizeof in ir.c */
 enum {
     TYPE_VOID     ,
@@ -697,6 +710,9 @@ enum {
     VINSTR_NRCALL
 };
 
+/* TODO: elide */
+extern const char *util_instr_str[VINSTR_END];
+
 /* uhh? */
 typedef float   qcfloat;
 typedef int32_t qcint;
@@ -721,7 +737,7 @@ typedef struct {
  * code_genstrin       -- generates string for code
  * code_alloc_field    -- allocated a field
  * code_push_statement -- keeps statements and linenumbers together
- * code_pop_statement  -- keeps statements and linenumbers together 
+ * code_pop_statement  -- keeps statements and linenumbers together
  */
 bool      code_write         (code_t *, const char *filename, const char *lno);
 GMQCC_WARN
@@ -792,84 +808,6 @@ bool GMQCC_WARN compile_warning (lex_ctx ctx, int warntype, const char *fmt, ...
 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 ================================*/
 /*===================================================================*/
@@ -1070,18 +1008,13 @@ void opts_restore_non_Wall(void);
 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
@@ -1089,12 +1022,6 @@ enum {
 #  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
@@ -1102,18 +1029,6 @@ enum {
 #  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
@@ -1122,7 +1037,11 @@ enum {
     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 {