draw: corrections to allow for different cliptest cases
[mesa.git] / src / glsl / glcpp / glcpp-parse.c
index 579fe7c7ad8364f8e93ef88cbaedbe8de93d2653..1773ca5c13d2b81eee59979f76baf131b06dc60f 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 #include <assert.h>
-#include <stdint.h>
+#include <inttypes.h>
 
 #include "glcpp.h"
-#include "main/mtypes.h"
+#include "main/core.h" /* for struct gl_extensions */
+#include "main/mtypes.h" /* for gl_api enum */
 
 #define glcpp_print(stream, str) stream = talloc_strdup_append(stream, str)
 #define glcpp_printf(stream, fmt, args, ...) \
@@ -133,6 +134,9 @@ _string_list_contains (string_list_t *list, const char *member, int *index);
 static int
 _string_list_length (string_list_t *list);
 
+static int
+_string_list_equal (string_list_t *a, string_list_t *b);
+
 static argument_list_t *
 _argument_list_create (void *ctx);
 
@@ -165,6 +169,9 @@ _token_list_append (token_list_t *list, token_t *token);
 static void
 _token_list_append_list (token_list_t *list, token_list_t *tail);
 
+static int
+_token_list_equal_ignoring_space (token_list_t *a, token_list_t *b);
+
 static active_list_t *
 _active_list_push (active_list_t *list,
                   const char *identifier,
@@ -212,7 +219,7 @@ add_builtin_define(glcpp_parser_t *parser, const char *name, int value);
 
 
 /* Line 189 of yacc.c  */
-#line 216 "glcpp/glcpp-parse.c"
+#line 223 "glcpp/glcpp-parse.c"
 
 /* Enabling traces.  */
 #ifndef YYDEBUG
@@ -300,7 +307,7 @@ typedef struct YYLTYPE
 
 
 /* Line 264 of yacc.c  */
-#line 304 "glcpp/glcpp-parse.c"
+#line 311 "glcpp/glcpp-parse.c"
 
 #ifdef short
 # undef short
@@ -625,17 +632,17 @@ static const yytype_int8 yyrhs[] =
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   181,   181,   183,   187,   190,   195,   196,   200,   203,
-     209,   212,   215,   218,   226,   245,   255,   260,   265,   284,
-     299,   302,   305,   314,   318,   327,   332,   333,   336,   339,
-     342,   345,   348,   351,   354,   357,   360,   363,   366,   369,
-     372,   375,   378,   381,   384,   387,   390,   393,   396,   399,
-     405,   410,   418,   419,   423,   429,   430,   433,   435,   442,
-     446,   450,   455,   461,   469,   475,   483,   487,   491,   495,
-     499,   506,   507,   508,   509,   510,   511,   512,   513,   514,
-     515,   516,   517,   518,   519,   520,   521,   522,   523,   524,
-     525,   526,   527,   528,   529,   530,   531,   532,   533,   534,
-     535,   536
+       0,   188,   188,   190,   194,   197,   202,   203,   207,   210,
+     216,   219,   222,   225,   233,   252,   262,   267,   272,   291,
+     306,   309,   312,   325,   329,   338,   343,   344,   347,   350,
+     353,   356,   359,   362,   365,   368,   371,   374,   377,   380,
+     383,   386,   389,   392,   395,   398,   401,   404,   407,   410,
+     416,   421,   429,   430,   434,   440,   441,   444,   446,   453,
+     457,   461,   466,   472,   480,   486,   494,   498,   502,   506,
+     510,   517,   518,   519,   520,   521,   522,   523,   524,   525,
+     526,   527,   528,   529,   530,   531,   532,   533,   534,   535,
+     536,   537,   538,   539,   540,   541,   542,   543,   544,   545,
+     546,   547
 };
 #endif
 
@@ -1604,7 +1611,7 @@ YYLTYPE yylloc;
 /* User initialization code.  */
 
 /* Line 1251 of yacc.c  */
-#line 148 "glcpp/glcpp-parse.y"
+#line 155 "glcpp/glcpp-parse.y"
 {
        yylloc.first_line = 1;
        yylloc.first_column = 1;
@@ -1614,7 +1621,7 @@ YYLTYPE yylloc;
 }
 
 /* Line 1251 of yacc.c  */
-#line 1618 "glcpp/glcpp-parse.c"
+#line 1625 "glcpp/glcpp-parse.c"
   yylsp[0] = yylloc;
 
   goto yysetstate;
@@ -1802,7 +1809,7 @@ yyreduce:
         case 4:
 
 /* Line 1464 of yacc.c  */
-#line 187 "glcpp/glcpp-parse.y"
+#line 194 "glcpp/glcpp-parse.y"
     {
                glcpp_print(parser->output, "\n");
        ;}
