5 * Permission is hereby granted, free of charge, to any person obtaining a copy of
6 * this software and associated documentation files (the "Software"), to deal in
7 * the Software without restriction, including without limitation the rights to
8 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
9 * of the Software, and to permit persons to whom the Software is furnished to do
10 * so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in all
13 * copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 * Some assembler keywords not part of the opcodes above: these are
26 * for creating functions, or constants.
28 const char *const asm_keys[] = {
29 "FLOAT" , /* define float */
30 "VECTOR" , /* define vector */
31 "ENTITY" , /* define ent */
32 "FIELD" , /* define field */
33 "STRING" , /* define string */
37 static char *const asm_getline(size_t *byte, FILE *fp) {
39 ssize_t read = util_getline(&line, byte, fp);
48 void asm_init(const char *file, FILE **fp) {
49 *fp = fopen(file, "r");
53 void asm_close(FILE *fp) {
59 * Following parse states:
60 * ASM_FUNCTION -- in a function accepting input statements
69 char *name; /* name of constant */
70 int offset; /* location in globals */
72 VECTOR_MAKE(globals, assembly_constants);
76 for (; i < assembly_constants_elements; i++)
77 mem_d(assembly_constants_data[i].name);
78 mem_d(assembly_constants_data);
82 * Parses a type, could be global or not depending on the
83 * assembly state: global scope with assignments are constants.
84 * globals with no assignments are globals. Function body types
87 static inline bool asm_parse_type(const char *skip, size_t line, asm_state *state) {
88 if (strstr(skip, "FLOAT:") == &skip[0]) { return true; }
89 if (strstr(skip, "VECTOR:") == &skip[0]) { return true; }
90 if (strstr(skip, "ENTITY:") == &skip[0]) { return true; }
91 if (strstr(skip, "FIELD:") == &skip[0]) { return true; }
92 if (strstr(skip, "STRING:") == &skip[0]) { return true; }
97 * Parses a function: trivial case, handles occurances of duplicated
98 * names among other things. Ensures valid name as well, and even
99 * internal engine function selection.
101 static inline bool asm_parse_func(const char *skip, size_t line, asm_state *state) {
102 if (*state == ASM_FUNCTION && (strstr(skip, "FUNCTION:") == &skip[0]))
105 if (strstr(skip, "FUNCTION:") == &skip[0]) {
106 *state = ASM_FUNCTION; /* update state */
113 void asm_parse(FILE *fp) {
116 long line = 1; /* current line */
117 size_t size = 0; /* size of line */
118 asm_state state = ASM_NULL;
120 #define asm_end(x) do { mem_d(data); line++; printf(x); } while (0); continue
122 while ((data = asm_getline (&size, fp)) != NULL) {
123 data = util_strsws(data,&skip); /* skip whitespace */
124 data = util_strrnl(data); /* delete newline */
127 if(asm_parse_type(skip, line, &state)){ asm_end(""); }
129 if(asm_parse_func(skip, line, &state)){ asm_end(""); }
131 /* TODO: everything */