| /* |
| * Copyright © 2010 Intel Corporation |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice (including the next |
| * paragraph) shall be included in all copies or substantial portions of the |
| * Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| * DEALINGS IN THE SOFTWARE. |
| */ |
| |
| #ifndef GLCPP_H |
| #define GLCPP_H |
| |
| #include <stdint.h> |
| |
| #include <talloc.h> |
| |
| #include "hash_table.h" |
| |
| #define yyscan_t void* |
| |
| /* Some data types used for parser values. */ |
| |
| typedef struct string_node { |
| const char *str; |
| struct string_node *next; |
| } string_node_t; |
| |
| typedef struct string_list { |
| string_node_t *head; |
| string_node_t *tail; |
| } string_list_t; |
| |
| typedef struct token token_t; |
| typedef struct token_list token_list_t; |
| |
| typedef union YYSTYPE |
| { |
| intmax_t ival; |
| char *str; |
| string_list_t *string_list; |
| token_t *token; |
| token_list_t *token_list; |
| } YYSTYPE; |
| |
| # define YYSTYPE_IS_TRIVIAL 1 |
| # define YYSTYPE_IS_DECLARED 1 |
| |
| typedef struct YYLTYPE { |
| int first_line; |
| int first_column; |
| int last_line; |
| int last_column; |
| unsigned source; |
| } YYLTYPE; |
| # define YYLTYPE_IS_DECLARED 1 |
| # define YYLTYPE_IS_TRIVIAL 1 |
| |
| struct token { |
| int type; |
| YYSTYPE value; |
| YYLTYPE location; |
| }; |
| |
| typedef struct token_node { |
| token_t *token; |
| struct token_node *next; |
| } token_node_t; |
| |
| struct token_list { |
| token_node_t *head; |
| token_node_t *tail; |
| token_node_t *non_space_tail; |
| }; |
| |
| typedef struct argument_node { |
| token_list_t *argument; |
| struct argument_node *next; |
| } argument_node_t; |
| |
| typedef struct argument_list { |
| argument_node_t *head; |
| argument_node_t *tail; |
| } argument_list_t; |
| |
| typedef struct glcpp_parser glcpp_parser_t; |
| |
| typedef enum { |
| TOKEN_CLASS_IDENTIFIER, |
| TOKEN_CLASS_IDENTIFIER_FINALIZED, |
| TOKEN_CLASS_FUNC_MACRO, |
| TOKEN_CLASS_OBJ_MACRO |
| } token_class_t; |
| |
| token_class_t |
| glcpp_parser_classify_token (glcpp_parser_t *parser, |
| const char *identifier, |
| int *parameter_index); |
| |
| typedef struct { |
| int is_function; |
| string_list_t *parameters; |
| const char *identifier; |
| token_list_t *replacements; |
| } macro_t; |
| |
| typedef struct expansion_node { |
| macro_t *macro; |
| token_node_t *replacements; |
| struct expansion_node *next; |
| } expansion_node_t; |
| |
| typedef enum skip_type { |
| SKIP_NO_SKIP, |
| SKIP_TO_ELSE, |
| SKIP_TO_ENDIF |
| } skip_type_t; |
| |
| typedef struct skip_node { |
| skip_type_t type; |
| YYLTYPE loc; /* location of the initial #if/#elif/... */ |
| struct skip_node *next; |
| } skip_node_t; |
| |
| typedef struct active_list { |
| const char *identifier; |
| token_node_t *marker; |
| struct active_list *next; |
| } active_list_t; |
| |
| struct glcpp_parser { |
| yyscan_t scanner; |
| struct hash_table *defines; |
| active_list_t *active; |
| int lexing_if; |
| int space_tokens; |
| int newline_as_space; |
| int in_control_line; |
| int paren_count; |
| skip_node_t *skip_stack; |
| token_list_t *lex_from_list; |
| token_node_t *lex_from_node; |
| char *output; |
| char *errors; |
| }; |
| |
| glcpp_parser_t * |
| glcpp_parser_create (void); |
| |
| int |
| glcpp_parser_parse (glcpp_parser_t *parser); |
| |
| void |
| glcpp_parser_destroy (glcpp_parser_t *parser); |
| |
| void |
| glcpp_error (YYLTYPE *locp, glcpp_parser_t *parser, const char *fmt, ...); |
| |
| /* Generated by glcpp-lex.l to glcpp-lex.c */ |
| |
| int |
| glcpp_lex_init_extra (glcpp_parser_t *parser, yyscan_t* scanner); |
| |
| void |
| glcpp_lex_set_source_string(glcpp_parser_t *parser, const char *shader); |
| |
| int |
| glcpp_lex (YYSTYPE *lvalp, YYLTYPE *llocp, yyscan_t scanner); |
| |
| int |
| glcpp_lex_destroy (yyscan_t scanner); |
| |
| /* Generated by glcpp-parse.y to glcpp-parse.c */ |
| |
| int |
| yyparse (glcpp_parser_t *parser); |
| |
| /* xtalloc - wrappers around talloc to check for out-of-memory */ |
| |
| #define xtalloc(ctx, type) (type *)xtalloc_named_const(ctx, sizeof(type), #type) |
| |
| #define xtalloc_size(ctx, size) xtalloc_named_const(ctx, size, __location__) |
| |
| void * |
| xtalloc_named_const (const void *context, size_t size, const char *name); |
| |
| char * |
| xtalloc_strdup (const void *t, const char *p); |
| |
| char * |
| xtalloc_strndup (const void *t, const char *p, size_t n); |
| |
| char * |
| xtalloc_asprintf (const void *t, const char *fmt, ...); |
| |
| void * |
| _xtalloc_reference_loc (const void *context, |
| const void *ptr, const char *location); |
| |
| #define xtalloc_reference(ctx, ptr) (_TALLOC_TYPEOF(ptr))_xtalloc_reference_loc((ctx),(ptr), __location__) |
| |
| #endif |