]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - gmqcc.h
Fixes
[xonotic/gmqcc.git] / gmqcc.h
diff --git a/gmqcc.h b/gmqcc.h
index 459c2ff0cf83ff37bff2d55e902bd1cf3a73da2e..2253c9ed9e96a57358045c071962dd38ca2fefac 100644 (file)
--- a/gmqcc.h
+++ b/gmqcc.h
@@ -248,7 +248,7 @@ uint32_t util_crc32(uint32_t crc, const char *data, size_t len);
 #define _vec_needsgrow(A,N) ((!(A)) || (_vec_end(A) + (N) >= _vec_beg(A)))
 #define _vec_mightgrow(A,N) (_vec_needsgrow((A), (N)) ? (void)_vec_forcegrow((A),(N)) : (void)0)
 #define _vec_forcegrow(A,N) _util_vec_grow(((void**)&(A)), (N), sizeof(*(A)))
-#define _vec_remove(A,S,I,N) (memmove((char*)(A)+(I)*(S),(char*)(A)+((I)+(N))*(S),(S)*(vec_size(A)-(I)-(N))), _vec_end(A)-=(N))
+#define _vec_remove(A,S,I,N) (memmove((char*)(A)+(I)*(S),(char*)(A)+((I)+(N))*(S),(S)*(_vec_end(A)-(I)-(N))), _vec_end(A)-=(N))
 void _util_vec_grow(void **a, size_t i, size_t s);
 /* exposed interface */
 #define vec_free(A)          ((A) ? (mem_d((void*)_vec_raw(A)), (A) = NULL) : 0)
@@ -258,11 +258,20 @@ void _util_vec_grow(void **a, size_t i, size_t s);
 #define vec_last(A)          ((A)[_vec_end(A)-1])
 #define vec_append(A,N,S)    memcpy(vec_add((A), (N)), (S), N * sizeof(*(S)))
 #define vec_remove(A,I,N)    _vec_remove((A), sizeof(*(A)), (I), (N))
-#define vec_pop(A)           vec_remove((A), _vec_end(A)-1, 1)
+#define vec_pop(A)           (_vec_end(A)-=1)
 /* these are supposed to NOT reallocate */
 #define vec_shrinkto(A,N)    (_vec_end(A) = (N))
 #define vec_shrinkby(A,N)    (_vec_end(A) -= (N))
 
