1a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth/* 2a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * Copyright © 2010 Intel Corporation 3a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * 4a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * Permission is hereby granted, free of charge, to any person obtaining a 5a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * copy of this software and associated documentation files (the "Software"), 6a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * to deal in the Software without restriction, including without limitation 7a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * and/or sell copies of the Software, and to permit persons to whom the 9a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * Software is furnished to do so, subject to the following conditions: 10a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * 11a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * The above copyright notice and this permission notice (including the next 12a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * paragraph) shall be included in all copies or substantial portions of the 13a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * Software. 14a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * 15a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth * DEALINGS IN THE SOFTWARE. 22a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth */ 23a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth 24a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth#ifndef GLCPP_H 25a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth#define GLCPP_H 26a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth 2735419095f8d92f7dc5de472da3a0271d343cbcbaCarl Worth#include <stdint.h> 28aac78ce8234d96932c38b3f48b1d828077bc0027Carl Worth#include <stdbool.h> 2935419095f8d92f7dc5de472da3a0271d343cbcbaCarl Worth 30d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke#include "../ralloc.h" 31a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth 3231747155ea3a24190277b125bd188ac8689af719Aras Pranckevicius#include "program/hash_table.h" 33a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth 34a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth#define yyscan_t void* 35a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth 36a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth/* Some data types used for parser values. */ 370b27b5f05191f07ed31e65ff07e5233672f3c33aCarl Worth 38610053b2c63fe6bc1d11347dc87e63d958b04dd8Carl Worthtypedef struct string_node { 3933cc400714f379ef13e876b4aedd0de8cb5d033dCarl Worth const char *str; 40610053b2c63fe6bc1d11347dc87e63d958b04dd8Carl Worth struct string_node *next; 41610053b2c63fe6bc1d11347dc87e63d958b04dd8Carl Worth} string_node_t; 4233cc400714f379ef13e876b4aedd0de8cb5d033dCarl Worth 43610053b2c63fe6bc1d11347dc87e63d958b04dd8Carl Worthtypedef struct string_list { 44610053b2c63fe6bc1d11347dc87e63d958b04dd8Carl Worth string_node_t *head; 45610053b2c63fe6bc1d11347dc87e63d958b04dd8Carl Worth string_node_t *tail; 46610053b2c63fe6bc1d11347dc87e63d958b04dd8Carl Worth} string_list_t; 4733cc400714f379ef13e876b4aedd0de8cb5d033dCarl Worth 48808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worthtypedef struct token token_t; 49808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worthtypedef struct token_list token_list_t; 50808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worth 51808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worthtypedef union YYSTYPE 52808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worth{ 53f6914fd37b2b66d7be1ba0c31450d89d1785ccceCarl Worth intmax_t ival; 54808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worth char *str; 55b1854fdfb6b567fa61d544d8080e2acb4cc78dc1Carl Worth string_list_t *string_list; 56808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worth token_t *token; 57808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worth token_list_t *token_list; 58808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worth} YYSTYPE; 59808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worth 60808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worth# define YYSTYPE_IS_TRIVIAL 1 61808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worth# define YYSTYPE_IS_DECLARED 1 62808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worth 63465e03ee07b778ed4edc24a810b9795409bcdbf9Kenneth Graunketypedef struct YYLTYPE { 64465e03ee07b778ed4edc24a810b9795409bcdbf9Kenneth Graunke int first_line; 65465e03ee07b778ed4edc24a810b9795409bcdbf9Kenneth Graunke int first_column; 66465e03ee07b778ed4edc24a810b9795409bcdbf9Kenneth Graunke int last_line; 67465e03ee07b778ed4edc24a810b9795409bcdbf9Kenneth Graunke int last_column; 68465e03ee07b778ed4edc24a810b9795409bcdbf9Kenneth Graunke unsigned source; 69465e03ee07b778ed4edc24a810b9795409bcdbf9Kenneth Graunke} YYLTYPE; 70465e03ee07b778ed4edc24a810b9795409bcdbf9Kenneth Graunke# define YYLTYPE_IS_DECLARED 1 71465e03ee07b778ed4edc24a810b9795409bcdbf9Kenneth Graunke# define YYLTYPE_IS_TRIVIAL 1 72465e03ee07b778ed4edc24a810b9795409bcdbf9Kenneth Graunke 73a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth# define YYLLOC_DEFAULT(Current, Rhs, N) \ 74a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worthdo { \ 75a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth if (N) \ 76a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth { \ 77a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth (Current).first_line = YYRHSLOC(Rhs, 1).first_line; \ 78a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \ 79a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth (Current).last_line = YYRHSLOC(Rhs, N).last_line; \ 80a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth (Current).last_column = YYRHSLOC(Rhs, N).last_column; \ 81a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth } \ 82a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth else \ 83a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth { \ 84a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth (Current).first_line = (Current).last_line = \ 85a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth YYRHSLOC(Rhs, 0).last_line; \ 86a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth (Current).first_column = (Current).last_column = \ 87a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth YYRHSLOC(Rhs, 0).last_column; \ 88a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth } \ 89a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth (Current).source = 0; \ 90a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth} while (0) 91a0cfe8c44085032fd982bbbff1f02252ffaa7114Carl Worth 92808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worthstruct token { 93b569383bbdfa22ed591255f56fb93832633a95aeCarl Worth int type; 94808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worth YYSTYPE value; 95b78c9ddfbfecb983f7ab519bb07889333bdab959Kenneth Graunke YYLTYPE location; 96808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worth}; 97b569383bbdfa22ed591255f56fb93832633a95aeCarl Worth 98472524413d004680dbdb89602617f32da8f42f56Carl Worthtypedef struct token_node { 99808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worth token_t *token; 100472524413d004680dbdb89602617f32da8f42f56Carl Worth struct token_node *next; 101472524413d004680dbdb89602617f32da8f42f56Carl Worth} token_node_t; 102472524413d004680dbdb89602617f32da8f42f56Carl Worth 103808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worthstruct token_list { 104472524413d004680dbdb89602617f32da8f42f56Carl Worth token_node_t *head; 105472524413d004680dbdb89602617f32da8f42f56Carl Worth token_node_t *tail; 10610ae438399f14367dd9e03032594c1e16c428999Carl Worth token_node_t *non_space_tail; 107808401fd79eea9fa2c965f9f235a753c0cb0d920Carl Worth}; 108472524413d004680dbdb89602617f32da8f42f56Carl Worth 1098f6a828e4a454e1bdce359c43e1108ff0315a89cCarl Worthtypedef struct argument_node { 110472524413d004680dbdb89602617f32da8f42f56Carl Worth token_list_t *argument; 1118f6a828e4a454e1bdce359c43e1108ff0315a89cCarl Worth struct argument_node *next; 1128f6a828e4a454e1bdce359c43e1108ff0315a89cCarl Worth} argument_node_t; 1138f6a828e4a454e1bdce359c43e1108ff0315a89cCarl Worth 1148f6a828e4a454e1bdce359c43e1108ff0315a89cCarl Worthtypedef struct argument_list { 1158f6a828e4a454e1bdce359c43e1108ff0315a89cCarl Worth argument_node_t *head; 1168f6a828e4a454e1bdce359c43e1108ff0315a89cCarl Worth argument_node_t *tail; 1178f6a828e4a454e1bdce359c43e1108ff0315a89cCarl Worth} argument_list_t; 1188f6a828e4a454e1bdce359c43e1108ff0315a89cCarl Worth 11933cc400714f379ef13e876b4aedd0de8cb5d033dCarl Worthtypedef struct glcpp_parser glcpp_parser_t; 12033cc400714f379ef13e876b4aedd0de8cb5d033dCarl Worth 121a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worthtypedef enum { 122a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth TOKEN_CLASS_IDENTIFIER, 123b569383bbdfa22ed591255f56fb93832633a95aeCarl Worth TOKEN_CLASS_IDENTIFIER_FINALIZED, 124a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth TOKEN_CLASS_FUNC_MACRO, 125a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth TOKEN_CLASS_OBJ_MACRO 126a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth} token_class_t; 127a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth 128a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worthtoken_class_t 129a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worthglcpp_parser_classify_token (glcpp_parser_t *parser, 130a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth const char *identifier, 131a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth int *parameter_index); 132a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth 133a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worthtypedef struct { 134a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth int is_function; 135a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth string_list_t *parameters; 136a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth const char *identifier; 137472524413d004680dbdb89602617f32da8f42f56Carl Worth token_list_t *replacements; 138a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth} macro_t; 139a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth 140a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worthtypedef struct expansion_node { 141a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth macro_t *macro; 142472524413d004680dbdb89602617f32da8f42f56Carl Worth token_node_t *replacements; 143a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth struct expansion_node *next; 144a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth} expansion_node_t; 145a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth 146b20d33c5c6fea8e392c26e9ab060efd14034f1f9Carl Worthtypedef enum skip_type { 147b20d33c5c6fea8e392c26e9ab060efd14034f1f9Carl Worth SKIP_NO_SKIP, 148b20d33c5c6fea8e392c26e9ab060efd14034f1f9Carl Worth SKIP_TO_ELSE, 149b20d33c5c6fea8e392c26e9ab060efd14034f1f9Carl Worth SKIP_TO_ENDIF 150b20d33c5c6fea8e392c26e9ab060efd14034f1f9Carl Worth} skip_type_t; 151b20d33c5c6fea8e392c26e9ab060efd14034f1f9Carl Worth 152b20d33c5c6fea8e392c26e9ab060efd14034f1f9Carl Worthtypedef struct skip_node { 153b20d33c5c6fea8e392c26e9ab060efd14034f1f9Carl Worth skip_type_t type; 1540774523d1882a087b648e4017e634eb12c12f377Kenneth Graunke YYLTYPE loc; /* location of the initial #if/#elif/... */ 155b20d33c5c6fea8e392c26e9ab060efd14034f1f9Carl Worth struct skip_node *next; 156b20d33c5c6fea8e392c26e9ab060efd14034f1f9Carl Worth} skip_node_t; 157b20d33c5c6fea8e392c26e9ab060efd14034f1f9Carl Worth 15822b3aced03c1a243ba03fbcba5aa51f97e4f0abbCarl Worthtypedef struct active_list { 15922b3aced03c1a243ba03fbcba5aa51f97e4f0abbCarl Worth const char *identifier; 16022b3aced03c1a243ba03fbcba5aa51f97e4f0abbCarl Worth token_node_t *marker; 16122b3aced03c1a243ba03fbcba5aa51f97e4f0abbCarl Worth struct active_list *next; 16222b3aced03c1a243ba03fbcba5aa51f97e4f0abbCarl Worth} active_list_t; 16322b3aced03c1a243ba03fbcba5aa51f97e4f0abbCarl Worth 164a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worthstruct glcpp_parser { 165a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth yyscan_t scanner; 166a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth struct hash_table *defines; 16722b3aced03c1a243ba03fbcba5aa51f97e4f0abbCarl Worth active_list_t *active; 168a771a40e2257657cbdae0eb97a7bb8733db76b91Carl Worth int lexing_if; 169f34a0009dd07dbca4de5491744bd3618eae9458eCarl Worth int space_tokens; 17095951ea7bb8728cf54ae4136cb59d0af9e8a06bdCarl Worth int newline_as_space; 17195951ea7bb8728cf54ae4136cb59d0af9e8a06bdCarl Worth int in_control_line; 17295951ea7bb8728cf54ae4136cb59d0af9e8a06bdCarl Worth int paren_count; 173b20d33c5c6fea8e392c26e9ab060efd14034f1f9Carl Worth skip_node_t *skip_stack; 1748e82fcb070d5fae0ec2c763cee4cea225b459664Carl Worth token_list_t *lex_from_list; 1758e82fcb070d5fae0ec2c763cee4cea225b459664Carl Worth token_node_t *lex_from_node; 1764c8a1af8117ac8e69883c6ef88d3f3b073dc6e0aKenneth Graunke char *output; 17733eaa3e0b3a8f94c2abb23ac3c9cbe571f170fb6Kenneth Graunke char *info_log; 178b823b99ec0f13af257dcd885f436a4d294c6222aKenneth Graunke size_t output_length; 179b823b99ec0f13af257dcd885f436a4d294c6222aKenneth Graunke size_t info_log_length; 18062b4b7785a01f11e7fcd9bf76dae6b3c0a16d537Kenneth Graunke int error; 181aac78ce8234d96932c38b3f48b1d828077bc0027Carl Worth bool has_new_line_number; 182aac78ce8234d96932c38b3f48b1d828077bc0027Carl Worth int new_line_number; 183aac78ce8234d96932c38b3f48b1d828077bc0027Carl Worth bool has_new_source_number; 184aac78ce8234d96932c38b3f48b1d828077bc0027Carl Worth int new_source_number; 185a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth}; 186a807fb72c45888b5ff915aa08d8bd10069be4a2eCarl Worth 18706143ea09411aa283ac3633bfbfa4326584cd952Ian Romanickstruct gl_extensions; 18806143ea09411aa283ac3633bfbfa4326584cd952Ian Romanick 18933cc400714f379ef13e876b4aedd0de8cb5d033dCarl Worthglcpp_parser_t * 1907dcfc44b72f00ba5a38cb02123c80113440f0de9Kenneth Graunkeglcpp_parser_create (const struct gl_extensions *extensions, int api); 1910b27b5f05191f07ed31e65ff07e5233672f3c33aCarl Worth 1920b27b5f05191f07ed31e65ff07e5233672f3c33aCarl Worthint 1930b27b5f05191f07ed31e65ff07e5233672f3c33aCarl Worthglcpp_parser_parse (glcpp_parser_t *parser); 1940b27b5f05191f07ed31e65ff07e5233672f3c33aCarl Worth 1950b27b5f05191f07ed31e65ff07e5233672f3c33aCarl Worthvoid 19633cc400714f379ef13e876b4aedd0de8cb5d033dCarl Worthglcpp_parser_destroy (glcpp_parser_t *parser); 1970b27b5f05191f07ed31e65ff07e5233672f3c33aCarl Worth 198186e2634bfb8f624f3721673964e29428269cd47Kenneth Graunkeint 1997cfd42cefe1949af51ecced9891f415eca2c0e66Dave Airlieglcpp_preprocess(void *ralloc_ctx, const char **shader, char **info_log, 2007dcfc44b72f00ba5a38cb02123c80113440f0de9Kenneth Graunke const struct gl_extensions *extensions, int api); 201186e2634bfb8f624f3721673964e29428269cd47Kenneth Graunke 202c9529c4d7727e0ff9da71f0941746e4d213dd689Kenneth Graunke/* Functions for writing to the info log */ 203c9529c4d7727e0ff9da71f0941746e4d213dd689Kenneth Graunke 204f1e6c069fac93dd2b7b2026ccd24833a066c895aKenneth Graunkevoid 205f1e6c069fac93dd2b7b2026ccd24833a066c895aKenneth Graunkeglcpp_error (YYLTYPE *locp, glcpp_parser_t *parser, const char *fmt, ...); 206f1e6c069fac93dd2b7b2026ccd24833a066c895aKenneth Graunke 207c9529c4d7727e0ff9da71f0941746e4d213dd689Kenneth Graunkevoid 208c9529c4d7727e0ff9da71f0941746e4d213dd689Kenneth Graunkeglcpp_warning (YYLTYPE *locp, glcpp_parser_t *parser, const char *fmt, ...); 209c9529c4d7727e0ff9da71f0941746e4d213dd689Kenneth Graunke 2100b27b5f05191f07ed31e65ff07e5233672f3c33aCarl Worth/* Generated by glcpp-lex.l to glcpp-lex.c */ 2110b27b5f05191f07ed31e65ff07e5233672f3c33aCarl Worth 212a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worthint 2138f38aff9b5dd42ef963532fe5fc618e8bafa218aCarl Worthglcpp_lex_init_extra (glcpp_parser_t *parser, yyscan_t* scanner); 214a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth 2151b1f43e6089bf1f78e8ff19b43a649b931fe4e31Kenneth Graunkevoid 2161b1f43e6089bf1f78e8ff19b43a649b931fe4e31Kenneth Graunkeglcpp_lex_set_source_string(glcpp_parser_t *parser, const char *shader); 2171b1f43e6089bf1f78e8ff19b43a649b931fe4e31Kenneth Graunke 218a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worthint 219465e03ee07b778ed4edc24a810b9795409bcdbf9Kenneth Graunkeglcpp_lex (YYSTYPE *lvalp, YYLTYPE *llocp, yyscan_t scanner); 220a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth 221a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worthint 2228f38aff9b5dd42ef963532fe5fc618e8bafa218aCarl Worthglcpp_lex_destroy (yyscan_t scanner); 223a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth 224a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth/* Generated by glcpp-parse.y to glcpp-parse.c */ 225a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth 226a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worthint 2270b27b5f05191f07ed31e65ff07e5233672f3c33aCarl Worthyyparse (glcpp_parser_t *parser); 228a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth 229a1e32bcff0a04dbff61f28c8e725cf2bf120bf85Carl Worth#endif 230