]> de.git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
vector fields now get _x, _y and _z too
authorWolfgang (Blub) Bumiller <blub@speed.at>
Tue, 14 Aug 2012 18:00:11 +0000 (20:00 +0200)
committerWolfgang (Blub) Bumiller <blub@speed.at>
Tue, 14 Aug 2012 18:00:11 +0000 (20:00 +0200)
parser.c

index eedea46056ec378ec78e44fa3575b12349e3c235..673a624cbcef4a986f0c7a05e6a8b57008008a86 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -1838,16 +1838,34 @@ static bool parser_do(parser_t *parser)
         fld->expression.next = (ast_expression*)var;
 
         varent.var = (ast_expression*)fld;
+        varent.name = util_strdup(fld->name);
+        (void)!parser_t_fields_add(parser, varent);
+
         if (var->expression.vtype == TYPE_VECTOR)
         {
             /* create _x, _y and _z fields as well */
-            parseerror(parser, "TODO: vector field members (_x,_y,_z)");
-            ast_delete(fld);
-            return false;
-        }
+            size_t len;
+            varentry_t vx, vy, vz;
 
-        varent.name = util_strdup(fld->name);
-        (void)!parser_t_fields_add(parser, varent);
+            len = strlen(varent.name);
+            vx.var = (ast_expression*)ast_member_new(ast_ctx(fld), (ast_expression*)fld, 0);
+            vy.var = (ast_expression*)ast_member_new(ast_ctx(fld), (ast_expression*)fld, 1);
+            vz.var = (ast_expression*)ast_member_new(ast_ctx(fld), (ast_expression*)fld, 2);
+            vx.name = mem_a(len+3);
+            vy.name = mem_a(len+3);
+            vz.name = mem_a(len+3);
+            strcpy(vx.name, varent.name);
+            strcpy(vy.name, varent.name);
+            strcpy(vz.name, varent.name);
+            vx.name[len] = vy.name[len] = vz.name[len] = '_';
+            vx.name[len+1] = 'x';
+            vy.name[len+1] = 'y';
+            vz.name[len+1] = 'z';
+            vx.name[len+2] = vy.name[len+2] = vz.name[len+2] = 0;
+            (void)!parser_t_fields_add(parser, vx);
+            (void)!parser_t_fields_add(parser, vy);
+            (void)!parser_t_fields_add(parser, vz);
+        }
 
         /* end with a semicolon */
         if (!parser_next(parser) || parser->tok != ';') {