*/
#ifndef GMQCC_HDR
#define GMQCC_HDR
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
#include <stdio.h>
+#include <ctype.h>
+/*
+ * stdint.h and inttypes.h -less subset
+ * for systems that don't have it, which we must
+ * assume is all systems. (int8_t not required)
+ */
+#if CHAR_MIN == -128
+ typedef unsigned char uint8_t; /* same as below */
+#elif SCHAR_MIN == -128
+ typedef unsigned char uint8_t; /* same as above */
+#endif
+#if SHRT_MAX == 0x7FFF
+ typedef short int16_t;
+ typedef unsigned short uint16_t;
+#elif INT_MAX == 0x7FFF
+ typedef int int16_t;
+ typedef unsigned int uint16_t;
+#endif
+#if INT_MAX == 0x7FFFFFFF
+ typedef int int32_t;
+ typedef unsigned int uint32_t;
+#elif LONG_MAX == 0x7FFFFFFF
+ typedef long int32_t;
+ typedef unsigned long uint32_t;
+#endif
+#ifdef _LP64 /* long pointer == 64 */
+ typedef unsigned long uintptr_t;
+ typedef long intptr_t;
+#else
+ typedef unsigned int uintptr_t;
+ typedef int intptr_t;
+#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];
+typedef char uint32_size_is_correct [sizeof(uint32_t) == 4?1:-1];
+typedef char int8_size_is_correct [sizeof(int8_t) == 1?1:-1];
+typedef char int16_size_if_correct [sizeof(int16_t) == 2?1:-1];
+typedef char int32_size_is_correct [sizeof(int32_t) == 4?1:-1];
+/* intptr_t / uintptr_t correct size check */
+typedef char uintptr_size_is_correct[sizeof(intptr_t) == sizeof(int*)?1:-1];
+typedef char uintptr_size_is_correct[sizeof(uintptr_t)== sizeof(int*)?1:-1];
//===================================================================
//============================ lex.c ================================
char peek [5];
char lastok[8192];
-
int last; /* last token */
int current; /* current token */
-
int length; /* bytes left to parse */
int size; /* never changes (size of file) */
int line; /* what line are we on? */
#define OFS_PARM6 (OFS_PARM5 +3)
#define OFS_PARM7 (OFS_PARM6 +3)
+typedef struct {
+ uint16_t opcode;
+
+ /* operand 1 */
+ union {
+ int16_t s1; /* signed */
+ uint16_t u1; /* unsigned */
+ };
+ /* operand 2 */
+ union {
+ int16_t s2; /* signed */
+ uint16_t u2; /* unsigned */
+ };
+ /* operand 3 */
+ union {
+ int16_t s3; /* signed */
+ uint16_t u3; /* unsigned */
+ };
+
+ /*
+ * This is the same as the structure in darkplaces
+ * {
+ * unsigned short op;
+ * short a,b,c;
+ * }
+ * But this one is more sane to work with, and the
+ * type sizes are guranteed.
+ */
+} prog_section_statement;
+
+typedef struct {
+ /* The types:
+ * 0 = ev_void
+ * 1 = ev_string
+ * 2 = ev_float
+ * 3 = ev_vector
+ * 4 = ev_entity
+ * 5 = ev_field
+ * 6 = ev_function
+ * 7 = ev_pointer -- engine only
+ * 8 = ev_bad -- engine only
+ */
+ uint16_t type;
+ uint16_t offset;
+ uint32_t name;
+} prog_section_both;
+typedef prog_section_both prog_section_def;
+typedef prog_section_both prog_section_field;
+
+typedef struct {
+ int32_t entry; /* in statement table for instructions */
+ uint32_t firstlocal; /* First local in local table */
+ uint32_t locals; /* Total ints of params + locals */
+ 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 */
+ uint8_t argsize[8]; /* size of arguments (keep 8 always?) */
+} prog_section_function;
+
/*
* Instructions
* These are the external instructions supported by the interperter
INSTR_ADD_V,
INSTR_SUB_F,
INSTR_SUB_V,
-
INSTR_EQ_F,
INSTR_EQ_V,
INSTR_EQ_S,
INSTR_EQ_E,
INSTR_EQ_FNC,
-
INSTR_NE_F,
INSTR_NE_V,
INSTR_NE_S,
INSTR_NE_E,
INSTR_NE_FNC,
-
INSTR_LE,
INSTR_GE,
INSTR_LT,
INSTR_GT,
-
INSTR_LOAD_F,
INSTR_LOAD_V,
INSTR_LOAD_S,
INSTR_LOAD_ENT,
INSTR_LOAD_FLD,
INSTR_LOAD_FNC,
-
INSTR_ADDRESS,
-
INSTR_STORE_F,
INSTR_STORE_V,
INSTR_STORE_S,
INSTR_STORE_ENT,
INSTR_STORE_FLD,
INSTR_STORE_FNC,
-
INSTR_STOREP_F,
INSTR_STOREP_V,
INSTR_STOREP_S,
INSTR_STOREP_ENT,
INSTR_STOREP_FLD,
INSTR_STOREP_FNC,
-
INSTR_RETURN,
INSTR_NOT_F,
INSTR_NOT_V,
INSTR_GOTO,
INSTR_AND,
INSTR_OR,
-
INSTR_BITAND,
INSTR_BITOR
};
-void code_write();
+/*
+ * 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 );
+ * VECTOR_MAKE(prog_section_function, code_functions );
+ * VECTOR_MAKE(int, code_globals );
+ * VECTOR_MAKE(char, code_strings );
+ */
+int code_statements_add(prog_section_statement);
+int code_defs_add (prog_section_def);
+int code_fields_add (prog_section_field);
+int code_functions_add(prog_section_function);
+int code_globals_add (int);
+int code_strings_add (char);
+extern long code_statements_elements;
+extern long code_strings_elements;
+extern long code_globals_elements;
+extern long code_functions_elements;
+extern long code_fields_elements;
+extern long code_defs_elements;
+
+/*
+ * code_write -- writes out the compiled file
+ * code_init -- prepares the code file
+ */
+void code_write ();
+void code_init ();
+
+//===================================================================
+//========================= assembler.c =============================
+//===================================================================
+void asm_init (const char *, FILE **);
+void asm_close(FILE *);
+void asm_parse(FILE *);
#endif