1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright © 2010 Intel Corporation 3*61046927SAndroid Build Coastguard Worker * 4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"), 6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation 7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the 9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions: 10*61046927SAndroid Build Coastguard Worker * 11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next 12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the 13*61046927SAndroid Build Coastguard Worker * Software. 14*61046927SAndroid Build Coastguard Worker * 15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21*61046927SAndroid Build Coastguard Worker * DEALINGS IN THE SOFTWARE. 22*61046927SAndroid Build Coastguard Worker */ 23*61046927SAndroid Build Coastguard Worker 24*61046927SAndroid Build Coastguard Worker #ifndef GLCPP_H 25*61046927SAndroid Build Coastguard Worker #define GLCPP_H 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Worker #include <stdint.h> 28*61046927SAndroid Build Coastguard Worker #include <stdbool.h> 29*61046927SAndroid Build Coastguard Worker 30*61046927SAndroid Build Coastguard Worker #include "main/menums.h" 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard Worker #include "util/ralloc.h" 33*61046927SAndroid Build Coastguard Worker 34*61046927SAndroid Build Coastguard Worker #include "util/hash_table.h" 35*61046927SAndroid Build Coastguard Worker 36*61046927SAndroid Build Coastguard Worker #include "util/string_buffer.h" 37*61046927SAndroid Build Coastguard Worker 38*61046927SAndroid Build Coastguard Worker struct gl_context; 39*61046927SAndroid Build Coastguard Worker 40*61046927SAndroid Build Coastguard Worker #define yyscan_t void* 41*61046927SAndroid Build Coastguard Worker 42*61046927SAndroid Build Coastguard Worker /* Some data types used for parser values. */ 43*61046927SAndroid Build Coastguard Worker 44*61046927SAndroid Build Coastguard Worker typedef struct expression_value { 45*61046927SAndroid Build Coastguard Worker intmax_t value; 46*61046927SAndroid Build Coastguard Worker char *undefined_macro; 47*61046927SAndroid Build Coastguard Worker } expression_value_t; 48*61046927SAndroid Build Coastguard Worker 49*61046927SAndroid Build Coastguard Worker 50*61046927SAndroid Build Coastguard Worker typedef struct string_node { 51*61046927SAndroid Build Coastguard Worker const char *str; 52*61046927SAndroid Build Coastguard Worker struct string_node *next; 53*61046927SAndroid Build Coastguard Worker } string_node_t; 54*61046927SAndroid Build Coastguard Worker 55*61046927SAndroid Build Coastguard Worker typedef struct string_list { 56*61046927SAndroid Build Coastguard Worker string_node_t *head; 57*61046927SAndroid Build Coastguard Worker string_node_t *tail; 58*61046927SAndroid Build Coastguard Worker } string_list_t; 59*61046927SAndroid Build Coastguard Worker 60*61046927SAndroid Build Coastguard Worker typedef struct token token_t; 61*61046927SAndroid Build Coastguard Worker typedef struct token_list token_list_t; 62*61046927SAndroid Build Coastguard Worker 63*61046927SAndroid Build Coastguard Worker typedef union YYSTYPE 64*61046927SAndroid Build Coastguard Worker { 65*61046927SAndroid Build Coastguard Worker intmax_t ival; 66*61046927SAndroid Build Coastguard Worker expression_value_t expression_value; 67*61046927SAndroid Build Coastguard Worker char *str; 68*61046927SAndroid Build Coastguard Worker string_list_t *string_list; 69*61046927SAndroid Build Coastguard Worker token_t *token; 70*61046927SAndroid Build Coastguard Worker token_list_t *token_list; 71*61046927SAndroid Build Coastguard Worker } YYSTYPE; 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Worker # define YYSTYPE_IS_TRIVIAL 1 74*61046927SAndroid Build Coastguard Worker # define YYSTYPE_IS_DECLARED 1 75*61046927SAndroid Build Coastguard Worker 76*61046927SAndroid Build Coastguard Worker typedef struct YYLTYPE { 77*61046927SAndroid Build Coastguard Worker int first_line; 78*61046927SAndroid Build Coastguard Worker int first_column; 79*61046927SAndroid Build Coastguard Worker int last_line; 80*61046927SAndroid Build Coastguard Worker int last_column; 81*61046927SAndroid Build Coastguard Worker unsigned source; 82*61046927SAndroid Build Coastguard Worker } YYLTYPE; 83*61046927SAndroid Build Coastguard Worker # define YYLTYPE_IS_DECLARED 1 84*61046927SAndroid Build Coastguard Worker # define YYLTYPE_IS_TRIVIAL 1 85*61046927SAndroid Build Coastguard Worker 86*61046927SAndroid Build Coastguard Worker # define YYLLOC_DEFAULT(Current, Rhs, N) \ 87*61046927SAndroid Build Coastguard Worker do { \ 88*61046927SAndroid Build Coastguard Worker if (N) \ 89*61046927SAndroid Build Coastguard Worker { \ 90*61046927SAndroid Build Coastguard Worker (Current).first_line = YYRHSLOC(Rhs, 1).first_line; \ 91*61046927SAndroid Build Coastguard Worker (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \ 92*61046927SAndroid Build Coastguard Worker (Current).last_line = YYRHSLOC(Rhs, N).last_line; \ 93*61046927SAndroid Build Coastguard Worker (Current).last_column = YYRHSLOC(Rhs, N).last_column; \ 94*61046927SAndroid Build Coastguard Worker (Current).source = YYRHSLOC(Rhs, N).source; \ 95*61046927SAndroid Build Coastguard Worker } \ 96*61046927SAndroid Build Coastguard Worker else \ 97*61046927SAndroid Build Coastguard Worker { \ 98*61046927SAndroid Build Coastguard Worker (Current).first_line = (Current).last_line = \ 99*61046927SAndroid Build Coastguard Worker YYRHSLOC(Rhs, 0).last_line; \ 100*61046927SAndroid Build Coastguard Worker (Current).first_column = (Current).last_column = \ 101*61046927SAndroid Build Coastguard Worker YYRHSLOC(Rhs, 0).last_column; \ 102*61046927SAndroid Build Coastguard Worker (Current).source = YYRHSLOC(Rhs, 0).source; \ 103*61046927SAndroid Build Coastguard Worker } \ 104*61046927SAndroid Build Coastguard Worker } while (0) 105*61046927SAndroid Build Coastguard Worker 106*61046927SAndroid Build Coastguard Worker struct token { 107*61046927SAndroid Build Coastguard Worker bool expanding; 108*61046927SAndroid Build Coastguard Worker int type; 109*61046927SAndroid Build Coastguard Worker YYSTYPE value; 110*61046927SAndroid Build Coastguard Worker YYLTYPE location; 111*61046927SAndroid Build Coastguard Worker }; 112*61046927SAndroid Build Coastguard Worker 113*61046927SAndroid Build Coastguard Worker typedef struct token_node { 114*61046927SAndroid Build Coastguard Worker token_t *token; 115*61046927SAndroid Build Coastguard Worker struct token_node *next; 116*61046927SAndroid Build Coastguard Worker } token_node_t; 117*61046927SAndroid Build Coastguard Worker 118*61046927SAndroid Build Coastguard Worker struct token_list { 119*61046927SAndroid Build Coastguard Worker token_node_t *head; 120*61046927SAndroid Build Coastguard Worker token_node_t *tail; 121*61046927SAndroid Build Coastguard Worker token_node_t *non_space_tail; 122*61046927SAndroid Build Coastguard Worker }; 123*61046927SAndroid Build Coastguard Worker 124*61046927SAndroid Build Coastguard Worker typedef struct argument_node { 125*61046927SAndroid Build Coastguard Worker token_list_t *argument; 126*61046927SAndroid Build Coastguard Worker struct argument_node *next; 127*61046927SAndroid Build Coastguard Worker } argument_node_t; 128*61046927SAndroid Build Coastguard Worker 129*61046927SAndroid Build Coastguard Worker typedef struct argument_list { 130*61046927SAndroid Build Coastguard Worker argument_node_t *head; 131*61046927SAndroid Build Coastguard Worker argument_node_t *tail; 132*61046927SAndroid Build Coastguard Worker } argument_list_t; 133*61046927SAndroid Build Coastguard Worker 134*61046927SAndroid Build Coastguard Worker typedef struct glcpp_parser glcpp_parser_t; 135*61046927SAndroid Build Coastguard Worker 136*61046927SAndroid Build Coastguard Worker typedef enum { 137*61046927SAndroid Build Coastguard Worker TOKEN_CLASS_IDENTIFIER, 138*61046927SAndroid Build Coastguard Worker TOKEN_CLASS_IDENTIFIER_FINALIZED, 139*61046927SAndroid Build Coastguard Worker TOKEN_CLASS_FUNC_MACRO, 140*61046927SAndroid Build Coastguard Worker TOKEN_CLASS_OBJ_MACRO 141*61046927SAndroid Build Coastguard Worker } token_class_t; 142*61046927SAndroid Build Coastguard Worker 143*61046927SAndroid Build Coastguard Worker token_class_t 144*61046927SAndroid Build Coastguard Worker glcpp_parser_classify_token (glcpp_parser_t *parser, 145*61046927SAndroid Build Coastguard Worker const char *identifier, 146*61046927SAndroid Build Coastguard Worker int *parameter_index); 147*61046927SAndroid Build Coastguard Worker 148*61046927SAndroid Build Coastguard Worker typedef struct { 149*61046927SAndroid Build Coastguard Worker int is_function; 150*61046927SAndroid Build Coastguard Worker string_list_t *parameters; 151*61046927SAndroid Build Coastguard Worker const char *identifier; 152*61046927SAndroid Build Coastguard Worker token_list_t *replacements; 153*61046927SAndroid Build Coastguard Worker } macro_t; 154*61046927SAndroid Build Coastguard Worker 155*61046927SAndroid Build Coastguard Worker typedef struct expansion_node { 156*61046927SAndroid Build Coastguard Worker macro_t *macro; 157*61046927SAndroid Build Coastguard Worker token_node_t *replacements; 158*61046927SAndroid Build Coastguard Worker struct expansion_node *next; 159*61046927SAndroid Build Coastguard Worker } expansion_node_t; 160*61046927SAndroid Build Coastguard Worker 161*61046927SAndroid Build Coastguard Worker typedef enum skip_type { 162*61046927SAndroid Build Coastguard Worker SKIP_NO_SKIP, 163*61046927SAndroid Build Coastguard Worker SKIP_TO_ELSE, 164*61046927SAndroid Build Coastguard Worker SKIP_TO_ENDIF 165*61046927SAndroid Build Coastguard Worker } skip_type_t; 166*61046927SAndroid Build Coastguard Worker 167*61046927SAndroid Build Coastguard Worker typedef struct skip_node { 168*61046927SAndroid Build Coastguard Worker skip_type_t type; 169*61046927SAndroid Build Coastguard Worker bool has_else; 170*61046927SAndroid Build Coastguard Worker YYLTYPE loc; /* location of the initial #if/#elif/... */ 171*61046927SAndroid Build Coastguard Worker struct skip_node *next; 172*61046927SAndroid Build Coastguard Worker } skip_node_t; 173*61046927SAndroid Build Coastguard Worker 174*61046927SAndroid Build Coastguard Worker typedef struct active_list { 175*61046927SAndroid Build Coastguard Worker const char *identifier; 176*61046927SAndroid Build Coastguard Worker token_node_t *marker; 177*61046927SAndroid Build Coastguard Worker struct active_list *next; 178*61046927SAndroid Build Coastguard Worker } active_list_t; 179*61046927SAndroid Build Coastguard Worker 180*61046927SAndroid Build Coastguard Worker struct _mesa_glsl_parse_state; 181*61046927SAndroid Build Coastguard Worker 182*61046927SAndroid Build Coastguard Worker typedef void (*glcpp_extension_iterator)( 183*61046927SAndroid Build Coastguard Worker struct _mesa_glsl_parse_state *state, 184*61046927SAndroid Build Coastguard Worker void (*add_builtin_define)(glcpp_parser_t *, const char *, int), 185*61046927SAndroid Build Coastguard Worker glcpp_parser_t *data, 186*61046927SAndroid Build Coastguard Worker unsigned version, 187*61046927SAndroid Build Coastguard Worker bool es); 188*61046927SAndroid Build Coastguard Worker 189*61046927SAndroid Build Coastguard Worker struct glcpp_parser { 190*61046927SAndroid Build Coastguard Worker linear_ctx *linalloc; 191*61046927SAndroid Build Coastguard Worker yyscan_t scanner; 192*61046927SAndroid Build Coastguard Worker struct hash_table *defines; 193*61046927SAndroid Build Coastguard Worker active_list_t *active; 194*61046927SAndroid Build Coastguard Worker int lexing_directive; 195*61046927SAndroid Build Coastguard Worker int lexing_version_directive; 196*61046927SAndroid Build Coastguard Worker int space_tokens; 197*61046927SAndroid Build Coastguard Worker int last_token_was_newline; 198*61046927SAndroid Build Coastguard Worker int last_token_was_space; 199*61046927SAndroid Build Coastguard Worker int first_non_space_token_this_line; 200*61046927SAndroid Build Coastguard Worker int newline_as_space; 201*61046927SAndroid Build Coastguard Worker int in_control_line; 202*61046927SAndroid Build Coastguard Worker bool in_define; 203*61046927SAndroid Build Coastguard Worker int paren_count; 204*61046927SAndroid Build Coastguard Worker int commented_newlines; 205*61046927SAndroid Build Coastguard Worker skip_node_t *skip_stack; 206*61046927SAndroid Build Coastguard Worker int skipping; 207*61046927SAndroid Build Coastguard Worker token_list_t *lex_from_list; 208*61046927SAndroid Build Coastguard Worker token_node_t *lex_from_node; 209*61046927SAndroid Build Coastguard Worker struct _mesa_string_buffer *output; 210*61046927SAndroid Build Coastguard Worker struct _mesa_string_buffer *info_log; 211*61046927SAndroid Build Coastguard Worker int error; 212*61046927SAndroid Build Coastguard Worker glcpp_extension_iterator extensions; 213*61046927SAndroid Build Coastguard Worker const struct gl_extensions *extension_list; 214*61046927SAndroid Build Coastguard Worker void *state; 215*61046927SAndroid Build Coastguard Worker gl_api api; 216*61046927SAndroid Build Coastguard Worker struct gl_context *gl_ctx; 217*61046927SAndroid Build Coastguard Worker unsigned version; 218*61046927SAndroid Build Coastguard Worker 219*61046927SAndroid Build Coastguard Worker /** 220*61046927SAndroid Build Coastguard Worker * Has the #version been set? 221*61046927SAndroid Build Coastguard Worker * 222*61046927SAndroid Build Coastguard Worker * A separate flag is used because any possible sentinel value in 223*61046927SAndroid Build Coastguard Worker * \c ::version could also be set by a #version line. 224*61046927SAndroid Build Coastguard Worker */ 225*61046927SAndroid Build Coastguard Worker bool version_set; 226*61046927SAndroid Build Coastguard Worker 227*61046927SAndroid Build Coastguard Worker bool has_new_line_number; 228*61046927SAndroid Build Coastguard Worker int new_line_number; 229*61046927SAndroid Build Coastguard Worker bool has_new_source_number; 230*61046927SAndroid Build Coastguard Worker int new_source_number; 231*61046927SAndroid Build Coastguard Worker bool is_gles; 232*61046927SAndroid Build Coastguard Worker }; 233*61046927SAndroid Build Coastguard Worker 234*61046927SAndroid Build Coastguard Worker glcpp_parser_t * 235*61046927SAndroid Build Coastguard Worker glcpp_parser_create(struct gl_context *gl_ctx, 236*61046927SAndroid Build Coastguard Worker glcpp_extension_iterator extensions, void *state); 237*61046927SAndroid Build Coastguard Worker 238*61046927SAndroid Build Coastguard Worker int 239*61046927SAndroid Build Coastguard Worker glcpp_parser_parse (glcpp_parser_t *parser); 240*61046927SAndroid Build Coastguard Worker 241*61046927SAndroid Build Coastguard Worker void 242*61046927SAndroid Build Coastguard Worker glcpp_parser_destroy (glcpp_parser_t *parser); 243*61046927SAndroid Build Coastguard Worker 244*61046927SAndroid Build Coastguard Worker void 245*61046927SAndroid Build Coastguard Worker glcpp_parser_resolve_implicit_version(glcpp_parser_t *parser); 246*61046927SAndroid Build Coastguard Worker 247*61046927SAndroid Build Coastguard Worker int 248*61046927SAndroid Build Coastguard Worker glcpp_preprocess(void *ralloc_ctx, const char **shader, char **info_log, 249*61046927SAndroid Build Coastguard Worker glcpp_extension_iterator extensions, void *state, 250*61046927SAndroid Build Coastguard Worker struct gl_context *g_ctx); 251*61046927SAndroid Build Coastguard Worker 252*61046927SAndroid Build Coastguard Worker /* Functions for writing to the info log */ 253*61046927SAndroid Build Coastguard Worker 254*61046927SAndroid Build Coastguard Worker void 255*61046927SAndroid Build Coastguard Worker glcpp_error (YYLTYPE *locp, glcpp_parser_t *parser, const char *fmt, ...); 256*61046927SAndroid Build Coastguard Worker 257*61046927SAndroid Build Coastguard Worker void 258*61046927SAndroid Build Coastguard Worker glcpp_warning (YYLTYPE *locp, glcpp_parser_t *parser, const char *fmt, ...); 259*61046927SAndroid Build Coastguard Worker 260*61046927SAndroid Build Coastguard Worker /* Generated by glcpp-lex.l to glcpp-lex.c */ 261*61046927SAndroid Build Coastguard Worker 262*61046927SAndroid Build Coastguard Worker int 263*61046927SAndroid Build Coastguard Worker glcpp_lex_init_extra (glcpp_parser_t *parser, yyscan_t* scanner); 264*61046927SAndroid Build Coastguard Worker 265*61046927SAndroid Build Coastguard Worker void 266*61046927SAndroid Build Coastguard Worker glcpp_lex_set_source_string(glcpp_parser_t *parser, const char *shader); 267*61046927SAndroid Build Coastguard Worker 268*61046927SAndroid Build Coastguard Worker int 269*61046927SAndroid Build Coastguard Worker glcpp_lex (YYSTYPE *lvalp, YYLTYPE *llocp, yyscan_t scanner); 270*61046927SAndroid Build Coastguard Worker 271*61046927SAndroid Build Coastguard Worker int 272*61046927SAndroid Build Coastguard Worker glcpp_lex_destroy (yyscan_t scanner); 273*61046927SAndroid Build Coastguard Worker 274*61046927SAndroid Build Coastguard Worker /* Generated by glcpp-parse.y to glcpp-parse.c */ 275*61046927SAndroid Build Coastguard Worker 276*61046927SAndroid Build Coastguard Worker int 277*61046927SAndroid Build Coastguard Worker yyparse (glcpp_parser_t *parser); 278*61046927SAndroid Build Coastguard Worker 279*61046927SAndroid Build Coastguard Worker #endif 280