@@ -1811,7 +1818,7 @@ yyreduce:
   case 5:
 
 /* Line 1464 of yacc.c  */
-#line 190 "glcpp/glcpp-parse.y"
+#line 197 "glcpp/glcpp-parse.y"
     {
                _glcpp_parser_print_expanded_token_list (parser, (yyvsp[(1) - (1)].token_list));
                glcpp_print(parser->output, "\n");
@@ -1822,7 +1829,7 @@ yyreduce:
   case 8:
 
 /* Line 1464 of yacc.c  */
-#line 200 "glcpp/glcpp-parse.y"
+#line 207 "glcpp/glcpp-parse.y"
     {
                _glcpp_parser_skip_stack_push_if (parser, & (yylsp[(1) - (3)]), (yyvsp[(2) - (3)].ival));
        ;}
@@ -1831,7 +1838,7 @@ yyreduce:
   case 9:
 
 /* Line 1464 of yacc.c  */
-#line 203 "glcpp/glcpp-parse.y"
+#line 210 "glcpp/glcpp-parse.y"
     {
                _glcpp_parser_skip_stack_change_if (parser, & (yylsp[(1) - (3)]), "elif", (yyvsp[(2) - (3)].ival));
        ;}
@@ -1840,7 +1847,7 @@ yyreduce:
   case 10:
 
 /* Line 1464 of yacc.c  */
-#line 209 "glcpp/glcpp-parse.y"
+#line 216 "glcpp/glcpp-parse.y"
     {
                _define_object_macro (parser, & (yylsp[(2) - (4)]), (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].token_list));
        ;}
@@ -1849,7 +1856,7 @@ yyreduce:
   case 11:
 
 /* Line 1464 of yacc.c  */
-#line 212 "glcpp/glcpp-parse.y"
+#line 219 "glcpp/glcpp-parse.y"
     {
                _define_function_macro (parser, & (yylsp[(2) - (6)]), (yyvsp[(2) - (6)].str), NULL, (yyvsp[(5) - (6)].token_list));
        ;}
@@ -1858,7 +1865,7 @@ yyreduce:
   case 12:
 
 /* Line 1464 of yacc.c  */
-#line 215 "glcpp/glcpp-parse.y"
+#line 222 "glcpp/glcpp-parse.y"
     {
                _define_function_macro (parser, & (yylsp[(2) - (7)]), (yyvsp[(2) - (7)].str), (yyvsp[(4) - (7)].string_list), (yyvsp[(6) - (7)].token_list));
        ;}
@@ -1867,7 +1874,7 @@ yyreduce:
   case 13:
 
 /* Line 1464 of yacc.c  */
