+ 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 */
+ size_t len;
+ varentry_t vx, vy, vz;
+
+ 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 = (char*)mem_a(len+3);
+ vy.name = (char*)mem_a(len+3);
+ vz.name = (char*)mem_a(len+3);
+ memcpy(vx.name, varent.name, len);
+ memcpy(vy.name, varent.name, len);
+ memcpy(vz.name, varent.name, len);
+ 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);
+ }
+
+nextfield:
+ if (!parser_next(parser)) {
+ parseerror(parser, "expected semicolon or another field name");
+ return false;
+ }
+ if (parser->tok == ';')
+ break;
+ if (parser->tok != ',' || !parser_next(parser)) {
+ parseerror(parser, "expected semicolon or another field name");
+ return false;
+ }