* This is a hack to silent clang regarding empty
* body if statements.
*/
-#define GMQCC_SUPRESS_EMPTY_BODY do { } while (0)
+#define GMQCC_SUPPRESS_EMPTY_BODY do { } while (0)
/*
* Inline is not supported in < C90, however some compilers
int util_getline (char **, size_t *, FILE *);
void util_endianswap (void *, int, int);
+size_t util_strtocmd (const char *, char *, size_t);
+size_t util_strtononcmd (const char *, char *, size_t);
+
uint32_t util_crc32(const char *, int, register const short);
#ifdef NOTRACK
while (N##_add(*++elements) != -1 && len--); \
return N##_elements; \
} \
- typedef char VECTOR_FILL(extra_semicolon_,__COUNTER__)
+ typedef char VECTOR_FILL(extra_semicolon_##N,__COUNTER__)
#define VECTOR_PROT(T,N) \
extern T* N##_data ; \
extern long N##_elements ; \
};
extern size_t type_sizeof[TYPE_COUNT];
+extern uint16_t type_store_instr[TYPE_COUNT];
+/* 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];
typedef struct {
uint32_t offset; /* Offset in file of where data begins */
VECTOR_PROT(int, code_globals );
VECTOR_PROT(char, code_chars );
+typedef float qcfloat;
+typedef int32_t qcint;
+
/*
* code_write -- writes out the compiled file
* code_init -- prepares the code file
void code_init ();
uint32_t code_genstring (const char *string);
uint32_t code_cachedstring(const char *string);
+qcint code_alloc_field (size_t qcsize);
/*===================================================================*/
/*========================= assembler.c =============================*/
{ "EQ_V" , 0, 4 },
{ "EQ_S" , 0, 4 },
{ "EQ_E" , 0, 4 },
- { "ES_FNC" , 0, 6 },
+ { "EQ_FNC" , 0, 6 },
{ "NE_F" , 0, 4 },
{ "NE_V" , 0, 4 },
{ "NE_S" , 0, 4 },
void asm_close(FILE *);
void asm_parse(FILE *);
/*===================================================================*/
-/*============================= main.c ==============================*/
-/*===================================================================*/
-enum {
- COMPILER_QCC, /* circa QuakeC */
- COMPILER_FTEQCC, /* fteqcc QuakeC */
- COMPILER_QCCX, /* qccx QuakeC */
- COMPILER_GMQCC /* this QuakeC */
-};
-extern bool opts_debug;
-extern bool opts_memchk;
-extern bool opts_darkplaces_stringtablebug;
-extern bool opts_omit_nullcode;
-extern int opts_compiler;
-/*===================================================================*/
/*============================= ast.c ===============================*/
/*===================================================================*/
#define MEM_VECTOR_PROTO(Towner, Tmem, mem) \
size_t name##_count; \
size_t name##_alloc
-#define _MEM_VEC_FUN_ADD(Tself, Twhat, mem) \
+#define MEM_VEC_FUN_ADD(Tself, Twhat, mem) \
bool GMQCC_WARN Tself##_##mem##_add(Tself *self, Twhat f) \
{ \
Twhat *reall; \
return true; \
}
-#define _MEM_VEC_FUN_REMOVE(Tself, Twhat, mem) \
+#define MEM_VEC_FUN_REMOVE(Tself, Twhat, mem) \
bool GMQCC_WARN Tself##_##mem##_remove(Tself *self, size_t idx) \
{ \
size_t i; \
return true; \
}
-#define _MEM_VEC_FUN_FIND(Tself, Twhat, mem) \
+#define MEM_VEC_FUN_FIND(Tself, Twhat, mem) \
bool GMQCC_WARN Tself##_##mem##_find(Tself *self, Twhat obj, size_t *idx) \
{ \
size_t i; \
return false; \
}
-#define _MEM_VEC_FUN_APPEND(Tself, Twhat, mem) \
+#define MEM_VEC_FUN_APPEND(Tself, Twhat, mem) \
bool GMQCC_WARN Tself##_##mem##_append(Tself *s, Twhat *p, size_t c) \
{ \
Twhat *reall; \
return true; \
}
-#define _MEM_VEC_FUN_RESIZE(Tself, Twhat, mem) \
+#define MEM_VEC_FUN_RESIZE(Tself, Twhat, mem) \
bool GMQCC_WARN Tself##_##mem##_resize(Tself *s, size_t c) \
{ \
Twhat *reall; \
return true; \
}
-#define _MEM_VEC_FUN_CLEAR(Tself, mem) \
+#define MEM_VEC_FUN_CLEAR(Tself, mem) \
void Tself##_##mem##_clear(Tself *self) \
{ \
if (!self->mem) \
}
#define MEM_VEC_FUNCTIONS(Tself, Twhat, mem) \
-_MEM_VEC_FUN_REMOVE(Tself, Twhat, mem) \
-_MEM_VEC_FUN_ADD(Tself, Twhat, mem)
+MEM_VEC_FUN_REMOVE(Tself, Twhat, mem) \
+MEM_VEC_FUN_ADD(Tself, Twhat, mem)
#define MEM_VEC_FUNCTIONS_ALL(Tself, Twhat, mem) \
MEM_VEC_FUNCTIONS(Tself, Twhat, mem) \
-_MEM_VEC_FUN_CLEAR(Tself, mem) \
-_MEM_VEC_FUN_FIND(Tself, Twhat, mem)
+MEM_VEC_FUN_CLEAR(Tself, mem) \
+MEM_VEC_FUN_FIND(Tself, Twhat, mem)
enum store_types {
store_global,
store_local, /* local, assignable for now, should get promoted later */
- store_value /* unassignable */
+ store_param, /* parameters, they are locals with a fixed position */
+ store_value, /* unassignable */
+ store_return /* unassignable, at OFS_RETURN */
};
typedef struct {
* Since we may want to support that as well, let's redefine
* float and int here.
*/
-typedef float qcfloat;
-typedef int32_t qcint;
-
typedef union {
qcint _int;
qcint string;
qcany* prog_getedict (qc_program *prog, qcint e);
qcint prog_tempstring(qc_program *prog, const char *_str);
+/*===================================================================*/
+/*======================= 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_DEFINE_FLAG(X) X,
+# include "flags.def"
+# undef GMQCC_DEFINE_FLAG
+ COUNT_FLAGS
+};
+static const opts_flag_def opts_flag_list[] = {
+# define GMQCC_DEFINE_FLAG(X) { #X, LONGBIT(X) },
+# include "flags.def"
+# undef GMQCC_DEFINE_FLAG
+ { NULL, LONGBIT(0) }
+};
+
+enum {
+# define GMQCC_DEFINE_FLAG(X) WARN_##X,
+# include "warns.def"
+# undef GMQCC_DEFINE_FLAG
+ COUNT_WARNINGS
+};
+static const opts_flag_def opts_warn_list[] = {
+# define GMQCC_DEFINE_FLAG(X) { #X, LONGBIT(WARN_##X) },
+# include "warns.def"
+# undef GMQCC_DEFINE_FLAG
+ { 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;
+
+/*===================================================================*/
+#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)];
+
#endif