]> de.git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
More assembler code
authorDale Weiler <killfieldengine@gmail.com>
Fri, 27 Apr 2012 20:45:34 +0000 (16:45 -0400)
committerDale Weiler <killfieldengine@gmail.com>
Fri, 27 Apr 2012 20:45:34 +0000 (16:45 -0400)
asm.c
gmqcc.h
util.c

diff --git a/asm.c b/asm.c
index 1ab8275836d5ed4d821a7e3ed7aa17f709629437..ae50a0520013d26df7ca107d0087f2a092bb9127 100644 (file)
--- a/asm.c
+++ b/asm.c
@@ -78,22 +78,58 @@ void asm_clear() {
     mem_d(assembly_constants_data);
 }
 
+/*
+ * Parses a type, could be global or not depending on the
+ * assembly state: global scope with assignments are constants.
+ * globals with no assignments are globals.  Function body types
+ * are locals.
+ */
+static inline bool asm_parse_type(const char *skip, size_t line, asm_state *state) {
+    if (strstr(skip, "FLOAT:")  == &skip[0]) { return true; }
+    if (strstr(skip, "VECTOR:") == &skip[0]) { return true; }
+    if (strstr(skip, "ENTITY:") == &skip[0]) { return true; }
+    if (strstr(skip, "FIELD:")  == &skip[0]) { return true; }
+    if (strstr(skip, "STRING:") == &skip[0]) { return true; }
+    return false;
+}
+
+/*
+ * Parses a function: trivial case, handles occurances of duplicated
+ * names among other things.  Ensures valid name as well, and even
+ * internal engine function selection.
+ */
+static inline bool asm_parse_func(const char *skip, size_t line, asm_state *state) {
+    if (*state == ASM_FUNCTION && (strstr(skip, "FUNCTION:") == &skip[0]))
+        return false;
+
+    if (strstr(skip, "FUNCTION:") == &skip[0]) {
+        *state = ASM_FUNCTION; /* update state */
+        /* TODO */
+        return true;
+    }
+    return false;
+}
+
 void asm_parse(FILE *fp) {
     char     *data  = NULL;
+    char     *skip  = NULL;
     long      line  = 1; /* current line */
     size_t    size  = 0; /* size of line */
     asm_state state = ASM_NULL;
+
+    #define asm_end(x) do { mem_d(data); line++; printf(x); } while (0); continue
     
-    while ((data = asm_getline(&size, fp)) != NULL) {
-        data = util_strsws(data); /* skip   whitespace */
-        data = util_strrnl(data); /* delete newline    */
+    while ((data = asm_getline (&size, fp)) != NULL) {
+        data = util_strsws(data,&skip); /* skip   whitespace */
+        data = util_strrnl(data);       /* delete newline    */
 
+        /* parse type */
+        if(asm_parse_type(skip, line, &state)){ asm_end(""); }
+        /* parse func */
+        if(asm_parse_func(skip, line, &state)){ asm_end(""); }
+        
         /* TODO: everything */
         (void)state;
-        goto end;
-    end:
-        mem_d(data);
-        line ++;
     }
        asm_clear();
 }
diff --git a/gmqcc.h b/gmqcc.h
index 6489c4979eb649a8444a36615633aadcf6b6ede0..0cf779761500e27a09cf27f2d0278fadf95e9e64 100644 (file)
--- a/gmqcc.h
+++ b/gmqcc.h
@@ -197,7 +197,7 @@ void  util_meminfo       ();
 char *util_strdup        (const char *);
 char *util_strrq         (char *);
 char *util_strrnl        (char *);
-char *util_strsws        (char *);
+char *util_strsws        (char *, char **);
 void  util_debug         (const char *, const char *, ...);
 int   util_getline       (char **, size_t *, FILE *);
 void  util_endianswap    (void *,  int, int);
diff --git a/util.c b/util.c
index 1b73cfdbdf0b32c0bc0d6bd90babce4758fa0e27..2b59537c69ba45f5b32289ffcb54b89f20e925b7 100644 (file)
--- a/util.c
+++ b/util.c
@@ -137,13 +137,14 @@ char *util_strrnl(char *src) {
  * skipping past it, and stroing the skip distance, so
  * the string can later be freed (if it was allocated)
  */
-char *util_strsws(char *skip) {
+char *util_strsws(char *skip, char **move) {
     size_t size = 0;
     if (!skip)
         return NULL;
     
     while (*skip == ' ' || *skip == '\t')
         skip++,size++;
+    *move = skip;
     return skip-size;
 }