/* * 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 #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 argument_node { string_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; /* Support for temporarily lexing/parsing tokens from a string. */ typedef struct glcpp_lex_node { void *buffer; struct glcpp_lex_node *next; } glcpp_lex_node_t; typedef struct { glcpp_parser_t *parser; glcpp_lex_node_t *head; } glcpp_lex_stack_t; void glcpp_lex_stack_push (glcpp_lex_stack_t *stack, const char *string); int glcpp_lex_stack_pop (glcpp_lex_stack_t *stack); typedef enum { TOKEN_CLASS_ARGUMENT, TOKEN_CLASS_IDENTIFIER, 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; const char *replacement; } macro_t; typedef struct expansion_node { macro_t *macro; argument_list_t *arguments; struct expansion_node *next; } expansion_node_t; struct glcpp_parser { yyscan_t scanner; struct hash_table *defines; expansion_node_t *expansions; glcpp_lex_stack_t *lex_stack; }; 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_parser_push_expansion_macro (glcpp_parser_t *parser, macro_t *macro, argument_list_t *arguments); void glcpp_parser_push_expansion_argument (glcpp_parser_t *parser, int argument_index); void glcpp_parser_pop_expansion (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); #endif