Lines Matching refs:pctx
49 #define TOKEN_STRING(pctx) (pctx->token.value.as_textregion.base)
59 do { if ((obj) != NULL) cfg_obj_destroy(pctx, &(obj)); } while (0)
67 free_tuple(cfg_parser_t *pctx, cfg_obj_t *obj);
70 parse_list(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
73 print_list(cfg_printer_t *pctx, const cfg_obj_t *obj);
76 free_list(cfg_parser_t *pctx, cfg_obj_t *obj);
79 create_listelt(cfg_parser_t *pctx, cfg_listelt_t **eltp);
82 create_string(cfg_parser_t *pctx, const char *contents, const cfg_type_t *type,
86 free_string(cfg_parser_t *pctx, cfg_obj_t *obj);
89 create_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **objp);
92 free_map(cfg_parser_t *pctx, cfg_obj_t *obj);
95 parse_symtab_elt(cfg_parser_t *pctx, const char *name,
100 free_noop(cfg_parser_t *pctx, cfg_obj_t *obj);
103 cfg_getstringtoken(cfg_parser_t *pctx);
106 parser_complain(cfg_parser_t *pctx, isc_boolean_t is_warning,
139 cfg_print_obj(cfg_printer_t *pctx, const cfg_obj_t *obj) {
140 obj->type->print(pctx, obj);
144 cfg_print_chars(cfg_printer_t *pctx, const char *text, int len) {
145 pctx->f(pctx->closure, text, len);
149 print_open(cfg_printer_t *pctx) {
150 cfg_print_chars(pctx, "{\n", 2);
151 pctx->indent++;
155 print_indent(cfg_printer_t *pctx) {
156 int indent = pctx->indent;
158 cfg_print_chars(pctx, "\t", 1);
164 print_close(cfg_printer_t *pctx) {
165 pctx->indent--;
166 print_indent(pctx);
167 cfg_print_chars(pctx, "}", 1);
171 cfg_parse_obj(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
174 result = type->parse(pctx, type, ret);
186 cfg_printer_t pctx;
187 pctx.f = f;
188 pctx.closure = closure;
189 pctx.indent = 0;
190 obj->type->print(&pctx, obj);
197 cfg_create_tuple(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
208 CHECK(cfg_create_obj(pctx, type, &obj));
209 obj->value.tuple = isc_mem_get(pctx->mctx,
222 isc_mem_put(pctx->mctx, obj, sizeof(*obj));
227 cfg_parse_tuple(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
235 CHECK(cfg_create_tuple(pctx, type, &obj));
237 CHECK(cfg_parse_obj(pctx, f->type, &obj->value.tuple[i]));
248 cfg_print_tuple(cfg_printer_t *pctx, const cfg_obj_t *obj) {
257 cfg_print_chars(pctx, " ", 1);
258 cfg_print_obj(pctx, fieldobj);
264 cfg_doc_tuple(cfg_printer_t *pctx, const cfg_type_t *type) {
271 cfg_print_chars(pctx, " ", 1);
272 cfg_doc_obj(pctx, f->type);
278 free_tuple(cfg_parser_t *pctx, cfg_obj_t *obj) {
291 isc_mem_put(pctx->mctx, obj->value.tuple,
319 cfg_parse_special(cfg_parser_t *pctx, int special) {
321 CHECK(cfg_gettoken(pctx, 0));
322 if (pctx->token.type == isc_tokentype_special &&
323 pctx->token.value.as_char == special)
326 cfg_parser_error(pctx, CFG_LOG_NEAR, "'%c' expected", special);
340 parse_semicolon(cfg_parser_t *pctx) {
342 CHECK(cfg_gettoken(pctx, 0));
343 if (pctx->token.type == isc_tokentype_special &&
344 pctx->token.value.as_char == ';')
347 cfg_parser_error(pctx, CFG_LOG_BEFORE, "missing ';'");
348 cfg_ungettoken(pctx);
357 parse_eof(cfg_parser_t *pctx) {
359 CHECK(cfg_gettoken(pctx, 0));
361 if (pctx->token.type == isc_tokentype_eof)
364 cfg_parser_error(pctx, CFG_LOG_NEAR, "syntax error");
370 /* A list of files, used internally for pctx->files. */
380 cfg_parser_t *pctx;
386 pctx = isc_mem_get(mctx, sizeof(*pctx));
387 if (pctx == NULL)
390 pctx->mctx = NULL;
391 isc_mem_attach(mctx, &pctx->mctx);
392 pctx->lctx = lctx;
393 pctx->lexer = NULL;
394 pctx->seen_eof = ISC_FALSE;
395 pctx->ungotten = ISC_FALSE;
396 pctx->errors = 0;
397 pctx->warnings = 0;
398 pctx->open_files = NULL;
399 pctx->closed_files = NULL;
400 pctx->line = 0;
401 pctx->callback = NULL;
402 pctx->callbackarg = NULL;
403 pctx->token.type = isc_tokentype_unknown;
413 CHECK(isc_lex_create(pctx->mctx, 1024, &pctx->lexer));
415 isc_lex_setspecials(pctx->lexer, specials);
416 isc_lex_setcomments(pctx->lexer, (ISC_LEXCOMMENT_C |
420 CHECK(cfg_create_list(pctx, &cfg_type_filelist, &pctx->open_files));
421 CHECK(cfg_create_list(pctx, &cfg_type_filelist, &pctx->closed_files));
423 *ret = pctx;
427 if (pctx->lexer != NULL)
428 isc_lex_destroy(&pctx->lexer);
429 CLEANUP_OBJ(pctx->open_files);
430 CLEANUP_OBJ(pctx->closed_files);
431 isc_mem_putanddetach(&pctx->mctx, pctx, sizeof(*pctx));
436 parser_openfile(cfg_parser_t *pctx, const char *filename) {
441 result = isc_lex_openfile(pctx->lexer, filename);
443 cfg_parser_error(pctx, 0, "open: %s: %s",
448 CHECK(create_string(pctx, filename, &cfg_type_qstring, &stringobj));
449 CHECK(create_listelt(pctx, &elt));
451 ISC_LIST_APPEND(pctx->open_files->value.list, elt, link);
460 cfg_parser_setcallback(cfg_parser_t *pctx,
464 pctx->callback = callback;
465 pctx->callbackarg = arg;
469 * Parse a configuration using a pctx where a lexer has already
473 parse2(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
477 result = cfg_parse_obj(pctx, type, &obj);
479 if (pctx->errors != 0) {
488 cfg_parser_error(pctx, 0, "parsing failed");
492 CHECK(parse_eof(pctx));
503 cfg_parse_file(cfg_parser_t *pctx, const char *filename,
510 CHECK(parser_openfile(pctx, filename));
511 CHECK(parse2(pctx, type, ret));
518 cfg_parse_buffer(cfg_parser_t *pctx, isc_buffer_t *buffer,
523 CHECK(isc_lex_openbuffer(pctx->lexer, buffer));
524 CHECK(parse2(pctx, type, ret));
531 cfg_parser_t *pctx = *pctxp;
532 isc_lex_destroy(&pctx->lexer);
538 CLEANUP_OBJ(pctx->open_files);
539 CLEANUP_OBJ(pctx->closed_files);
540 isc_mem_putanddetach(&pctx->mctx, pctx, sizeof(*pctx));
548 cfg_parse_void(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
550 return (cfg_create_obj(pctx, &cfg_type_void, ret));
554 cfg_print_void(cfg_printer_t *pctx, const cfg_obj_t *obj) {
555 UNUSED(pctx);
560 cfg_doc_void(cfg_printer_t *pctx, const cfg_type_t *type) {
561 UNUSED(pctx);
580 cfg_parse_uint32(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
585 CHECK(cfg_gettoken(pctx, ISC_LEXOPT_NUMBER | ISC_LEXOPT_CNUMBER));
586 if (pctx->token.type != isc_tokentype_number) {
587 cfg_parser_error(pctx, CFG_LOG_NEAR, "expected number");
591 CHECK(cfg_create_obj(pctx, &cfg_type_uint32, &obj));
593 obj->value.uint32 = pctx->token.value.as_ulong;
600 cfg_print_cstr(cfg_printer_t *pctx, const char *s) {
601 cfg_print_chars(pctx, s, strlen(s));
605 cfg_print_rawuint(cfg_printer_t *pctx, unsigned int u) {
608 cfg_print_cstr(pctx, buf);
612 cfg_print_uint32(cfg_printer_t *pctx, const cfg_obj_t *obj) {
613 cfg_print_rawuint(pctx, obj->value.uint32);
650 cfg_print_uint64(cfg_printer_t *pctx, const cfg_obj_t *obj) {
654 cfg_print_cstr(pctx, buf);
669 create_string(cfg_parser_t *pctx, const char *contents, const cfg_type_t *type,
676 CHECK(cfg_create_obj(pctx, type, &obj));
679 obj->value.string.base = isc_mem_get(pctx->mctx, len + 1);
681 isc_mem_put(pctx->mctx, obj, sizeof(*obj));
693 cfg_parse_qstring(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
697 CHECK(cfg_gettoken(pctx, CFG_LEXOPT_QSTRING));
698 if (pctx->token.type != isc_tokentype_qstring) {
699 cfg_parser_error(pctx, CFG_LOG_NEAR, "expected quoted string");
702 return (create_string(pctx,
703 TOKEN_STRING(pctx),
711 parse_ustring(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
715 CHECK(cfg_gettoken(pctx, 0));
716 if (pctx->token.type != isc_tokentype_string) {
717 cfg_parser_error(pctx, CFG_LOG_NEAR, "expected unquoted string");
720 return (create_string(pctx,
721 TOKEN_STRING(pctx),
729 cfg_parse_astring(cfg_parser_t *pctx, const cfg_type_t *type,
735 CHECK(cfg_getstringtoken(pctx));
736 return (create_string(pctx,
737 TOKEN_STRING(pctx),
755 check_enum(cfg_parser_t *pctx, cfg_obj_t *obj, const char *const *enums) {
759 cfg_parser_error(pctx, 0, "'%s' unexpected", s);
764 cfg_parse_enum(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
767 CHECK(parse_ustring(pctx, NULL, &obj));
768 CHECK(check_enum(pctx, obj, type->of));
777 cfg_doc_enum(cfg_printer_t *pctx, const cfg_type_t *type) {
779 cfg_print_chars(pctx, "( ", 2);
781 cfg_print_cstr(pctx, *p);
783 cfg_print_chars(pctx, " | ", 3);
785 cfg_print_chars(pctx, " )", 2);
789 cfg_print_ustring(cfg_printer_t *pctx, const cfg_obj_t *obj) {
790 cfg_print_chars(pctx, obj->value.string.base, obj->value.string.length);
794 print_qstring(cfg_printer_t *pctx, const cfg_obj_t *obj) {
795 cfg_print_chars(pctx, "\"", 1);
796 cfg_print_ustring(pctx, obj);
797 cfg_print_chars(pctx, "\"", 1);
801 free_string(cfg_parser_t *pctx, cfg_obj_t *obj) {
802 isc_mem_put(pctx->mctx, obj->value.string.base,
853 parse_boolean(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
860 result = cfg_gettoken(pctx, 0);
864 if (pctx->token.type != isc_tokentype_string)
867 if ((strcasecmp(TOKEN_STRING(pctx), "true") == 0) ||
868 (strcasecmp(TOKEN_STRING(pctx), "yes") == 0) ||
869 (strcmp(TOKEN_STRING(pctx), "1") == 0)) {
871 } else if ((strcasecmp(TOKEN_STRING(pctx), "false") == 0) ||
872 (strcasecmp(TOKEN_STRING(pctx), "no") == 0) ||
873 (strcmp(TOKEN_STRING(pctx), "0") == 0)) {
879 CHECK(cfg_create_obj(pctx, &cfg_type_boolean, &obj));
885 cfg_parser_error(pctx, CFG_LOG_NEAR, "boolean expected");
893 print_boolean(cfg_printer_t *pctx, const cfg_obj_t *obj) {
895 cfg_print_chars(pctx, "yes", 3);
897 cfg_print_chars(pctx, "no", 2);
910 cfg_create_list(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **obj) {
912 CHECK(cfg_create_obj(pctx, type, obj));
919 create_listelt(cfg_parser_t *pctx, cfg_listelt_t **eltp) {
921 elt = isc_mem_get(pctx->mctx, sizeof(*elt));
931 free_list_elt(cfg_parser_t *pctx, cfg_listelt_t *elt) {
932 cfg_obj_destroy(pctx, &elt->obj);
933 isc_mem_put(pctx->mctx, elt, sizeof(*elt));
937 free_list(cfg_parser_t *pctx, cfg_obj_t *obj) {
944 free_list_elt(pctx, elt);
949 cfg_parse_listelt(cfg_parser_t *pctx, const cfg_type_t *elttype,
956 CHECK(create_listelt(pctx, &elt));
958 result = cfg_parse_obj(pctx, elttype, &value);
968 isc_mem_put(pctx->mctx, elt, sizeof(*elt));
977 parse_list(cfg_parser_t *pctx, const cfg_type_t *listtype, cfg_obj_t **ret)
984 CHECK(cfg_create_list(pctx, listtype, &listobj));
987 CHECK(cfg_peektoken(pctx, 0));
988 if (pctx->token.type == isc_tokentype_special &&
989 pctx->token.value.as_char == /*{*/ '}')
991 CHECK(cfg_parse_listelt(pctx, listof, &elt));
992 CHECK(parse_semicolon(pctx));
1001 free_list_elt(pctx, elt);
1007 print_list(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1014 print_indent(pctx);
1015 cfg_print_obj(pctx, elt->obj);
1016 cfg_print_chars(pctx, ";\n", 2);
1021 cfg_parse_bracketed_list(cfg_parser_t *pctx, const cfg_type_t *type,
1025 CHECK(cfg_parse_special(pctx, '{'));
1026 CHECK(parse_list(pctx, type, ret));
1027 CHECK(cfg_parse_special(pctx, '}'));
1033 cfg_print_bracketed_list(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1034 print_open(pctx);
1035 print_list(pctx, obj);
1036 print_close(pctx);
1040 cfg_doc_bracketed_list(cfg_printer_t *pctx, const cfg_type_t *type) {
1041 cfg_print_chars(pctx, "{ ", 2);
1042 cfg_doc_obj(pctx, type->of);
1043 cfg_print_chars(pctx, "; ... }", 7);
1052 cfg_parse_spacelist(cfg_parser_t *pctx, const cfg_type_t *listtype,
1059 CHECK(cfg_create_list(pctx, listtype, &listobj));
1064 CHECK(cfg_peektoken(pctx, 0));
1065 if (pctx->token.type == isc_tokentype_special &&
1066 pctx->token.value.as_char == ';')
1068 CHECK(cfg_parse_listelt(pctx, listof, &elt));
1080 cfg_print_spacelist(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1087 cfg_print_obj(pctx, elt->obj);
1089 cfg_print_chars(pctx, " ", 1);
1157 cfg_parse_mapbody(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
1170 CHECK(create_map(pctx, type, &obj));
1181 CHECK(cfg_gettoken(pctx, 0));
1183 if (pctx->token.type != isc_tokentype_string) {
1184 cfg_ungettoken(pctx);
1192 if (strcasecmp(TOKEN_STRING(pctx), "include") == 0) {
1198 CHECK(cfg_parse_obj(pctx, &cfg_type_qstring, &includename));
1199 CHECK(parse_semicolon(pctx));
1200 CHECK(parser_openfile(pctx, includename->
1202 cfg_obj_destroy(pctx, &includename);
1211 if (strcasecmp(TOKEN_STRING(pctx),
1218 cfg_parser_error(pctx, CFG_LOG_NOPREP, "unknown option");
1223 CHECK(cfg_parse_obj(pctx, &cfg_type_unsupported, &eltobj));
1224 cfg_obj_destroy(pctx, &eltobj);
1225 CHECK(parse_semicolon(pctx));
1233 cfg_parser_warning(pctx, 0, "option '%s' is obsolete",
1236 cfg_parser_warning(pctx, 0, "option '%s' is "
1239 cfg_parser_warning(pctx, 0, "option '%s' is "
1255 CHECK(cfg_create_list(pctx,
1265 cfg_parser_error(pctx, CFG_LOG_NEAR,
1268 isc_mem_put(pctx->mctx, list,
1278 CHECK(cfg_parse_listelt(pctx, clause->type, &elt));
1279 CHECK(parse_semicolon(pctx));
1288 CHECK(parse_symtab_elt(pctx, clause->name,
1292 CHECK(parse_semicolon(pctx));
1294 cfg_parser_error(pctx, CFG_LOG_NEAR, "'%s' redefined",
1299 cfg_parser_error(pctx, CFG_LOG_NEAR,
1319 parse_symtab_elt(cfg_parser_t *pctx, const char *name,
1327 CHECK(cfg_parse_obj(pctx, elttype, &obj));
1329 if (callback && pctx->callback != NULL)
1330 CHECK(pctx->callback(name, obj, pctx->callbackarg));
1347 cfg_parse_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1349 CHECK(cfg_parse_special(pctx, '{'));
1350 CHECK(cfg_parse_mapbody(pctx, type, ret));
1351 CHECK(cfg_parse_special(pctx, '}'));
1360 parse_any_named_map(cfg_parser_t *pctx, cfg_type_t *nametype, const cfg_type_t *type,
1367 CHECK(cfg_parse_obj(pctx, nametype, &idobj));
1368 CHECK(cfg_parse_map(pctx, type, &mapobj));
1382 cfg_parse_named_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1383 return (parse_any_named_map(pctx, &cfg_type_astring, type, ret));
1391 cfg_parse_addressed_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1392 return (parse_any_named_map(pctx, &cfg_type_netaddr, type, ret));
1400 cfg_parse_netprefix_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1401 return (parse_any_named_map(pctx, &cfg_type_netprefix, type, ret));
1405 cfg_print_mapbody(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1431 print_indent(pctx);
1432 cfg_print_cstr(pctx, clause->name);
1433 cfg_print_chars(pctx, " ", 1);
1434 cfg_print_obj(pctx, elt->obj);
1435 cfg_print_chars(pctx, ";\n", 2);
1439 print_indent(pctx);
1440 cfg_print_cstr(pctx, clause->name);
1441 cfg_print_chars(pctx, " ", 1);
1442 cfg_print_obj(pctx, obj);
1443 cfg_print_chars(pctx, ";\n", 2);
1455 cfg_doc_mapbody(cfg_printer_t *pctx, const cfg_type_t *type) {
1463 cfg_print_cstr(pctx, clause->name);
1464 cfg_print_chars(pctx, " ", 1);
1465 cfg_doc_obj(pctx, clause->type);
1466 cfg_print_chars(pctx, ";", 1);
1468 cfg_print_chars(pctx, "\n\n", 2);
1486 cfg_print_map(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1488 cfg_print_obj(pctx, obj->value.map.id);
1489 cfg_print_chars(pctx, " ", 1);
1491 print_open(pctx);
1492 cfg_print_mapbody(pctx, obj);
1493 print_close(pctx);
1497 print_clause_flags(cfg_printer_t *pctx, unsigned int flags) {
1503 cfg_print_chars(pctx, " // ", 4);
1505 cfg_print_chars(pctx, ", ", 2);
1506 cfg_print_cstr(pctx, p->text);
1513 cfg_doc_map(cfg_printer_t *pctx, const cfg_type_t *type) {
1518 cfg_doc_obj(pctx, &cfg_type_astring);
1519 cfg_print_chars(pctx, " ", 1);
1521 cfg_doc_obj(pctx, &cfg_type_netaddr);
1522 cfg_print_chars(pctx, " ", 1);
1524 cfg_doc_obj(pctx, &cfg_type_netprefix);
1525 cfg_print_chars(pctx, " ", 1);
1528 print_open(pctx);
1534 print_indent(pctx);
1535 cfg_print_cstr(pctx, clause->name);
1537 cfg_print_chars(pctx, " ", 1);
1538 cfg_doc_obj(pctx, clause->type);
1539 cfg_print_chars(pctx, ";", 1);
1540 print_clause_flags(pctx, clause->flags);
1541 cfg_print_chars(pctx, "\n", 1);
1544 print_close(pctx);
1581 parse_token(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1588 CHECK(cfg_create_obj(pctx, &cfg_type_token, &obj));
1589 CHECK(cfg_gettoken(pctx, CFG_LEXOPT_QSTRING));
1590 if (pctx->token.type == isc_tokentype_eof) {
1591 cfg_ungettoken(pctx);
1596 isc_lex_getlasttokentext(pctx->lexer, &pctx->token, &r);
1598 obj->value.string.base = isc_mem_get(pctx->mctx, r.length + 1);
1611 isc_mem_put(pctx->mctx, obj, sizeof(*obj));
1626 parse_unsupported(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1631 CHECK(cfg_create_list(pctx, type, &listobj));
1636 CHECK(cfg_peektoken(pctx, 0));
1637 if (pctx->token.type == isc_tokentype_special) {
1638 if (pctx->token.value.as_char == '{')
1640 else if (pctx->token.value.as_char == '}')
1642 else if (pctx->token.value.as_char == ';')
1646 if (pctx->token.type == isc_tokentype_eof || braces < 0) {
1647 cfg_parser_error(pctx, CFG_LOG_NEAR, "unexpected token");
1652 CHECK(cfg_parse_listelt(pctx, &cfg_type_token, &elt));
1679 token_addr(cfg_parser_t *pctx, unsigned int flags, isc_netaddr_t *na) {
1684 if (pctx->token.type != isc_tokentype_string)
1687 s = TOKEN_STRING(pctx);
1756 cfg_parse_rawaddr(cfg_parser_t *pctx, unsigned int flags, isc_netaddr_t *na) {
1761 CHECK(cfg_gettoken(pctx, 0));
1762 result = token_addr(pctx, flags, na);
1769 cfg_parser_error(pctx, CFG_LOG_NEAR,
1773 cfg_parser_error(pctx, CFG_LOG_NEAR,
1777 cfg_parser_error(pctx, CFG_LOG_NEAR,
1786 cfg_lookingat_netaddr(cfg_parser_t *pctx, unsigned int flags) {
1789 result = token_addr(pctx, flags, &na_dummy);
1794 cfg_parse_rawport(cfg_parser_t *pctx, unsigned int flags, in_port_t *port) {
1797 CHECK(cfg_gettoken(pctx, ISC_LEXOPT_NUMBER));
1800 pctx->token.type == isc_tokentype_string &&
1801 strcmp(TOKEN_STRING(pctx), "*") == 0) {
1805 if (pctx->token.type != isc_tokentype_number) {
1806 cfg_parser_error(pctx, CFG_LOG_NEAR,
1810 if (pctx->token.value.as_ulong >= 65536U) {
1811 cfg_parser_error(pctx, CFG_LOG_NEAR,
1815 *port = (in_port_t)(pctx->token.value.as_ulong);
1822 cfg_print_rawaddr(cfg_printer_t *pctx, const isc_netaddr_t *na) {
1830 cfg_print_chars(pctx, isc_buffer_base(&buf), isc_buffer_usedlength(&buf));
1842 parse_netaddr(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1848 CHECK(cfg_create_obj(pctx, type, &obj));
1849 CHECK(cfg_parse_rawaddr(pctx, flags, &netaddr));
1859 cfg_doc_netaddr(cfg_printer_t *pctx, const cfg_type_t *type) {
1863 cfg_print_chars(pctx, "( ", 2);
1865 cfg_print_cstr(pctx, "<ipv4_address>");
1870 cfg_print_chars(pctx, " | ", 3);
1871 cfg_print_cstr(pctx, "<ipv6_address>");
1876 cfg_print_chars(pctx, " | ", 3);
1877 cfg_print_chars(pctx, "*", 1);
1882 cfg_print_chars(pctx, " )", 2);
1913 cfg_parse_netprefix(cfg_parser_t *pctx, const cfg_type_t *type,
1922 CHECK(cfg_parse_rawaddr(pctx, CFG_ADDR_V4OK | CFG_ADDR_V4PREFIXOK |
1935 CHECK(cfg_peektoken(pctx, 0));
1936 if (pctx->token.type == isc_tokentype_special &&
1937 pctx->token.value.as_char == '/') {
1938 CHECK(cfg_gettoken(pctx, 0)); /* read "/" */
1939 CHECK(cfg_gettoken(pctx, ISC_LEXOPT_NUMBER));
1940 if (pctx->token.type != isc_tokentype_number) {
1941 cfg_parser_error(pctx, CFG_LOG_NEAR,
1945 prefixlen = pctx->token.value.as_ulong;
1947 cfg_parser_error(pctx, CFG_LOG_NOPREP,
1954 CHECK(cfg_create_obj(pctx, &cfg_type_netprefix, &obj));
1960 cfg_parser_error(pctx, CFG_LOG_NEAR, "expected network prefix");
1965 print_netprefix(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1968 cfg_print_rawaddr(pctx, &p->address);
1969 cfg_print_chars(pctx, "/", 1);
1970 cfg_print_rawuint(pctx, p->prefixlen);
1997 parse_sockaddrsub(cfg_parser_t *pctx, const cfg_type_t *type,
2005 CHECK(cfg_create_obj(pctx, type, &obj));
2006 CHECK(cfg_parse_rawaddr(pctx, flags, &netaddr));
2007 CHECK(cfg_peektoken(pctx, 0));
2008 if (pctx->token.type == isc_tokentype_string &&
2009 strcasecmp(TOKEN_STRING(pctx), "port") == 0) {
2010 CHECK(cfg_gettoken(pctx, 0)); /* read "port" */
2011 CHECK(cfg_parse_rawport(pctx, flags, &port));
2029 cfg_parse_sockaddr(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
2031 return (parse_sockaddrsub(pctx, &cfg_type_sockaddr, *flagp, ret));
2035 cfg_print_sockaddr(cfg_printer_t *pctx, const cfg_obj_t *obj) {
2042 cfg_print_cstr(pctx, buf);
2045 cfg_print_chars(pctx, " port ", 6);
2046 cfg_print_rawuint(pctx, port);
2051 cfg_doc_sockaddr(cfg_printer_t *pctx, const cfg_type_t *type) {
2054 cfg_print_chars(pctx, "( ", 2);
2056 cfg_print_cstr(pctx, "<ipv4_address>");
2061 cfg_print_chars(pctx, " | ", 3);
2062 cfg_print_cstr(pctx, "<ipv6_address>");
2067 cfg_print_chars(pctx, " | ", 3);
2068 cfg_print_chars(pctx, "*", 1);
2072 cfg_print_chars(pctx, " ) ", 3);
2074 cfg_print_cstr(pctx, "[ port ( <integer> | * ) ]");
2076 cfg_print_cstr(pctx, "[ port <integer> ]");
2093 cfg_gettoken(cfg_parser_t *pctx, int options) {
2096 if (pctx->seen_eof)
2102 pctx->token.type = isc_tokentype_unknown;
2103 result = isc_lex_gettoken(pctx->lexer, options, &pctx->token);
2104 pctx->ungotten = ISC_FALSE;
2105 pctx->line = isc_lex_getsourceline(pctx->lexer);
2109 if (pctx->token.type == isc_tokentype_eof) {
2110 result = isc_lex_close(pctx->lexer);
2114 if (isc_lex_getsourcename(pctx->lexer) != NULL) {
2119 elt = ISC_LIST_TAIL(pctx->open_files->
2122 ISC_LIST_UNLINK(pctx->open_files->
2124 ISC_LIST_APPEND(pctx->closed_files->
2128 pctx->seen_eof = ISC_TRUE;
2134 cfg_parser_error(pctx, CFG_LOG_NEAR, "token too big");
2138 cfg_parser_error(pctx, 0, "%s",
2143 cfg_parser_error(pctx, CFG_LOG_NEAR, "%s",
2151 cfg_ungettoken(cfg_parser_t *pctx) {
2152 if (pctx->seen_eof)
2154 isc_lex_ungettoken(pctx->lexer, &pctx->token);
2155 pctx->ungotten = ISC_TRUE;
2159 cfg_peektoken(cfg_parser_t *pctx, int options) {
2161 CHECK(cfg_gettoken(pctx, options));
2162 cfg_ungettoken(pctx);
2172 cfg_getstringtoken(cfg_parser_t *pctx) {
2175 result = cfg_gettoken(pctx, CFG_LEXOPT_QSTRING);
2179 if (pctx->token.type != isc_tokentype_string &&
2180 pctx->token.type != isc_tokentype_qstring) {
2181 cfg_parser_error(pctx, CFG_LOG_NEAR, "expected string");
2188 cfg_parser_error(cfg_parser_t *pctx, unsigned int flags, const char *fmt, ...) {
2191 parser_complain(pctx, ISC_FALSE, flags, fmt, args);
2193 pctx->errors++;
2197 cfg_parser_warning(cfg_parser_t *pctx, unsigned int flags, const char *fmt, ...) {
2200 parser_complain(pctx, ISC_TRUE, flags, fmt, args);
2202 pctx->warnings++;
2208 have_current_file(cfg_parser_t *pctx) {
2210 if (pctx->open_files == NULL)
2213 elt = ISC_LIST_TAIL(pctx->open_files->value.list);
2221 current_file(cfg_parser_t *pctx) {
2226 if (!have_current_file(pctx))
2229 elt = ISC_LIST_TAIL(pctx->open_files->value.list);
2239 parser_complain(cfg_parser_t *pctx, isc_boolean_t is_warning,
2254 if (have_current_file(pctx))
2256 current_file(pctx), pctx->line);
2266 if (pctx->ungotten)
2267 (void)cfg_gettoken(pctx, 0);
2269 if (pctx->token.type == isc_tokentype_eof) {
2271 } else if (pctx->token.type == isc_tokentype_unknown) {
2275 isc_lex_getlasttokentext(pctx->lexer,
2276 &pctx->token, &r);
2295 isc_log_write(pctx->lctx, CAT, MOD, level,
2329 cfg_create_obj(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
2332 obj = isc_mem_get(pctx->mctx, sizeof(cfg_obj_t));
2336 obj->file = current_file(pctx);
2337 obj->line = pctx->line;
2347 cfg_parser_t *pctx = (cfg_parser_t *)userarg;
2352 cfg_obj_destroy(pctx, &obj);
2357 create_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
2362 CHECK(cfg_create_obj(pctx, type, &obj));
2363 CHECK(isc_symtab_create(pctx->mctx, 5, /* XXX */
2365 pctx, ISC_FALSE, &symtab));
2374 isc_mem_put(pctx->mctx, obj, sizeof(*obj));
2379 free_map(cfg_parser_t *pctx, cfg_obj_t *obj) {
2390 * Destroy 'obj', a configuration object created in 'pctx'.
2393 cfg_obj_destroy(cfg_parser_t *pctx, cfg_obj_t **objp) {
2397 REQUIRE(pctx != NULL);
2400 obj->type->rep->free(pctx, obj);
2401 isc_mem_put(pctx->mctx, obj, sizeof(cfg_obj_t));
2406 free_noop(cfg_parser_t *pctx, cfg_obj_t *obj) {
2407 UNUSED(pctx);
2412 cfg_doc_obj(cfg_printer_t *pctx, const cfg_type_t *type) {
2413 type->doc(pctx, type);
2417 cfg_doc_terminal(cfg_printer_t *pctx, const cfg_type_t *type) {
2418 cfg_print_chars(pctx, "<", 1);
2419 cfg_print_cstr(pctx, type->name);
2420 cfg_print_chars(pctx, ">", 1);
2428 cfg_printer_t pctx;
2429 pctx.f = f;
2430 pctx.closure = closure;
2431 pctx.indent = 0;
2432 cfg_doc_obj(&pctx, type);