]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - gmqcc.h
Merge branch 'master' into ast-and-ir
[xonotic/gmqcc.git] / gmqcc.h
diff --git a/gmqcc.h b/gmqcc.h
index 7199a63d2b2cc826901a939b657dcb7db7bc5d48..583726e4a932cde7a9dfde903dc354211a5fa34d 100644 (file)
--- a/gmqcc.h
+++ b/gmqcc.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 
+ * Copyright (C) 2012
  *     Dale Weiler, Wolfgang Bumiller
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy of
 #else
 #   define GMQCC_WARN
 #endif
+/*
+ * This is a hack to silent clang regarding empty
+ * body if statements.
+ */
+#define GMQCC_SUPRESS_EMPTY_BODY do { } while (0)
 
 /*
  * stdint.h and inttypes.h -less subset
@@ -86,7 +91,7 @@
     typedef int            int16_t;
     typedef unsigned int   uint16_t;
 #endif
-#if   INT_MAX   == 0x7FFFFFFF 
+#if   INT_MAX   == 0x7FFFFFFF
     typedef int            int32_t;
     typedef unsigned int   uint32_t;
 #elif LONG_MAX  == 0x7FFFFFFF
 #else
     typedef unsigned int   uintptr_t;
     typedef int            intptr_t;
-#endif 
+#endif
 /* Ensure type sizes are correct: */
 typedef char uint8_size_is_correct  [sizeof(uint8_t)  == 1?1:-1];
 typedef char uint16_size_if_correct [sizeof(uint16_t) == 2?1:-1];
@@ -116,9 +121,9 @@ typedef char intptr_size_is_correct [sizeof(uintptr_t)== sizeof(int*)?1:-1];
 typedef struct lex_file_t {
     FILE *file;        /* file handler */
     char *name;        /* name of file */
-    char  peek  [5];  
+    char  peek  [5];
     char  lastok[8192];
-    
+
     int   last;    /* last token                   */
     int   current; /* current token                */
     int   length;  /* bytes left to parse          */
@@ -158,7 +163,7 @@ enum {
  * and > the last type token which is TOKEN_VOID
  */
 enum {
-    LEX_COMMENT = 1128, 
+    LEX_COMMENT = 1128,
     LEX_CHRLIT        ,
     LEX_STRLIT        ,
     LEX_IDENT
@@ -217,7 +222,7 @@ void  util_debug         (const char *, const char *, ...);
 int   util_getline       (char **, size_t *, FILE *);
 void  util_endianswap    (void *,  int, int);
 
-uint32_t util_crc32(const char *, int, register const short); 
+uint32_t util_crc32(const char *, int, register const short);
 
 #ifdef NOTRACK
 #    define mem_a(x) malloc(x)
@@ -228,6 +233,8 @@ uint32_t util_crc32(const char *, int, register const short);
 #endif
 
 /* Builds vector type (usefull for inside structures) */
+#define VECTOR_SNAP(X,Y) X ## Y
+#define VECTOR_FILL(X,Y) VECTOR_SNAP(X,Y)
 #define VECTOR_TYPE(T,N)                                        \
     T*     N##_data      = NULL;                                \
     long   N##_elements  = 0;                                   \
@@ -258,13 +265,12 @@ uint32_t util_crc32(const char *, int, register const short);
         elements--;                                             \
         while (N##_add(*++elements) != -1 && len--);            \
         return N##_elements;                                    \
-    }
+    }                                                           \
+    typedef char VECTOR_FILL(extra_semicolon_,__COUNTER__)
 /* Builds a full vector inspot */
 #define VECTOR_MAKE(T,N) \
     VECTOR_TYPE(T,N);    \
     VECTOR_CORE(T,N)
-/* Builds a vector add function pointer for inside structures */
-#define VECTOR_IMPL(T,N) int (*N##_add)(T)
 
 //===================================================================
 //=========================== code.c ================================
@@ -299,23 +305,23 @@ enum {
 
 typedef struct {
     uint16_t opcode;
-    
+
     /* operand 1 */
     union {
         int16_t  s1; /* signed   */
         uint16_t u1; /* unsigned */
-    };
+    } o1;
     /* operand 2 */
     union {
         int16_t  s2; /* signed   */
         uint16_t u2; /* unsigned */
-    };
+    } o2;
     /* operand 3 */
     union {
         int16_t  s3; /* signed   */
         uint16_t u3; /* unsigned */
-    };
-    
+    } o3;
+
     /*
      * This is the same as the structure in darkplaces
      * {
@@ -357,8 +363,8 @@ typedef struct {
     uint8_t   argsize[8]; /* size of arguments (keep 8 always?)   */
 } prog_section_function;
 