-#line 218 "glcpp/glcpp-parse.y"
+#line 225 "glcpp/glcpp-parse.y"
     {
                macro_t *macro = hash_table_find (parser->defines, (yyvsp[(2) - (3)].str));
                if (macro) {
@@ -1881,7 +1888,7 @@ yyreduce:
   case 14:
 
 /* Line 1464 of yacc.c  */
-#line 226 "glcpp/glcpp-parse.y"
+#line 233 "glcpp/glcpp-parse.y"
     {
                /* Be careful to only evaluate the 'if' expression if
                 * we are not skipping. When we are skipping, we
@@ -1906,7 +1913,7 @@ yyreduce:
   case 15:
 
 /* Line 1464 of yacc.c  */
-#line 245 "glcpp/glcpp-parse.y"
+#line 252 "glcpp/glcpp-parse.y"
     {
                /* #if without an expression is only an error if we
                 *  are not skipping */
@@ -1922,7 +1929,7 @@ yyreduce:
   case 16:
 
 /* Line 1464 of yacc.c  */
-#line 255 "glcpp/glcpp-parse.y"
+#line 262 "glcpp/glcpp-parse.y"
     {
                macro_t *macro = hash_table_find (parser->defines, (yyvsp[(2) - (4)].str));
                talloc_free ((yyvsp[(2) - (4)].str));
@@ -1933,7 +1940,7 @@ yyreduce:
   case 17:
 
 /* Line 1464 of yacc.c  */
-#line 260 "glcpp/glcpp-parse.y"
+#line 267 "glcpp/glcpp-parse.y"
     {
                macro_t *macro = hash_table_find (parser->defines, (yyvsp[(2) - (4)].str));
                talloc_free ((yyvsp[(2) - (4)].str));
@@ -1944,7 +1951,7 @@ yyreduce:
   case 18:
 
 /* Line 1464 of yacc.c  */
-#line 265 "glcpp/glcpp-parse.y"
+#line 272 "glcpp/glcpp-parse.y"
     {
                /* Be careful to only evaluate the 'elif' expression
                 * if we are not skipping. When we are skipping, we
@@ -1969,7 +1976,7 @@ yyreduce:
   case 19:
 
 /* Line 1464 of yacc.c  */
-#line 284 "glcpp/glcpp-parse.y"
+#line 291 "glcpp/glcpp-parse.y"
     {
                /* #elif without an expression is an error unless we
                 * are skipping. */
@@ -1990,7 +1997,7 @@ yyreduce:
   case 20:
 
 /* Line 1464 of yacc.c  */
-#line 299 "glcpp/glcpp-parse.y"
+#line 306 "glcpp/glcpp-parse.y"
     {
                _glcpp_parser_skip_stack_change_if (parser, & (yylsp[(1) - (2)]), "else", 1);
        ;}
@@ -1999,7 +2006,7 @@ yyreduce:
   case 21:
 
 /* Line 1464 of yacc.c  */
-#line 302 "glcpp/glcpp-parse.y"
+#line 309 "glcpp/glcpp-parse.y"
     {
                _glcpp_parser_skip_stack_pop (parser, & (yylsp[(1) - (2)]));
        ;}
@@ -2008,7 +2015,7 @@ yyreduce:
   case 22:
 
 /* Line 1464 of yacc.c  */
-#line 305 "glcpp/glcpp-parse.y"
+#line 312 "glcpp/glcpp-parse.y"
     {
                macro_t *macro = hash_table_find (parser->defines, "__VERSION__");
                if (macro) {
@@ -2016,14 +2023,18 @@ yyreduce:
                        talloc_free (macro);
                }
                add_builtin_define (parser, "__VERSION__", (yyvsp[(2) - (3)].ival));
-               glcpp_printf(parser->output, "#version %" PRIiMAX "\n", (yyvsp[(2) - (3)].ival));
+
+               if ((yyvsp[(2) - (3)].ival) == 100)
+                       add_builtin_define (parser, "GL_ES", 1);
+
+               glcpp_printf(parser->output, "#version %" PRIiMAX, (yyvsp[(2) - (3)].ival));
        ;}
     break;
 
   case 24:
 
 /* Line 1464 of yacc.c  */
-#line 318 "glcpp/glcpp-parse.y"
+#line 329 "glcpp/glcpp-parse.y"
     {
                if (strlen ((yyvsp[(1) - (1)].str)) >= 3 && strncmp ((yyvsp[(1) - (1)].str), "0x", 2) == 0) {
                        (yyval.ival) = strtoll ((yyvsp[(1) - (1)].str) + 2, NULL, 16);
@@ -2038,7 +2049,7 @@ yyreduce:
   case 25:
 
 /* Line 1464 of yacc.c  */
-#line 327 "glcpp/glcpp-parse.y"
+#line 338 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (1)].ival);
        ;}
@@ -2047,7 +2058,7 @@ yyreduce:
   case 27:
 
 /* Line 1464 of yacc.c  */
-#line 333 "glcpp/glcpp-parse.y"
+#line 344 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) || (yyvsp[(3) - (3)].ival);
        ;}
@@ -2056,7 +2067,7 @@ yyreduce:
   case 28:
 
 /* Line 1464 of yacc.c  */
-#line 336 "glcpp/glcpp-parse.y"
+#line 347 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) && (yyvsp[(3) - (3)].ival);
        ;}
@@ -2065,7 +2076,7 @@ yyreduce:
   case 29:
 
 /* Line 1464 of yacc.c  */
-#line 339 "glcpp/glcpp-parse.y"
+#line 350 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) | (yyvsp[(3) - (3)].ival);
        ;}
@@ -2074,7 +2085,7 @@ yyreduce:
   case 30:
 
 /* Line 1464 of yacc.c  */
-#line 342 "glcpp/glcpp-parse.y"
+#line 353 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) ^ (yyvsp[(3) - (3)].ival);
        ;}
@@ -2083,7 +2094,7 @@ yyreduce:
   case 31:
 
 /* Line 1464 of yacc.c  */
-#line 345 "glcpp/glcpp-parse.y"
+#line 356 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) & (yyvsp[(3) - (3)].ival);
        ;}
@@ -2092,7 +2103,7 @@ yyreduce:
   case 32:
 
 /* Line 1464 of yacc.c  */
-#line 348 "glcpp/glcpp-parse.y"
+#line 359 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) != (yyvsp[(3) - (3)].ival);
        ;}
@@ -2101,7 +2112,7 @@ yyreduce:
   case 33:
 
 /* Line 1464 of yacc.c  */
-#line 351 "glcpp/glcpp-parse.y"
+#line 362 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) == (yyvsp[(3) - (3)].ival);
        ;}
@@ -2110,7 +2121,7 @@ yyreduce:
   case 34:
 
 /* Line 1464 of yacc.c  */
-#line 354 "glcpp/glcpp-parse.y"
+#line 365 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) >= (yyvsp[(3) - (3)].ival);
        ;}
@@ -2119,7 +2130,7 @@ yyreduce:
   case 35:
 
 /* Line 1464 of yacc.c  */
-#line 357 "glcpp/glcpp-parse.y"
+#line 368 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) <= (yyvsp[(3) - (3)].ival);
        ;}
