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., <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