* 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
};
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 */
{ "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 },
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 {
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;
+} opt_flag_def;
+
+/*===================================================================*/
+/* list of -f flags, like -fdarkplaces-string-table-bug */
+enum {
+ DP_STRING_TABLE_BUG,
+ OMIT_NULLBYTES,
+
+ NUM_F_FLAGS
+};
+static const opt_flag_def opt_flag_list[] = {
+ { "darkplaces-string-table-bug", LONGBIT(DP_STRING_TABLE_BUG) },
+ { "omit-nullbytes", LONGBIT(OMIT_NULLBYTES) }
+};
+static const size_t opt_flag_list_count = sizeof(opt_flag_list) / sizeof(opt_flag_list[0]);
+
+enum {
+ WARN_UNUSED_VARIABLE,
+
+ NUM_W_FLAGS
+};
+static const opt_flag_def opt_warn_list[] = {
+ /* only contains single flags, no groups like 'all' */
+ { "unused-variable", LONGBIT(WARN_UNUSED_VARIABLE) }
+};
+static const size_t opt_warn_list_count = sizeof(opt_warn_list) / sizeof(opt_warn_list[0]);
+
+/* other options: */
+extern uint32_t opt_O; /* -Ox */
+extern const char *opt_output; /* -o file */
+extern int opt_standard;
+
+enum {
+ STD_DEF,
+ STD_QCC,
+ STD_FTE
+};
+
+/*===================================================================*/
+#define OPT_FLAG(i) (!! (opt_flags[(i)/32] & (1<< ((i)%32))))
+extern uint32_t opt_flags[1 + (NUM_F_FLAGS / 32)];
+#define OPT_WARN(i) (!! (opt_warn[(i)/32] & (1<< ((i)%32))))
+extern uint32_t opt_warn[1 + (NUM_W_FLAGS / 32)];
+
#endif