+#define vec_upload(X,Y,S)      \
+    do {                       \
+        size_t E = 0;          \
+        while (E < S) {        \
+            vec_push(X, Y[E]); \
+            E ++;              \
+        }                      \
+    } while(0)
+
 typedef struct hash_table_t {
     size_t                size;
     struct hash_node_t **table;
@@ -328,21 +337,26 @@ enum {
     TYPE_COUNT
 };
 
-extern const char *type_name[TYPE_COUNT];
+/* const/var qualifiers */
+#define CV_NONE  0
+#define CV_CONST 1
+#define CV_VAR  -1
+
+extern const char *type_name        [TYPE_COUNT];
+extern size_t      type_sizeof      [TYPE_COUNT];
+extern uint16_t    type_store_instr [TYPE_COUNT];
+extern uint16_t    field_store_instr[TYPE_COUNT];
 
-extern size_t type_sizeof[TYPE_COUNT];
-extern uint16_t type_store_instr[TYPE_COUNT];
-extern uint16_t field_store_instr[TYPE_COUNT];
-/* could use type_store_instr + INSTR_STOREP_F - INSTR_STORE_F
+/*
+ * could use type_store_instr + INSTR_STOREP_F - INSTR_STORE_F
  * but this breaks when TYPE_INTEGER is added, since with the enhanced
  * instruction set, the old ones are left untouched, thus the _I instructions
  * are at a seperate place.
  */
 extern uint16_t type_storep_instr[TYPE_COUNT];
-/* other useful lists */
-extern uint16_t type_eq_instr[TYPE_COUNT];
-extern uint16_t type_ne_instr[TYPE_COUNT];
-extern uint16_t type_not_instr[TYPE_COUNT];
+extern uint16_t type_eq_instr    [TYPE_COUNT];
+extern uint16_t type_ne_instr    [TYPE_COUNT];
+extern uint16_t type_not_instr   [TYPE_COUNT];
 
 typedef struct {
     uint32_t offset;      /* Offset in file of where data begins  */
@@ -351,15 +365,15 @@ typedef struct {
 
 typedef struct {
     uint32_t     version;      /* Program version (6)     */
-    uint16_t     crc16;        /* What is this?           */
-    uint16_t     skip;         /* see propsal.txt         */
+    uint16_t     crc16;
+    uint16_t     skip;
 
     prog_section statements;   /* prog_section_statement  */
     prog_section defs;         /* prog_section_def        */
     prog_section fields;       /* prog_section_field      */
     prog_section functions;    /* prog_section_function   */
-    prog_section strings;      /* What is this?           */
-    prog_section globals;      /* What is this?           */
+    prog_section strings;
+    prog_section globals;
     uint32_t     entfield;     /* Number of entity fields */
 } prog_header;
 
@@ -409,7 +423,8 @@ typedef struct {
 } prog_section_statement;
 
 typedef struct {
-    /* The types:
+    /*
+     * The types:
      * 0 = ev_void
      * 1 = ev_string
      * 2 = ev_float
@@ -424,6 +439,7 @@ typedef struct {
     uint16_t offset;
     uint32_t name;
 } prog_section_both;
+
 typedef prog_section_both prog_section_def;
 typedef prog_section_both prog_section_field;
 
@@ -438,7 +454,7 @@ typedef struct {
     uint32_t  profile;    /* Always zero (engine uses this)       */
     uint32_t  name;       /* name of function in string table     */
     uint32_t  file;       /* file of the source file              */
-    uint32_t  nargs;      /* number of arguments                  */
+    int32_t   nargs;      /* number of arguments                  */
     uint8_t   argsize[8]; /* size of arguments (keep 8 always?)   */
 } prog_section_function;
 
@@ -532,6 +548,7 @@ enum {
 };
 
 extern prog_section_statement *code_statements;
+extern int                    *code_linenums;
 extern prog_section_def       *code_defs;
 extern prog_section_field     *code_fields;
 extern prog_section_function  *code_functions;
@@ -546,12 +563,15 @@ typedef int32_t qcint;
  * code_write -- writes out the compiled file
  * code_init  -- prepares the code file
  */
-bool     code_write       (const char *filename);
+bool     code_write       (const char *filename, const char *lno);
 void     code_init        ();
 uint32_t code_genstring   (const char *string);
 uint32_t code_cachedstring(const char *string);
 qcint    code_alloc_field (size_t qcsize);
 
+/* this function is used to keep statements and linenumbers together */
+void     code_push_statement(prog_section_statement *stmt, int linenum);
+
 /*
  * A shallow copy of a lex_file to remember where which ast node
  * came from.
@@ -561,7 +581,6 @@ typedef struct {
     size_t      line;
 } lex_ctx;
 
-
 /*===================================================================*/
 /*============================ con.c ================================*/
 /*===================================================================*/
@@ -583,27 +602,26 @@ enum {
     LVL_ERROR
 };
 
-
 void con_vprintmsg (int level, const char *name, size_t line, const char *msgtype, const char *msg, va_list ap);
 void con_printmsg  (int level, const char *name, size_t line, const char *msgtype, const char *msg, ...);
 void con_cvprintmsg(void *ctx, int lvl, const char *msgtype, const char *msg, va_list ap);
 void con_cprintmsg (void *ctx, int lvl, const char *msgtype, const char *msg, ...);
 
-void con_close();
-void con_color(int state);
-void con_init ();
-void con_reset();
-int  con_change(const char *out, const char *err);
-int  con_verr  (const char *fmt, va_list va);
-int  con_vout  (const char *fmt, va_list va);
-int  con_err   (const char *fmt, ...);
-int  con_out   (const char *fmt, ...);
+void con_close ();
+void con_init  ();
+void con_reset ();
+void con_color (int);
+int  con_change(const char *, const char *);
+int  con_verr  (const char *, va_list);
+int  con_vout  (const char *, va_list);
+int  con_err   (const char *, ...);
+int  con_out   (const char *, ...);
 
 /* error/warning interface */
 extern size_t compile_errors;
 extern size_t compile_warnings;
 
-void compile_error(lex_ctx ctx, const char *msg, ...);
+void /********/ compile_error  (lex_ctx ctx, /*LVL_ERROR*/ const char *msg, ...);
 bool GMQCC_WARN compile_warning(lex_ctx ctx, int warntype, const char *fmt, ...);
 
 /*===================================================================*/
@@ -708,7 +726,8 @@ vector  vec3_mulvf(vector, float);
 /*============================= exec.c ==============================*/
 /*===================================================================*/
 
-/* darkplaces has (or will have) a 64 bit prog loader
+/*
+ * Darkplaces has (or will have) a 64 bit prog loader
  * where the 32 bit qc program is autoconverted on load.
  * Since we may want to support that as well, let's redefine
  * float and int here.
@@ -846,7 +865,7 @@ typedef uint32_t longbit;
 /* Used to store the list of flags with names */
 typedef struct {
     const char *name;
-    longbit    bit;
+    longbit     bit;
 } opts_flag_def;
 
 /*===================================================================*/
@@ -895,6 +914,7 @@ static const unsigned int opts_opt_oflag[] = {
 #  include "opts.def"
     0
 };
+extern unsigned int optimization_count[COUNT_OPTIMIZATIONS];
 
 /* other options: */
 enum {
@@ -903,6 +923,7 @@ enum {
     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;
@@ -917,11 +938,12 @@ 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)];
+#define OPTS_FLAG(i)         (!! (opts_flags       [(i)/32] & (1<< ((i)%32))))
+#define OPTS_WARN(i)         (!! (opts_warn        [(i)/32] & (1<< ((i)%32))))
 #define OPTS_OPTIMIZATION(i) (!! (opts_optimization[(i)/32] & (1<< ((i)%32))))
+
+extern uint32_t opts_flags       [1 + (COUNT_FLAGS         / 32)];
+extern uint32_t opts_warn        [1 + (COUNT_WARNINGS      / 32)];
 extern uint32_t opts_optimization[1 + (COUNT_OPTIMIZATIONS / 32)];
 
 #endif