]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
Handling definition of builtins
authorWolfgang Bumiller <wolfgang.linux@bumiller.com>
Thu, 19 Jul 2012 15:39:19 +0000 (17:39 +0200)
committerWolfgang Bumiller <wolfgang.linux@bumiller.com>
Thu, 19 Jul 2012 15:39:19 +0000 (17:39 +0200)
lexer.c
parser.c

diff --git a/lexer.c b/lexer.c
index 5c98d31caedbcf1f95fba984d871686558cc0f5d..ebbe1880c01f330ecb24fdf0ec81827f00000c55 100644 (file)
--- a/lexer.c
+++ b/lexer.c
@@ -466,6 +466,8 @@ int lex_do(lex_file *lex)
 
                case ',':
 
+               case '#':
+
                        return (lex->tok->ttype = ch);
                default:
                        break;
index 8901fa29b491e3be231763d6545d7b2836d725fc..fb24e938496f7e156ec70734a8d11247b6013b47 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -125,6 +125,7 @@ bool parser_do(parser_t *parser)
 {
     if (parser->tok == TOKEN_TYPENAME)
     {
+        lex_ctx ctx = parser_ctx(parser);
         ast_value *var = parser_parse_type(parser);
         if (!var)
             return false;
@@ -146,12 +147,12 @@ bool parser_do(parser_t *parser)
             return false;
         }
 
-        if (!parser_t_globals_add(parser, var))
-            return false;
-
-        /* Constant assignment */
-        if (!parser_next(parser))
+        if (!parser_t_globals_add(parser, var) ||
+            !parser_next(parser))
+        {
+            ast_value_delete(var);
             return false;
+        }
 
         if (parser->tok == ';') {
             if (!parser_next(parser))
@@ -167,9 +168,41 @@ bool parser_do(parser_t *parser)
         if (!parser_next(parser))
             return false;
 
-        /* '=' found, assign... */
-        parseerror(parser, "TODO, const assignment");
-        return false;
+        if (parser->tok == '#') {
+            /* builtin function */
+            ast_function *func;
+            ast_value    *fval;
+            if (!parser_next(parser)) {
+                parseerror(parser, "expected builtin number");
+                return false;
+            }
+
+            fval = ast_value_new(ctx, var->name, TYPE_FUNCTION);
+            func = ast_function_new(ctx, var->name, fval);
+            if (!fval || !func) {
+                if (fval) ast_value_delete(fval);
+                if (func) ast_function_delete(func);
+                return false;
+            }
+
+            fval->expression.next = (ast_expression*)var;
+            MEM_VECTOR_MOVE(var, params, fval, params);
+
+            /* replace the variable */
+            parser->globals[parser->globals_count-1] = fval;
+        } else {
+            parseerror(parser, "TODO, const assignment");
+        }
+
+        if (!parser_next(parser))
+            return false;
+
+        if (parser->tok != ';') {
+            parseerror(parser, "expected semicolon");
+            return false;
+        }
+
+        return true;
     }
     else if (parser->tok == TOKEN_KEYWORD)
     {