]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/parser.cpp
Add support for uint types in GLSL
[libs/gl.git] / source / glsl / parser.cpp
index ac35216a4cdd164aeb80b1d1f597e4b1fb4803ec..0512c10b235ea6d384d17e319d9a4a5ce3e5c7b2 100644 (file)
@@ -72,6 +72,7 @@ void Parser::parse_source(const string &name, int index)
                declared_types.insert("void");
                declared_types.insert("bool");
                declared_types.insert("int");
+               declared_types.insert("uint");
                declared_types.insert("float");
        }
 
@@ -268,6 +269,8 @@ RefPtr<Statement> Parser::parse_global_declaration()
                if(is_interface_qualifier(token) && tokenizer.peek_token(1)==";")
                {
                        RefPtr<InterfaceLayout> iface_lo = create_node<InterfaceLayout>();
+                       iface_lo->layout.source = layout->source;
+                       iface_lo->layout.line = layout->line;
                        iface_lo->layout.qualifiers = layout->qualifiers;
                        iface_lo->interface = tokenizer.parse_token();
                        tokenizer.expect(";");
@@ -395,9 +398,8 @@ RefPtr<Layout> Parser::parse_layout()
                if(token==")")
                        throw parse_error(tokenizer.get_location(), token, "a layout qualifier name");
 
-               layout->qualifiers.push_back(Layout::Qualifier());
+               layout->qualifiers.push_back(token);
                Layout::Qualifier &qual = layout->qualifiers.back();
-               qual.name = token;
 
                if((qual.has_value = check("=")))
                {
@@ -535,10 +537,14 @@ RefPtr<Literal> Parser::parse_literal()
        if(isdigit(literal->token[0]))
        {
                // TODO have the tokenizer return the type of the token
-               if(isnumrc(literal->token))
-                       literal->value = lexical_cast<int>(literal->token);
-               else
+               if(literal->token.back()=='u')
+                       literal->value = lexical_cast<unsigned>(literal->token.substr(0, literal->token.size()-1));
+               else if(literal->token.back()=='f')
+                       literal->value = lexical_cast<float>(literal->token.substr(0, literal->token.size()-1));
+               else if(literal->token.find('.')!=string::npos)
                        literal->value = lexical_cast<float>(literal->token);
+               else
+                       literal->value = lexical_cast<int>(literal->token);
        }
        else if(literal->token=="true" || literal->token=="false")
                literal->value = (literal->token=="true");