-/* 
- * Instructions 
+/*
+ * Instructions
  * These are the external instructions supported by the interperter
  * this is what things compile to (from the C code).
  */
@@ -441,7 +447,7 @@ enum {
 /*
  * The symbols below are created by the following
  * expanded macros:
- * 
+ *
  * VECTOR_MAKE(prog_section_statement, code_statements);
  * VECTOR_MAKE(prog_section_def,       code_defs      );
  * VECTOR_MAKE(prog_section_field,     code_fields    );
@@ -480,7 +486,7 @@ void code_init  ();
 //===================================================================
 static const struct {
     const char  *m; /* menomic     */
-    const size_t o; /* operands    */ 
+    const size_t o; /* operands    */
     const size_t l; /* menomic len */
 } const asm_instr[] = {
     [INSTR_DONE]       = { "DONE"      , 1, 4 },
@@ -573,12 +579,12 @@ extern int  opts_compiler;
 //======================================================================
 #define MEM_VECTOR_PROTO(Towner, Tmem, mem)                   \
     bool GMQCC_WARN Towner##_##mem##_add(Towner*, Tmem);      \
-    bool GMQCC_WARN Towner##_##mem##_remove(Towner*, size_t);
+    bool GMQCC_WARN Towner##_##mem##_remove(Towner*, size_t)
 
 #define MEM_VECTOR_PROTO_ALL(Towner, Tmem, mem)                    \
-    MEM_VECTOR_PROTO(Towner, Tmem, mem)                            \
+    MEM_VECTOR_PROTO(Towner, Tmem, mem);                           \
     bool GMQCC_WARN Towner##_##mem##_find(Towner*, Tmem, size_t*); \
-    void Towner##_##mem##_clear(Towner*);
+    void Towner##_##mem##_clear(Towner*)
 
 #define MEM_VECTOR_MAKE(Twhat, name) \
     Twhat  *name;                    \
@@ -652,17 +658,17 @@ void Tself##_##mem##_clear(Tself *self) \
 {                                       \
     if (!self->mem)                     \
         return;                         \
-    free((void*) self->mem);            \
+    mem_d((void*) self->mem);           \
     self->mem = NULL;                   \
     self->mem##_count = 0;              \
     self->mem##_alloc = 0;              \
 }
 
-#define MEM_VECTOR_CLEAR(owner, mem) \
-    if ((owner)->mem)                \
-        free((void*)((owner)->mem)); \
-    (owner)->mem = NULL;             \
-    (owner)->mem##_count = 0;        \
+#define MEM_VECTOR_CLEAR(owner, mem)  \
+    if ((owner)->mem)                 \
+        mem_d((void*)((owner)->mem)); \
+    (owner)->mem = NULL;              \
+    (owner)->mem##_count = 0;         \
     (owner)->mem##_alloc = 0
 
 #define MEM_VECTOR_INIT(owner, mem) \
@@ -689,14 +695,14 @@ enum store_types {
 
 typedef struct {
     float x, y, z;
-} vector_t;
+} vector;
 
 /*
  * A shallow copy of a lex_file to remember where which ast node
  * came from.
  */
-typedef struct lex_ctx {
+typedef struct {
     const char *file;
-    size_t     line;
-} lex_ctx_t;
+    size_t      line;
+} lex_ctx;
 #endif