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