1135446Strhodes/*
2262706Serwin * Copyright (C) 2004-2011, 2014  Internet Systems Consortium, Inc. ("ISC")
3135446Strhodes * Copyright (C) 2002, 2003  Internet Software Consortium.
4135446Strhodes *
5193149Sdougb * Permission to use, copy, modify, and/or distribute this software for any
6135446Strhodes * purpose with or without fee is hereby granted, provided that the above
7135446Strhodes * copyright notice and this permission notice appear in all copies.
8135446Strhodes *
9135446Strhodes * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10135446Strhodes * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11135446Strhodes * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12135446Strhodes * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13135446Strhodes * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14135446Strhodes * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15135446Strhodes * PERFORMANCE OF THIS SOFTWARE.
16135446Strhodes */
17135446Strhodes
18234010Sdougb/* $Id: grammar.h,v 1.24 2011/01/04 23:47:14 tbox Exp $ */
19135446Strhodes
20135446Strhodes#ifndef ISCCFG_GRAMMAR_H
21135446Strhodes#define ISCCFG_GRAMMAR_H 1
22135446Strhodes
23193149Sdougb/*! \file isccfg/grammar.h */
24170222Sdougb
25135446Strhodes#include <isc/lex.h>
26135446Strhodes#include <isc/netaddr.h>
27135446Strhodes#include <isc/sockaddr.h>
28135446Strhodes#include <isc/region.h>
29135446Strhodes#include <isc/types.h>
30135446Strhodes
31135446Strhodes#include <isccfg/cfg.h>
32135446Strhodes
33135446Strhodes/*
34135446Strhodes * Definitions shared between the configuration parser
35135446Strhodes * and the grammars; not visible to users of the parser.
36135446Strhodes */
37135446Strhodes
38170222Sdougb/*% Clause may occur multiple times (e.g., "zone") */
39135446Strhodes#define CFG_CLAUSEFLAG_MULTI 		0x00000001
40170222Sdougb/*% Clause is obsolete */
41135446Strhodes#define CFG_CLAUSEFLAG_OBSOLETE 	0x00000002
42170222Sdougb/*% Clause is not implemented, and may never be */
43135446Strhodes#define CFG_CLAUSEFLAG_NOTIMP	 	0x00000004
44170222Sdougb/*% Clause is not implemented yet */
45135446Strhodes#define CFG_CLAUSEFLAG_NYI 		0x00000008
46170222Sdougb/*% Default value has changed since earlier release */
47135446Strhodes#define CFG_CLAUSEFLAG_NEWDEFAULT	0x00000010
48170222Sdougb/*%
49135446Strhodes * Clause needs to be interpreted during parsing
50135446Strhodes * by calling a callback function, like the
51135446Strhodes * "directory" option.
52135446Strhodes */
53135446Strhodes#define CFG_CLAUSEFLAG_CALLBACK		0x00000020
54193149Sdougb/*% A option that is only used in testing. */
55193149Sdougb#define CFG_CLAUSEFLAG_TESTONLY		0x00000040
56224092Sdougb/*% A configuration option that was not configured at compile time. */
57224092Sdougb#define CFG_CLAUSEFLAG_NOTCONFIGURED	0x00000080
58135446Strhodes
59135446Strhodestypedef struct cfg_clausedef cfg_clausedef_t;
60135446Strhodestypedef struct cfg_tuplefielddef cfg_tuplefielddef_t;
61135446Strhodestypedef struct cfg_printer cfg_printer_t;
62135446Strhodestypedef ISC_LIST(cfg_listelt_t) cfg_list_t;
63135446Strhodestypedef struct cfg_map cfg_map_t;
64135446Strhodestypedef struct cfg_rep cfg_rep_t;
65135446Strhodes
66135446Strhodes/*
67135446Strhodes * Function types for configuration object methods
68135446Strhodes */
69135446Strhodes
70135446Strhodestypedef isc_result_t (*cfg_parsefunc_t)(cfg_parser_t *, const cfg_type_t *type,
71135446Strhodes					cfg_obj_t **);
72165071Sdougbtypedef void	     (*cfg_printfunc_t)(cfg_printer_t *, const cfg_obj_t *);
73135446Strhodestypedef void	     (*cfg_docfunc_t)(cfg_printer_t *, const cfg_type_t *);
74135446Strhodestypedef void	     (*cfg_freefunc_t)(cfg_parser_t *, cfg_obj_t *);
75135446Strhodes
76135446Strhodes/*
77135446Strhodes * Structure definitions
78135446Strhodes */
79135446Strhodes
80170222Sdougb/*%
81135446Strhodes * A configuration printer object.  This is an abstract
82135446Strhodes * interface to a destination to which text can be printed
83135446Strhodes * by calling the function 'f'.
84135446Strhodes */
85135446Strhodesstruct cfg_printer {
86135446Strhodes	void (*f)(void *closure, const char *text, int textlen);
87135446Strhodes	void *closure;
88135446Strhodes	int indent;
89262706Serwin	int flags;
90135446Strhodes};
91135446Strhodes
92170222Sdougb/*% A clause definition. */
93135446Strhodesstruct cfg_clausedef {
94135446Strhodes	const char      *name;
95135446Strhodes	cfg_type_t      *type;
96135446Strhodes	unsigned int	flags;
97135446Strhodes};
98135446Strhodes
99170222Sdougb/*% A tuple field definition. */
100135446Strhodesstruct cfg_tuplefielddef {
101135446Strhodes	const char      *name;
102135446Strhodes	cfg_type_t      *type;
103135446Strhodes	unsigned int	flags;
104135446Strhodes};
105135446Strhodes
106170222Sdougb/*% A configuration object type definition. */
107135446Strhodesstruct cfg_type {
108170222Sdougb	const char *name;	/*%< For debugging purposes only */
109135446Strhodes	cfg_parsefunc_t	parse;
110135446Strhodes	cfg_printfunc_t print;
111170222Sdougb	cfg_docfunc_t	doc;	/*%< Print grammar description */
112170222Sdougb	cfg_rep_t *	rep;	/*%< Data representation */
113170222Sdougb	const void *	of;	/*%< Additional data for meta-types */
114135446Strhodes};
115135446Strhodes
116170222Sdougb/*% A keyword-type definition, for things like "port <integer>". */
117135446Strhodestypedef struct {
118135446Strhodes	const char *name;
119135446Strhodes	const cfg_type_t *type;
120135446Strhodes} keyword_type_t;
121135446Strhodes
122135446Strhodesstruct cfg_map {
123170222Sdougb	cfg_obj_t	 *id; /*%< Used for 'named maps' like keys, zones, &c */
124170222Sdougb	const cfg_clausedef_t * const *clausesets; /*%< The clauses that
125135446Strhodes						      can occur in this map;
126135446Strhodes						      used for printing */
127135446Strhodes	isc_symtab_t     *symtab;
128135446Strhodes};
129135446Strhodes
130135446Strhodestypedef struct cfg_netprefix cfg_netprefix_t;
131135446Strhodes
132135446Strhodesstruct cfg_netprefix {
133135446Strhodes	isc_netaddr_t address; /* IP4/IP6 */
134135446Strhodes	unsigned int prefixlen;
135135446Strhodes};
136135446Strhodes
137170222Sdougb/*%
138135446Strhodes * A configuration data representation.
139135446Strhodes */
140135446Strhodesstruct cfg_rep {
141170222Sdougb	const char *	name;	/*%< For debugging only */
142170222Sdougb	cfg_freefunc_t 	free;	/*%< How to free this kind of data. */
143135446Strhodes};
144135446Strhodes
145170222Sdougb/*%
146135446Strhodes * A configuration object.  This is the main building block
147135446Strhodes * of the configuration parse tree.
148135446Strhodes */
149135446Strhodes
150135446Strhodesstruct cfg_obj {
151135446Strhodes	const cfg_type_t *type;
152135446Strhodes	union {
153135446Strhodes		isc_uint32_t  	uint32;
154135446Strhodes		isc_uint64_t  	uint64;
155170222Sdougb		isc_textregion_t string; /*%< null terminated, too */
156135446Strhodes		isc_boolean_t 	boolean;
157135446Strhodes		cfg_map_t	map;
158135446Strhodes		cfg_list_t	list;
159135446Strhodes		cfg_obj_t **	tuple;
160135446Strhodes		isc_sockaddr_t	sockaddr;
161135446Strhodes		cfg_netprefix_t netprefix;
162135446Strhodes	}               value;
163224092Sdougb	isc_refcount_t  references;     /*%< reference counter */
164165071Sdougb	const char *	file;
165135446Strhodes	unsigned int    line;
166135446Strhodes};
167135446Strhodes
168135446Strhodes
169170222Sdougb/*% A list element. */
170135446Strhodesstruct cfg_listelt {
171135446Strhodes	cfg_obj_t               *obj;
172135446Strhodes	ISC_LINK(cfg_listelt_t)  link;
173135446Strhodes};
174135446Strhodes
175170222Sdougb/*% The parser object. */
176135446Strhodesstruct cfg_parser {
177135446Strhodes	isc_mem_t *	mctx;
178135446Strhodes	isc_log_t *	lctx;
179135446Strhodes	isc_lex_t *	lexer;
180135446Strhodes	unsigned int    errors;
181135446Strhodes	unsigned int    warnings;
182135446Strhodes	isc_token_t     token;
183135446Strhodes
184170222Sdougb	/*% We are at the end of all input. */
185135446Strhodes	isc_boolean_t	seen_eof;
186135446Strhodes
187170222Sdougb	/*% The current token has been pushed back. */
188135446Strhodes	isc_boolean_t	ungotten;
189135446Strhodes
190170222Sdougb	/*%
191135446Strhodes	 * The stack of currently active files, represented
192135446Strhodes	 * as a configuration list of configuration strings.
193193149Sdougb	 * The head is the top-level file, subsequent elements
194193149Sdougb	 * (if any) are the nested include files, and the
195135446Strhodes	 * last element is the file currently being parsed.
196135446Strhodes	 */
197135446Strhodes	cfg_obj_t *	open_files;
198135446Strhodes
199170222Sdougb	/*%
200135446Strhodes	 * Names of files that we have parsed and closed
201135446Strhodes	 * and were previously on the open_file list.
202135446Strhodes	 * We keep these objects around after closing
203135446Strhodes	 * the files because the file names may still be
204135446Strhodes	 * referenced from other configuration objects
205135446Strhodes	 * for use in reporting semantic errors after
206135446Strhodes	 * parsing is complete.
207135446Strhodes	 */
208135446Strhodes	cfg_obj_t *	closed_files;
209135446Strhodes
210170222Sdougb	/*%
211135446Strhodes	 * Current line number.  We maintain our own
212135446Strhodes	 * copy of this so that it is available even
213135446Strhodes	 * when a file has just been closed.
214135446Strhodes	 */
215135446Strhodes	unsigned int	line;
216135446Strhodes
217224092Sdougb	/*%
218224092Sdougb	 * Parser context flags, used for maintaining state
219224092Sdougb	 * from one token to the next.
220224092Sdougb	 */
221224092Sdougb	unsigned int flags;
222224092Sdougb
223224092Sdougb	/*%< Reference counter */
224224092Sdougb	isc_refcount_t  references;
225224092Sdougb
226135446Strhodes	cfg_parsecallback_t callback;
227135446Strhodes	void *callbackarg;
228135446Strhodes};
229135446Strhodes
230224092Sdougb/* Parser context flags */
231224092Sdougb#define CFG_PCTX_SKIP		0x1
232135446Strhodes
233170222Sdougb/*@{*/
234170222Sdougb/*%
235135446Strhodes * Flags defining whether to accept certain types of network addresses.
236135446Strhodes */
237135446Strhodes#define CFG_ADDR_V4OK 		0x00000001
238135446Strhodes#define CFG_ADDR_V4PREFIXOK 	0x00000002
239135446Strhodes#define CFG_ADDR_V6OK 		0x00000004
240135446Strhodes#define CFG_ADDR_WILDOK		0x00000008
241170222Sdougb#define CFG_ADDR_MASK		(CFG_ADDR_V6OK|CFG_ADDR_V4OK)
242170222Sdougb/*@}*/
243135446Strhodes
244170222Sdougb/*@{*/
245170222Sdougb/*%
246135446Strhodes * Predefined data representation types.
247135446Strhodes */
248143731SdougbLIBISCCFG_EXTERNAL_DATA extern cfg_rep_t cfg_rep_uint32;
249143731SdougbLIBISCCFG_EXTERNAL_DATA extern cfg_rep_t cfg_rep_uint64;
250143731SdougbLIBISCCFG_EXTERNAL_DATA extern cfg_rep_t cfg_rep_string;
251143731SdougbLIBISCCFG_EXTERNAL_DATA extern cfg_rep_t cfg_rep_boolean;
252143731SdougbLIBISCCFG_EXTERNAL_DATA extern cfg_rep_t cfg_rep_map;
253143731SdougbLIBISCCFG_EXTERNAL_DATA extern cfg_rep_t cfg_rep_list;
254143731SdougbLIBISCCFG_EXTERNAL_DATA extern cfg_rep_t cfg_rep_tuple;
255143731SdougbLIBISCCFG_EXTERNAL_DATA extern cfg_rep_t cfg_rep_sockaddr;
256143731SdougbLIBISCCFG_EXTERNAL_DATA extern cfg_rep_t cfg_rep_netprefix;
257143731SdougbLIBISCCFG_EXTERNAL_DATA extern cfg_rep_t cfg_rep_void;
258170222Sdougb/*@}*/
259135446Strhodes
260170222Sdougb/*@{*/
261170222Sdougb/*%
262135446Strhodes * Predefined configuration object types.
263135446Strhodes */
264135446StrhodesLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_boolean;
265135446StrhodesLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_uint32;
266135446StrhodesLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_uint64;
267135446StrhodesLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_qstring;
268135446StrhodesLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_astring;
269135446StrhodesLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_ustring;
270262706SerwinLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_sstring;
271135446StrhodesLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_sockaddr;
272135446StrhodesLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_netaddr;
273170222SdougbLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_netaddr4;
274170222SdougbLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_netaddr4wild;
275170222SdougbLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_netaddr6;
276170222SdougbLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_netaddr6wild;
277135446StrhodesLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_netprefix;
278135446StrhodesLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_void;
279135446StrhodesLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_token;
280135446StrhodesLIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_unsupported;
281170222Sdougb/*@}*/
282135446Strhodes
283135446Strhodesisc_result_t
284135446Strhodescfg_gettoken(cfg_parser_t *pctx, int options);
285135446Strhodes
286135446Strhodesisc_result_t
287135446Strhodescfg_peektoken(cfg_parser_t *pctx, int options);
288135446Strhodes
289135446Strhodesvoid
290135446Strhodescfg_ungettoken(cfg_parser_t *pctx);
291135446Strhodes
292135446Strhodes#define CFG_LEXOPT_QSTRING (ISC_LEXOPT_QSTRING | ISC_LEXOPT_QSTRINGMULTILINE)
293135446Strhodes
294135446Strhodesisc_result_t
295135446Strhodescfg_create_obj(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **objp);
296135446Strhodes
297135446Strhodesvoid
298135446Strhodescfg_print_rawuint(cfg_printer_t *pctx, unsigned int u);
299135446Strhodes
300135446Strhodesisc_result_t
301135446Strhodescfg_parse_uint32(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
302135446Strhodes
303135446Strhodesvoid
304165071Sdougbcfg_print_uint32(cfg_printer_t *pctx, const cfg_obj_t *obj);
305135446Strhodes
306135446Strhodesvoid
307165071Sdougbcfg_print_uint64(cfg_printer_t *pctx, const cfg_obj_t *obj);
308135446Strhodes
309135446Strhodesisc_result_t
310135446Strhodescfg_parse_qstring(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
311135446Strhodes
312135446Strhodesvoid
313165071Sdougbcfg_print_ustring(cfg_printer_t *pctx, const cfg_obj_t *obj);
314135446Strhodes
315135446Strhodesisc_result_t
316135446Strhodescfg_parse_astring(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
317135446Strhodes
318135446Strhodesisc_result_t
319262706Serwincfg_parse_sstring(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
320262706Serwin
321262706Serwinisc_result_t
322135446Strhodescfg_parse_rawaddr(cfg_parser_t *pctx, unsigned int flags, isc_netaddr_t *na);
323135446Strhodes
324135446Strhodesvoid
325165071Sdougbcfg_print_rawaddr(cfg_printer_t *pctx, const isc_netaddr_t *na);
326135446Strhodes
327135446Strhodesisc_boolean_t
328135446Strhodescfg_lookingat_netaddr(cfg_parser_t *pctx, unsigned int flags);
329135446Strhodes
330135446Strhodesisc_result_t
331135446Strhodescfg_parse_rawport(cfg_parser_t *pctx, unsigned int flags, in_port_t *port);
332135446Strhodes
333135446Strhodesisc_result_t
334135446Strhodescfg_parse_sockaddr(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
335135446Strhodes
336224092Sdougbisc_result_t
337224092Sdougbcfg_parse_boolean(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
338224092Sdougb
339135446Strhodesvoid
340165071Sdougbcfg_print_sockaddr(cfg_printer_t *pctx, const cfg_obj_t *obj);
341135446Strhodes
342135446Strhodesvoid
343224092Sdougbcfg_print_boolean(cfg_printer_t *pctx, const cfg_obj_t *obj);
344224092Sdougb
345224092Sdougbvoid
346135446Strhodescfg_doc_sockaddr(cfg_printer_t *pctx, const cfg_type_t *type);
347135446Strhodes
348135446Strhodesisc_result_t
349135446Strhodescfg_parse_netprefix(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
350135446Strhodes
351135446Strhodesisc_result_t
352135446Strhodescfg_parse_special(cfg_parser_t *pctx, int special);
353170222Sdougb/*%< Parse a required special character 'special'. */
354135446Strhodes
355135446Strhodesisc_result_t
356135446Strhodescfg_create_tuple(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **objp);
357135446Strhodes
358135446Strhodesisc_result_t
359135446Strhodescfg_parse_tuple(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
360135446Strhodes
361135446Strhodesvoid
362165071Sdougbcfg_print_tuple(cfg_printer_t *pctx, const cfg_obj_t *obj);
363135446Strhodes
364135446Strhodesvoid
365135446Strhodescfg_doc_tuple(cfg_printer_t *pctx, const cfg_type_t *type);
366135446Strhodes
367135446Strhodesisc_result_t
368135446Strhodescfg_create_list(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **objp);
369135446Strhodes
370135446Strhodesisc_result_t
371135446Strhodescfg_parse_listelt(cfg_parser_t *pctx, const cfg_type_t *elttype,
372135446Strhodes		  cfg_listelt_t **ret);
373135446Strhodes
374135446Strhodesisc_result_t
375135446Strhodescfg_parse_bracketed_list(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
376135446Strhodes
377135446Strhodesvoid
378165071Sdougbcfg_print_bracketed_list(cfg_printer_t *pctx, const cfg_obj_t *obj);
379135446Strhodes
380135446Strhodesvoid
381135446Strhodescfg_doc_bracketed_list(cfg_printer_t *pctx, const cfg_type_t *type);
382135446Strhodes
383135446Strhodesisc_result_t
384135446Strhodescfg_parse_spacelist(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
385135446Strhodes
386135446Strhodesvoid
387165071Sdougbcfg_print_spacelist(cfg_printer_t *pctx, const cfg_obj_t *obj);
388135446Strhodes
389135446Strhodesisc_result_t
390135446Strhodescfg_parse_enum(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
391135446Strhodes
392135446Strhodesvoid
393135446Strhodescfg_doc_enum(cfg_printer_t *pctx, const cfg_type_t *type);
394135446Strhodes
395135446Strhodesvoid
396135446Strhodescfg_print_chars(cfg_printer_t *pctx, const char *text, int len);
397170222Sdougb/*%< Print 'len' characters at 'text' */
398135446Strhodes
399135446Strhodesvoid
400135446Strhodescfg_print_cstr(cfg_printer_t *pctx, const char *s);
401170222Sdougb/*%< Print the null-terminated string 's' */
402135446Strhodes
403135446Strhodesisc_result_t
404135446Strhodescfg_parse_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
405135446Strhodes
406135446Strhodesisc_result_t
407135446Strhodescfg_parse_named_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
408135446Strhodes
409135446Strhodesisc_result_t
410135446Strhodescfg_parse_addressed_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
411135446Strhodes
412170222Sdougbisc_result_t
413170222Sdougbcfg_parse_netprefix_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **
414170222Sdougbret);
415170222Sdougb
416135446Strhodesvoid
417165071Sdougbcfg_print_map(cfg_printer_t *pctx, const cfg_obj_t *obj);
418135446Strhodes
419135446Strhodesvoid
420135446Strhodescfg_doc_map(cfg_printer_t *pctx, const cfg_type_t *type);
421135446Strhodes
422135446Strhodesisc_result_t
423135446Strhodescfg_parse_mapbody(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
424135446Strhodes
425135446Strhodesvoid
426165071Sdougbcfg_print_mapbody(cfg_printer_t *pctx, const cfg_obj_t *obj);
427135446Strhodes
428135446Strhodesvoid
429135446Strhodescfg_doc_mapbody(cfg_printer_t *pctx, const cfg_type_t *type);
430135446Strhodes
431135446Strhodesisc_result_t
432135446Strhodescfg_parse_void(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
433135446Strhodes
434135446Strhodesvoid
435165071Sdougbcfg_print_void(cfg_printer_t *pctx, const cfg_obj_t *obj);
436135446Strhodes
437135446Strhodesvoid
438135446Strhodescfg_doc_void(cfg_printer_t *pctx, const cfg_type_t *type);
439135446Strhodes
440135446Strhodesisc_result_t
441135446Strhodescfg_parse_obj(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
442135446Strhodes
443135446Strhodesvoid
444165071Sdougbcfg_print_obj(cfg_printer_t *pctx, const cfg_obj_t *obj);
445135446Strhodes
446135446Strhodesvoid
447135446Strhodescfg_doc_obj(cfg_printer_t *pctx, const cfg_type_t *type);
448170222Sdougb/*%<
449135446Strhodes * Print a description of the grammar of an arbitrary configuration
450135446Strhodes * type 'type'
451135446Strhodes */
452135446Strhodes
453135446Strhodesvoid
454135446Strhodescfg_doc_terminal(cfg_printer_t *pctx, const cfg_type_t *type);
455170222Sdougb/*%<
456135446Strhodes * Document the type 'type' as a terminal by printing its
457170222Sdougb * name in angle brackets, e.g., &lt;uint32>.
458135446Strhodes */
459135446Strhodes
460135446Strhodesvoid
461135446Strhodescfg_parser_error(cfg_parser_t *pctx, unsigned int flags,
462135446Strhodes		 const char *fmt, ...) ISC_FORMAT_PRINTF(3, 4);
463193149Sdougb/*!
464135446Strhodes * Pass one of these flags to cfg_parser_error() to include the
465135446Strhodes * token text in log message.
466135446Strhodes */
467170222Sdougb#define CFG_LOG_NEAR    0x00000001	/*%< Say "near <token>" */
468170222Sdougb#define CFG_LOG_BEFORE  0x00000002	/*%< Say "before <token>" */
469170222Sdougb#define CFG_LOG_NOPREP  0x00000004	/*%< Say just "<token>" */
470135446Strhodes
471135446Strhodesvoid
472135446Strhodescfg_parser_warning(cfg_parser_t *pctx, unsigned int flags,
473135446Strhodes		   const char *fmt, ...) ISC_FORMAT_PRINTF(3, 4);
474135446Strhodes
475135446Strhodesisc_boolean_t
476135446Strhodescfg_is_enum(const char *s, const char *const *enums);
477170222Sdougb/*%< Return true iff the string 's' is one of the strings in 'enums' */
478135446Strhodes
479135446Strhodes#endif /* ISCCFG_GRAMMAR_H */
480