| /* |
| * 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 <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 { |
| int type; |
| char *value; |
| } token_t; |
| |
| typedef struct token_node { |
| int type; |
| const char *value; |
| struct token_node *next; |
| } token_node_t; |
| |
| typedef struct token_list { |
| token_node_t *head; |
| token_node_t *tail; |
| } token_list_t; |
| |
| 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; |
| |
| struct glcpp_parser { |
| yyscan_t scanner; |
| struct hash_table *defines; |
| expansion_node_t *expansions; |
| int just_printed_separator; |
| int need_newline; |
| }; |
| |
| void |
| glcpp_parser_push_expansion_argument (glcpp_parser_t *parser, |
| int argument_index); |
| |
| glcpp_parser_t * |
| glcpp_parser_create (void); |
| |
| int |
| glcpp_parser_parse (glcpp_parser_t *parser); |
| |
| void |
| glcpp_parser_destroy (glcpp_parser_t *parser); |
| |
| /* Generated by glcpp-lex.l to glcpp-lex.c */ |
| |
| int |
| glcpp_lex_init_extra (glcpp_parser_t *parser, yyscan_t* scanner); |
| |
| int |
| glcpp_lex (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, ...); |
| |
| #endif |