@@ -2128,7 +2139,7 @@ yyreduce:
   case 36:
 
 /* Line 1464 of yacc.c  */
-#line 360 "glcpp/glcpp-parse.y"
+#line 371 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) > (yyvsp[(3) - (3)].ival);
        ;}
@@ -2137,7 +2148,7 @@ yyreduce:
   case 37:
 
 /* Line 1464 of yacc.c  */
-#line 363 "glcpp/glcpp-parse.y"
+#line 374 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) < (yyvsp[(3) - (3)].ival);
        ;}
@@ -2146,7 +2157,7 @@ yyreduce:
   case 38:
 
 /* Line 1464 of yacc.c  */
-#line 366 "glcpp/glcpp-parse.y"
+#line 377 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) >> (yyvsp[(3) - (3)].ival);
        ;}
@@ -2155,7 +2166,7 @@ yyreduce:
   case 39:
 
 /* Line 1464 of yacc.c  */
-#line 369 "glcpp/glcpp-parse.y"
+#line 380 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) << (yyvsp[(3) - (3)].ival);
        ;}
@@ -2164,7 +2175,7 @@ yyreduce:
   case 40:
 
 /* Line 1464 of yacc.c  */
-#line 372 "glcpp/glcpp-parse.y"
+#line 383 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) - (yyvsp[(3) - (3)].ival);
        ;}
@@ -2173,7 +2184,7 @@ yyreduce:
   case 41:
 
 /* Line 1464 of yacc.c  */
-#line 375 "glcpp/glcpp-parse.y"
+#line 386 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) + (yyvsp[(3) - (3)].ival);
        ;}
@@ -2182,7 +2193,7 @@ yyreduce:
   case 42:
 
 /* Line 1464 of yacc.c  */
-#line 378 "glcpp/glcpp-parse.y"
+#line 389 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) % (yyvsp[(3) - (3)].ival);
        ;}
@@ -2191,7 +2202,7 @@ yyreduce:
   case 43:
 
 /* Line 1464 of yacc.c  */
-#line 381 "glcpp/glcpp-parse.y"
+#line 392 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) / (yyvsp[(3) - (3)].ival);
        ;}
@@ -2200,7 +2211,7 @@ yyreduce:
   case 44:
 
 /* Line 1464 of yacc.c  */
-#line 384 "glcpp/glcpp-parse.y"
+#line 395 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(1) - (3)].ival) * (yyvsp[(3) - (3)].ival);
        ;}
@@ -2209,7 +2220,7 @@ yyreduce:
   case 45:
 
 /* Line 1464 of yacc.c  */
-#line 387 "glcpp/glcpp-parse.y"
+#line 398 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = ! (yyvsp[(2) - (2)].ival);
        ;}
@@ -2218,7 +2229,7 @@ yyreduce:
   case 46:
 
 /* Line 1464 of yacc.c  */
-#line 390 "glcpp/glcpp-parse.y"
+#line 401 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = ~ (yyvsp[(2) - (2)].ival);
        ;}
@@ -2227,7 +2238,7 @@ yyreduce:
   case 47:
 
 /* Line 1464 of yacc.c  */
-#line 393 "glcpp/glcpp-parse.y"
+#line 404 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = - (yyvsp[(2) - (2)].ival);
        ;}
@@ -2236,7 +2247,7 @@ yyreduce:
   case 48:
 
 /* Line 1464 of yacc.c  */
-#line 396 "glcpp/glcpp-parse.y"
+#line 407 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = + (yyvsp[(2) - (2)].ival);
        ;}
@@ -2245,7 +2256,7 @@ yyreduce:
   case 49:
 
 /* Line 1464 of yacc.c  */
-#line 399 "glcpp/glcpp-parse.y"
+#line 410 "glcpp/glcpp-parse.y"
     {
                (yyval.ival) = (yyvsp[(2) - (3)].ival);
        ;}
@@ -2254,7 +2265,7 @@ yyreduce:
   case 50:
 
 /* Line 1464 of yacc.c  */
-#line 405 "glcpp/glcpp-parse.y"
+#line 416 "glcpp/glcpp-parse.y"
     {
                (yyval.string_list) = _string_list_create (parser);
                _string_list_append_item ((yyval.string_list), (yyvsp[(1) - (1)].str));
@@ -2265,7 +2276,7 @@ yyreduce:
   case 51:
 
 /* Line 1464 of yacc.c  */
-#line 410 "glcpp/glcpp-parse.y"
+#line 421 "glcpp/glcpp-parse.y"
     {
                (yyval.string_list) = (yyvsp[(1) - (3)].string_list);   
                _string_list_append_item ((yyval.string_list), (yyvsp[(3) - (3)].str));
@@ -2276,14 +2287,14 @@ yyreduce:
   case 52:
 
 /* Line 1464 of yacc.c  */
-#line 418 "glcpp/glcpp-parse.y"
+#line 429 "glcpp/glcpp-parse.y"
     { (yyval.token_list) = NULL; ;}
     break;
 
   case 54:
 
 /* Line 1464 of yacc.c  */
-#line 423 "glcpp/glcpp-parse.y"
+#line 434 "glcpp/glcpp-parse.y"
     {
                yyerror (& (yylsp[(1) - (2)]), parser, "Invalid tokens after #");
        ;}
@@ -2292,14 +2303,14 @@ yyreduce:
   case 55:
 
 /* Line 1464 of yacc.c  */
-#line 429 "glcpp/glcpp-parse.y"
+#line 440 "glcpp/glcpp-parse.y"
     { (yyval.token_list) = NULL; ;}
     break;
 
   case 58:
 
 /* Line 1464 of yacc.c  */
-#line 435 "glcpp/glcpp-parse.y"
+#line 446 "glcpp/glcpp-parse.y"
     {
                glcpp_warning(&(yylsp[(1) - (1)]), parser, "extra tokens at end of directive");
        ;}
@@ -2308,7 +2319,7 @@ yyreduce:
   case 59:
 
 /* Line 1464 of yacc.c  */
-#line 442 "glcpp/glcpp-parse.y"
+#line 453 "glcpp/glcpp-parse.y"
     {
                int v = hash_table_find (parser->defines, (yyvsp[(2) - (2)].str)) ? 1 : 0;
                (yyval.token) = _token_create_ival (parser, INTEGER, v);
@@ -2318,7 +2329,7 @@ yyreduce:
   case 60:
 
 /* Line 1464 of yacc.c  */
-#line 446 "glcpp/glcpp-parse.y"
+#line 457 "glcpp/glcpp-parse.y"
     {
                int v = hash_table_find (parser->defines, (yyvsp[(3) - (4)].str)) ? 1 : 0;
                (yyval.token) = _token_create_ival (parser, INTEGER, v);
@@ -2328,7 +2339,7 @@ yyreduce:
   case 62:
 
 /* Line 1464 of yacc.c  */
-#line 455 "glcpp/glcpp-parse.y"
+#line 466 "glcpp/glcpp-parse.y"
     {
                parser->space_tokens = 1;
                (yyval.token_list) = _token_list_create (parser);
@@ -2340,7 +2351,7 @@ yyreduce:
   case 63:
 
 /* Line 1464 of yacc.c  */
-#line 461 "glcpp/glcpp-parse.y"
+#line 472 "glcpp/glcpp-parse.y"
     {
                (yyval.token_list) = (yyvsp[(1) - (2)].token_list);
                _token_list_append ((yyval.token_list), (yyvsp[(2) - (2)].token));
@@ -2351,7 +2362,7 @@ yyreduce:
   case 64:
 
 /* Line 1464 of yacc.c  */
-#line 469 "glcpp/glcpp-parse.y"
+#line 480 "glcpp/glcpp-parse.y"
     {
                parser->space_tokens = 1;
                (yyval.token_list) = _token_list_create (parser);
@@ -2363,7 +2374,7 @@ yyreduce:
   case 65:
 
 /* Line 1464 of yacc.c  */
-#line 475 "glcpp/glcpp-parse.y"
+#line 486 "glcpp/glcpp-parse.y"
     {
                (yyval.token_list) = (yyvsp[(1) - (2)].token_list);
                _token_list_append ((yyval.token_list), (yyvsp[(2) - (2)].token));
@@ -2374,7 +2385,7 @@ yyreduce:
   case 66:
 
 /* Line 1464 of yacc.c  */
-#line 483 "glcpp/glcpp-parse.y"
+#line 494 "glcpp/glcpp-parse.y"
     {
                (yyval.token) = _token_create_str (parser, IDENTIFIER, (yyvsp[(1) - (1)].str));
                (yyval.token)->location = yylloc;
@@ -2384,7 +2395,7 @@ yyreduce:
   case 67:
 
 /* Line 1464 of yacc.c  */
-#line 487 "glcpp/glcpp-parse.y"
+#line 498 "glcpp/glcpp-parse.y"
     {
                (yyval.token) = _token_create_str (parser, INTEGER_STRING, (yyvsp[(1) - (1)].str));
                (yyval.token)->location = yylloc;
@@ -2394,7 +2405,7 @@ yyreduce:
   case 68:
 
 /* Line 1464 of yacc.c  */
-#line 491 "glcpp/glcpp-parse.y"
+#line 502 "glcpp/glcpp-parse.y"
     {
                (yyval.token) = _token_create_ival (parser, (yyvsp[(1) - (1)].ival), (yyvsp[(1) - (1)].ival));
                (yyval.token)->location = yylloc;
@@ -2404,7 +2415,7 @@ yyreduce:
   case 69:
 
 /* Line 1464 of yacc.c  */
-#line 495 "glcpp/glcpp-parse.y"
+#line 506 "glcpp/glcpp-parse.y"
     {
                (yyval.token) = _token_create_str (parser, OTHER, (yyvsp[(1) - (1)].str));
                (yyval.token)->location = yylloc;
@@ -2414,7 +2425,7 @@ yyreduce:
   case 70:
 
 /* Line 1464 of yacc.c  */
-#line 499 "glcpp/glcpp-parse.y"
+#line 510 "glcpp/glcpp-parse.y"
     {
                (yyval.token) = _token_create_ival (parser, SPACE, SPACE);
                (yyval.token)->location = yylloc;
@@ -2424,224 +2435,224 @@ yyreduce:
   case 71:
 
 /* Line 1464 of yacc.c  */
-#line 506 "glcpp/glcpp-parse.y"
+#line 517 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '['; ;}
     break;
 
   case 72:
 
 /* Line 1464 of yacc.c  */
-#line 507 "glcpp/glcpp-parse.y"
+#line 518 "glcpp/glcpp-parse.y"
     { (yyval.ival) = ']'; ;}
     break;
 
   case 73:
 
 /* Line 1464 of yacc.c  */
-#line 508 "glcpp/glcpp-parse.y"
+#line 519 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '('; ;}
     break;
 
   case 74:
 
 /* Line 1464 of yacc.c  */
-#line 509 "glcpp/glcpp-parse.y"
+#line 520 "glcpp/glcpp-parse.y"
     { (yyval.ival) = ')'; ;}
     break;
 
   case 75:
 
 /* Line 1464 of yacc.c  */
-#line 510 "glcpp/glcpp-parse.y"
+#line 521 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '{'; ;}
     break;
 
   case 76:
 
 /* Line 1464 of yacc.c  */
-#line 511 "glcpp/glcpp-parse.y"
+#line 522 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '}'; ;}
     break;
 
   case 77:
 
 /* Line 1464 of yacc.c  */
-#line 512 "glcpp/glcpp-parse.y"
+#line 523 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '.'; ;}
     break;
 
   case 78:
 
 /* Line 1464 of yacc.c  */
-#line 513 "glcpp/glcpp-parse.y"
+#line 524 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '&'; ;}
     break;
 
   case 79:
 
 /* Line 1464 of yacc.c  */
-#line 514 "glcpp/glcpp-parse.y"
+#line 525 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '*'; ;}
     break;
 
   case 80:
 
 /* Line 1464 of yacc.c  */
-#line 515 "glcpp/glcpp-parse.y"
+#line 526 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '+'; ;}
     break;
 
   case 81:
 
 /* Line 1464 of yacc.c  */
-#line 516 "glcpp/glcpp-parse.y"
+#line 527 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '-'; ;}
     break;
 
   case 82:
 
 /* Line 1464 of yacc.c  */
-#line 517 "glcpp/glcpp-parse.y"
+#line 528 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '~'; ;}
     break;
 
   case 83:
 
 /* Line 1464 of yacc.c  */
-#line 518 "glcpp/glcpp-parse.y"
+#line 529 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '!'; ;}
     break;
 
   case 84:
 
 /* Line 1464 of yacc.c  */
-#line 519 "glcpp/glcpp-parse.y"
+#line 530 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '/'; ;}
     break;
 
   case 85:
 
 /* Line 1464 of yacc.c  */
-#line 520 "glcpp/glcpp-parse.y"
+#line 531 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '%'; ;}
     break;
 
   case 86:
 
 /* Line 1464 of yacc.c  */
-#line 521 "glcpp/glcpp-parse.y"
+#line 532 "glcpp/glcpp-parse.y"
     { (yyval.ival) = LEFT_SHIFT; ;}
     break;
 
   case 87:
 
 /* Line 1464 of yacc.c  */
-#line 522 "glcpp/glcpp-parse.y"
+#line 533 "glcpp/glcpp-parse.y"
     { (yyval.ival) = RIGHT_SHIFT; ;}
     break;
 
   case 88:
 
 /* Line 1464 of yacc.c  */
-#line 523 "glcpp/glcpp-parse.y"
+#line 534 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '<'; ;}
     break;
 
   case 89:
 
 /* Line 1464 of yacc.c  */
-#line 524 "glcpp/glcpp-parse.y"
+#line 535 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '>'; ;}
     break;
 
   case 90:
 
 /* Line 1464 of yacc.c  */
-#line 525 "glcpp/glcpp-parse.y"
+#line 536 "glcpp/glcpp-parse.y"
     { (yyval.ival) = LESS_OR_EQUAL; ;}
     break;
 
   case 91:
 
 /* Line 1464 of yacc.c  */
-#line 526 "glcpp/glcpp-parse.y"
+#line 537 "glcpp/glcpp-parse.y"
     { (yyval.ival) = GREATER_OR_EQUAL; ;}
     break;
 
   case 92:
 
 /* Line 1464 of yacc.c  */
-#line 527 "glcpp/glcpp-parse.y"
+#line 538 "glcpp/glcpp-parse.y"
     { (yyval.ival) = EQUAL; ;}
     break;
 
   case 93:
 
 /* Line 1464 of yacc.c  */
-#line 528 "glcpp/glcpp-parse.y"
+#line 539 "glcpp/glcpp-parse.y"
     { (yyval.ival) = NOT_EQUAL; ;}
     break;
 
   case 94:
 
 /* Line 1464 of yacc.c  */
-#line 529 "glcpp/glcpp-parse.y"
+#line 540 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '^'; ;}
     break;
 
   case 95:
 
 /* Line 1464 of yacc.c  */
-#line 530 "glcpp/glcpp-parse.y"
+#line 541 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '|'; ;}
     break;
 
   case 96:
 
 /* Line 1464 of yacc.c  */
-#line 531 "glcpp/glcpp-parse.y"
+#line 542 "glcpp/glcpp-parse.y"
     { (yyval.ival) = AND; ;}
     break;
 
   case 97:
 
 /* Line 1464 of yacc.c  */
-#line 532 "glcpp/glcpp-parse.y"
+#line 543 "glcpp/glcpp-parse.y"
     { (yyval.ival) = OR; ;}
     break;
 
   case 98:
 
 /* Line 1464 of yacc.c  */
-#line 533 "glcpp/glcpp-parse.y"
+#line 544 "glcpp/glcpp-parse.y"
     { (yyval.ival) = ';'; ;}
     break;
 
   case 99:
 
 /* Line 1464 of yacc.c  */
-#line 534 "glcpp/glcpp-parse.y"
+#line 545 "glcpp/glcpp-parse.y"
     { (yyval.ival) = ','; ;}
     break;
 
   case 100:
 
 /* Line 1464 of yacc.c  */
-#line 535 "glcpp/glcpp-parse.y"
+#line 546 "glcpp/glcpp-parse.y"
     { (yyval.ival) = '='; ;}
     break;
 
   case 101:
 
 /* Line 1464 of yacc.c  */
-#line 536 "glcpp/glcpp-parse.y"
+#line 547 "glcpp/glcpp-parse.y"
     { (yyval.ival) = PASTE; ;}
     break;
 
 
 
 /* Line 1464 of yacc.c  */
-#line 2645 "glcpp/glcpp-parse.c"
+#line 2656 "glcpp/glcpp-parse.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -2860,7 +2871,7 @@ yyreturn:
 
 
 /* Line 1684 of yacc.c  */
-#line 539 "glcpp/glcpp-parse.y"
+#line 550 "glcpp/glcpp-parse.y"
 
 
 string_list_t *
@@ -2929,6 +2940,31 @@ _string_list_length (string_list_t *list)
        return length;
 }
 
+int
+_string_list_equal (string_list_t *a, string_list_t *b)
+{
+       string_node_t *node_a, *node_b;
+
+       if (a == NULL && b == NULL)
+               return 1;
+
+       if (a == NULL || b == NULL)
+               return 0;
+
+       for (node_a = a->head, node_b = b->head;
+            node_a && node_b;
+            node_a = node_a->next, node_b = node_b->next)
+       {
+               if (strcmp (node_a->str, node_b->str))
+                       return 0;
+       }
+
+       /* Catch the case of lists being different lengths, (which
+        * would cause the loop above to terminate after the shorter
+        * list). */
+       return node_a == node_b;
+}
+
 argument_list_t *
 _argument_list_create (void *ctx)
 {
@@ -3106,6 +3142,61 @@ _token_list_trim_trailing_space (token_list_t *list)
        }
 }
 
+int
+_token_list_equal_ignoring_space (token_list_t *a, token_list_t *b)
+{
+       token_node_t *node_a, *node_b;
+
+       node_a = a->head;
+       node_b = b->head;
+
+       while (1)
+       {
+               if (node_a == NULL && node_b == NULL)
+                       break;
+
+               if (node_a == NULL || node_b == NULL)
+                       return 0;
+
+               if (node_a->token->type == SPACE) {
+                       node_a = node_a->next;
+                       continue;
+               }
+
+               if (node_b->token->type == SPACE) {
+                       node_b = node_b->next;
+                       continue;
+               }
+
+               if (node_a->token->type != node_b->token->type)
+                       return 0;
+
+               switch (node_a->token->type) {
+               case INTEGER:
+                       if (node_a->token->value.ival != 
+                           node_b->token->value.ival)
+                       {
+                               return 0;
+                       }
+                       break;
+               case IDENTIFIER:
+               case INTEGER_STRING:
+               case OTHER:
+                       if (strcmp (node_a->token->value.str,
+                                   node_b->token->value.str))
+                       {
+                               return 0;
+                       }
+                       break;
+               }
+
+               node_a = node_a->next;
+               node_b = node_b->next;
+       }
+
+       return 1;
+}
+
 static void
 _token_print (char **out, token_t *token)
 {
@@ -3287,7 +3378,7 @@ static void add_builtin_define(glcpp_parser_t *parser,
 }
 
 glcpp_parser_t *
-glcpp_parser_create (const struct gl_extensions *extensions)
+glcpp_parser_create (const struct gl_extensions *extensions, int api)
 {
        glcpp_parser_t *parser;
        int language_version;
@@ -3317,6 +3408,9 @@ glcpp_parser_create (const struct gl_extensions *extensions)
        add_builtin_define(parser, "GL_ARB_draw_buffers", 1);
        add_builtin_define(parser, "GL_ARB_texture_rectangle", 1);
 
+       if (api == API_OPENGLES2)
+               add_builtin_define(parser, "GL_ES", 1);
+
        if (extensions != NULL) {
           if (extensions->EXT_texture_array) {
              add_builtin_define(parser, "GL_EXT_texture_array", 1);
@@ -3847,13 +3941,28 @@ _check_for_reserved_macro_name (glcpp_parser_t *parser, YYLTYPE *loc,
        }
 }
 
+static int
+_macro_equal (macro_t *a, macro_t *b)
+{
+       if (a->is_function != b->is_function)
+               return 0;
+
+       if (a->is_function) {
+               if (! _string_list_equal (a->parameters, b->parameters))
+                       return 0;
+       }
+
+       return _token_list_equal_ignoring_space (a->replacements,
+                                                b->replacements);
+}
+
 void
 _define_object_macro (glcpp_parser_t *parser,
                      YYLTYPE *loc,
                      const char *identifier,
                      token_list_t *replacements)
 {
-       macro_t *macro;
+       macro_t *macro, *previous;
 
        if (loc != NULL)
                _check_for_reserved_macro_name(parser, loc, identifier);
@@ -3865,6 +3974,16 @@ _define_object_macro (glcpp_parser_t *parser,
        macro->identifier = talloc_strdup (macro, identifier);
        macro->replacements = talloc_steal (macro, replacements);
 
+       previous = hash_table_find (parser->defines, identifier);
+       if (previous) {
+               if (_macro_equal (macro, previous)) {
+                       talloc_free (macro);
+                       return;
+               }
+               glcpp_error (loc, parser, "Redefinition of macro %s\n",
+                            identifier);
+       }
+
        hash_table_insert (parser->defines, macro, identifier);
 }
 
@@ -3875,7 +3994,7 @@ _define_function_macro (glcpp_parser_t *parser,
                        string_list_t *parameters,
                        token_list_t *replacements)
 {
-       macro_t *macro;
+       macro_t *macro, *previous;
 
        _check_for_reserved_macro_name(parser, loc, identifier);
 
@@ -3886,6 +4005,16 @@ _define_function_macro (glcpp_parser_t *parser,
        macro->identifier = talloc_strdup (macro, identifier);
        macro->replacements = talloc_steal (macro, replacements);
 
+       previous = hash_table_find (parser->defines, identifier);
+       if (previous) {
+               if (_macro_equal (macro, previous)) {
+                       talloc_free (macro);
+                       return;
+               }
+               glcpp_error (loc, parser, "Redefinition of macro %s\n",
+                            identifier);
+       }
+
        hash_table_insert (parser->defines, macro, identifier);
 }