Lines Matching defs:pctx

40 #define TOKEN_STRING(pctx) (pctx->token.value.as_textregion.base)
50 do { if ((obj) != NULL) cfg_obj_destroy(pctx, &(obj)); } while (0)
58 free_tuple(cfg_parser_t *pctx, cfg_obj_t *obj);
61 parse_list(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
64 print_list(cfg_printer_t *pctx, const cfg_obj_t *obj);
67 free_list(cfg_parser_t *pctx, cfg_obj_t *obj);
70 create_listelt(cfg_parser_t *pctx, cfg_listelt_t **eltp);
73 create_string(cfg_parser_t *pctx, const char *contents, const cfg_type_t *type,
77 free_string(cfg_parser_t *pctx, cfg_obj_t *obj);
80 create_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **objp);
83 free_map(cfg_parser_t *pctx, cfg_obj_t *obj);
86 parse_symtab_elt(cfg_parser_t *pctx, const char *name,
91 free_noop(cfg_parser_t *pctx, cfg_obj_t *obj);
94 cfg_getstringtoken(cfg_parser_t *pctx);
97 parser_complain(cfg_parser_t *pctx, isc_boolean_t is_warning,
135 cfg_print_obj(cfg_printer_t *pctx, const cfg_obj_t *obj) {
136 REQUIRE(pctx != NULL);
139 obj->type->print(pctx, obj);
143 cfg_print_chars(cfg_printer_t *pctx, const char *text, int len) {
144 REQUIRE(pctx != NULL);
147 pctx->f(pctx->closure, text, len);
151 print_open(cfg_printer_t *pctx) {
152 if ((pctx->flags & CFG_PRINTER_ONELINE) != 0)
153 cfg_print_cstr(pctx, "{ ");
155 cfg_print_cstr(pctx, "{\n");
156 pctx->indent++;
161 cfg_print_indent(cfg_printer_t *pctx) {
162 int indent = pctx->indent;
163 if ((pctx->flags & CFG_PRINTER_ONELINE) != 0) {
164 cfg_print_cstr(pctx, " ");
168 cfg_print_cstr(pctx, "\t");
174 print_close(cfg_printer_t *pctx) {
175 if ((pctx->flags & CFG_PRINTER_ONELINE) == 0) {
176 pctx->indent--;
177 cfg_print_indent(pctx);
179 cfg_print_cstr(pctx, "}");
183 cfg_parse_obj(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
186 REQUIRE(pctx != NULL);
190 result = type->parse(pctx, type, ret);
213 cfg_printer_t pctx;
218 pctx.f = f;
219 pctx.closure = closure;
220 pctx.indent = 0;
221 pctx.flags = flags;
222 obj->type->print(&pctx, obj);
228 cfg_create_tuple(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
236 REQUIRE(pctx != NULL);
243 CHECK(cfg_create_obj(pctx, type, &obj));
244 obj->value.tuple = isc_mem_get(pctx->mctx,
257 isc_mem_put(pctx->mctx, obj, sizeof(*obj));
262 cfg_parse_tuple(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
270 REQUIRE(pctx != NULL);
274 CHECK(cfg_create_tuple(pctx, type, &obj));
276 CHECK(cfg_parse_obj(pctx, f->type, &obj->value.tuple[i]));
287 cfg_print_tuple(cfg_printer_t *pctx, const cfg_obj_t *obj) {
293 REQUIRE(pctx != NULL);
301 cfg_print_cstr(pctx, " ");
302 cfg_print_obj(pctx, fieldobj);
309 cfg_doc_tuple(cfg_printer_t *pctx, const cfg_type_t *type) {
314 REQUIRE(pctx != NULL);
321 cfg_print_cstr(pctx, " ");
322 cfg_doc_obj(pctx, f->type);
328 free_tuple(cfg_parser_t *pctx, cfg_obj_t *obj) {
341 isc_mem_put(pctx->mctx, obj->value.tuple,
370 cfg_parse_special(cfg_parser_t *pctx, int special) {
373 REQUIRE(pctx != NULL);
375 CHECK(cfg_gettoken(pctx, 0));
376 if (pctx->token.type == isc_tokentype_special &&
377 pctx->token.value.as_char == special)
380 cfg_parser_error(pctx, CFG_LOG_NEAR, "'%c' expected", special);
394 parse_semicolon(cfg_parser_t *pctx) {
397 CHECK(cfg_gettoken(pctx, 0));
398 if (pctx->token.type == isc_tokentype_special &&
399 pctx->token.value.as_char == ';')
402 cfg_parser_error(pctx, CFG_LOG_BEFORE, "missing ';'");
403 cfg_ungettoken(pctx);
412 parse_eof(cfg_parser_t *pctx) {
415 CHECK(cfg_gettoken(pctx, 0));
417 if (pctx->token.type == isc_tokentype_eof)
420 cfg_parser_error(pctx, CFG_LOG_NEAR, "syntax error");
426 /* A list of files, used internally for pctx->files. */
436 cfg_parser_t *pctx;
442 pctx = isc_mem_get(mctx, sizeof(*pctx));
443 if (pctx == NULL)
446 pctx->mctx = NULL;
447 isc_mem_attach(mctx, &pctx->mctx);
449 result = isc_refcount_init(&pctx->references, 1);
451 isc_mem_putanddetach(&pctx->mctx, pctx, sizeof(*pctx));
455 pctx->lctx = lctx;
456 pctx->lexer = NULL;
457 pctx->seen_eof = ISC_FALSE;
458 pctx->ungotten = ISC_FALSE;
459 pctx->errors = 0;
460 pctx->warnings = 0;
461 pctx->open_files = NULL;
462 pctx->closed_files = NULL;
463 pctx->line = 0;
464 pctx->callback = NULL;
465 pctx->callbackarg = NULL;
466 pctx->token.type = isc_tokentype_unknown;
467 pctx->flags = 0;
468 pctx->buf_name = NULL;
478 CHECK(isc_lex_create(pctx->mctx, 1024, &pctx->lexer));
480 isc_lex_setspecials(pctx->lexer, specials);
481 isc_lex_setcomments(pctx->lexer, (ISC_LEXCOMMENT_C |
485 CHECK(cfg_create_list(pctx, &cfg_type_filelist, &pctx->open_files));
486 CHECK(cfg_create_list(pctx, &cfg_type_filelist, &pctx->closed_files));
488 *ret = pctx;
492 if (pctx->lexer != NULL)
493 isc_lex_destroy(&pctx->lexer);
494 CLEANUP_OBJ(pctx->open_files);
495 CLEANUP_OBJ(pctx->closed_files);
496 isc_mem_putanddetach(&pctx->mctx, pctx, sizeof(*pctx));
501 parser_openfile(cfg_parser_t *pctx, const char *filename) {
506 result = isc_lex_openfile(pctx->lexer, filename);
508 cfg_parser_error(pctx, 0, "open: %s: %s",
513 CHECK(create_string(pctx, filename, &cfg_type_qstring, &stringobj));
514 CHECK(create_listelt(pctx, &elt));
516 ISC_LIST_APPEND(pctx->open_files->value.list, elt, link);
525 cfg_parser_setcallback(cfg_parser_t *pctx,
529 REQUIRE(pctx != NULL);
531 pctx->callback = callback;
532 pctx->callbackarg = arg;
536 cfg_parser_reset(cfg_parser_t *pctx) {
537 REQUIRE(pctx != NULL);
539 if (pctx->lexer != NULL)
540 isc_lex_close(pctx->lexer);
542 pctx->seen_eof = ISC_FALSE;
543 pctx->ungotten = ISC_FALSE;
544 pctx->errors = 0;
545 pctx->warnings = 0;
546 pctx->line = 0;
550 * Parse a configuration using a pctx where a lexer has already
554 parse2(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
558 result = cfg_parse_obj(pctx, type, &obj);
560 if (pctx->errors != 0) {
569 cfg_parser_error(pctx, 0, "parsing failed: %s",
574 CHECK(parse_eof(pctx));
585 cfg_parse_file(cfg_parser_t *pctx, const char *filename,
591 REQUIRE(pctx != NULL);
596 CHECK(parser_openfile(pctx, filename));
598 result = parse2(pctx, type, ret);
601 elt = ISC_LIST_TAIL(pctx->open_files->value.list);
603 ISC_LIST_UNLINK(pctx->open_files->value.list, elt, link);
604 ISC_LIST_APPEND(pctx->closed_files->value.list, elt, link);
612 cfg_parse_buffer(cfg_parser_t *pctx, isc_buffer_t *buffer,
615 return (cfg_parse_buffer3(pctx, buffer, NULL, 0, type, ret));
619 cfg_parse_buffer2(cfg_parser_t *pctx, isc_buffer_t *buffer,
623 return (cfg_parse_buffer3(pctx, buffer, file, 0, type, ret));
627 cfg_parse_buffer3(cfg_parser_t *pctx, isc_buffer_t *buffer,
633 REQUIRE(pctx != NULL);
638 CHECK(isc_lex_openbuffer(pctx->lexer, buffer));
640 pctx->buf_name = file;
643 CHECK(isc_lex_setsourceline(pctx->lexer, line));
645 CHECK(parse2(pctx, type, ret));
646 pctx->buf_name = NULL;
663 cfg_parser_t *pctx;
668 pctx = *pctxp;
671 isc_refcount_decrement(&pctx->references, &refs);
673 isc_lex_destroy(&pctx->lexer);
679 CLEANUP_OBJ(pctx->open_files);
680 CLEANUP_OBJ(pctx->closed_files);
681 isc_mem_putanddetach(&pctx->mctx, pctx, sizeof(*pctx));
689 cfg_parse_void(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
690 REQUIRE(pctx != NULL);
695 return (cfg_create_obj(pctx, &cfg_type_void, ret));
699 cfg_print_void(cfg_printer_t *pctx, const cfg_obj_t *obj) {
701 REQUIRE(pctx != NULL);
704 UNUSED(pctx);
709 cfg_doc_void(cfg_printer_t *pctx, const cfg_type_t *type) {
711 REQUIRE(pctx != NULL);
714 UNUSED(pctx);
732 cfg_parse_percentage(cfg_parser_t *pctx, const cfg_type_t *type,
740 REQUIRE(pctx != NULL);
745 CHECK(cfg_gettoken(pctx, 0));
746 if (pctx->token.type != isc_tokentype_string) {
747 cfg_parser_error(pctx, CFG_LOG_NEAR,
752 percent = isc_string_touint64(TOKEN_STRING(pctx), &endp, 10);
754 cfg_parser_error(pctx, CFG_LOG_NEAR,
759 CHECK(cfg_create_obj(pctx, &cfg_type_percentage, &obj));
768 cfg_print_percentage(cfg_printer_t *pctx, const cfg_obj_t *obj) {
772 REQUIRE(pctx != NULL);
777 cfg_print_chars(pctx, buf, strlen(buf));
801 cfg_parse_fixedpoint(cfg_parser_t *pctx, const cfg_type_t *type,
809 REQUIRE(pctx != NULL);
814 CHECK(cfg_gettoken(pctx, 0));
815 if (pctx->token.type != isc_tokentype_string) {
816 cfg_parser_error(pctx, CFG_LOG_NEAR,
822 p = TOKEN_STRING(pctx);
830 cfg_parser_error(pctx, CFG_LOG_NEAR,
835 CHECK(cfg_create_obj(pctx, &cfg_type_fixedpoint, &obj));
853 cfg_print_fixedpoint(cfg_printer_t *pctx, const cfg_obj_t *obj) {
857 REQUIRE(pctx != NULL);
863 cfg_print_chars(pctx, buf, strlen(buf));
887 cfg_parse_uint32(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
891 REQUIRE(pctx != NULL);
896 CHECK(cfg_gettoken(pctx, ISC_LEXOPT_NUMBER | ISC_LEXOPT_CNUMBER));
897 if (pctx->token.type != isc_tokentype_number) {
898 cfg_parser_error(pctx, CFG_LOG_NEAR, "expected number");
902 CHECK(cfg_create_obj(pctx, &cfg_type_uint32, &obj));
904 obj->value.uint32 = pctx->token.value.as_ulong;
911 cfg_print_cstr(cfg_printer_t *pctx, const char *s) {
912 cfg_print_chars(pctx, s, strlen(s));
916 cfg_print_rawuint(cfg_printer_t *pctx, unsigned int u) {
920 cfg_print_cstr(pctx, buf);
924 cfg_print_uint32(cfg_printer_t *pctx, const cfg_obj_t *obj) {
925 cfg_print_rawuint(pctx, obj->value.uint32);
962 cfg_print_uint64(cfg_printer_t *pctx, const cfg_obj_t *obj) {
967 cfg_print_cstr(pctx, buf);
982 create_string(cfg_parser_t *pctx, const char *contents, const cfg_type_t *type,
989 CHECK(cfg_create_obj(pctx, type, &obj));
992 obj->value.string.base = isc_mem_get(pctx->mctx, len + 1);
994 isc_mem_put(pctx->mctx, obj, sizeof(*obj));
1006 cfg_parse_qstring(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1009 REQUIRE(pctx != NULL);
1014 CHECK(cfg_gettoken(pctx, CFG_LEXOPT_QSTRING));
1015 if (pctx->token.type != isc_tokentype_qstring) {
1016 cfg_parser_error(pctx, CFG_LOG_NEAR, "expected quoted string");
1019 return (create_string(pctx, TOKEN_STRING(pctx),
1026 parse_ustring(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1031 CHECK(cfg_gettoken(pctx, 0));
1032 if (pctx->token.type != isc_tokentype_string) {
1033 cfg_parser_error(pctx, CFG_LOG_NEAR, "expected unquoted string");
1036 return (create_string(pctx,
1037 TOKEN_STRING(pctx),
1045 cfg_parse_astring(cfg_parser_t *pctx, const cfg_type_t *type,
1050 REQUIRE(pctx != NULL);
1055 CHECK(cfg_getstringtoken(pctx));
1056 return (create_string(pctx,
1057 TOKEN_STRING(pctx),
1065 cfg_parse_sstring(cfg_parser_t *pctx, const cfg_type_t *type,
1070 REQUIRE(pctx != NULL);
1075 CHECK(cfg_getstringtoken(pctx));
1076 return (create_string(pctx,
1077 TOKEN_STRING(pctx),
1085 parse_btext(cfg_parser_t *pctx, const cfg_type_t *type,
1092 CHECK(cfg_gettoken(pctx, ISC_LEXOPT_BTEXT));
1093 if (pctx->token.type != isc_tokentype_btext) {
1094 cfg_parser_error(pctx, CFG_LOG_NEAR,
1098 return (create_string(pctx,
1099 TOKEN_STRING(pctx),
1107 print_btext(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1115 pctx->indent++;
1116 cfg_print_cstr(pctx, "{");
1117 cfg_print_chars(pctx, obj->value.string.base, obj->value.string.length);
1118 print_close(pctx);
1122 doc_btext(cfg_printer_t *pctx, const cfg_type_t *type) {
1125 cfg_print_cstr(pctx, "{ <unspecified-text> }");
1144 check_enum(cfg_parser_t *pctx, cfg_obj_t *obj, const char *const *enums) {
1149 cfg_parser_error(pctx, 0, "'%s' unexpected", s);
1154 cfg_parse_enum(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1158 REQUIRE(pctx != NULL);
1162 CHECK(parse_ustring(pctx, NULL, &obj));
1163 CHECK(check_enum(pctx, obj, type->of));
1172 cfg_doc_enum(cfg_printer_t *pctx, const cfg_type_t *type) {
1175 REQUIRE(pctx != NULL);
1178 cfg_print_cstr(pctx, "( ");
1180 cfg_print_cstr(pctx, *p);
1182 cfg_print_cstr(pctx, " | ");
1184 cfg_print_cstr(pctx, " )");
1188 cfg_print_ustring(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1189 REQUIRE(pctx != NULL);
1192 cfg_print_chars(pctx, obj->value.string.base, obj->value.string.length);
1196 print_qstring(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1197 cfg_print_cstr(pctx, "\"");
1198 cfg_print_ustring(pctx, obj);
1199 cfg_print_cstr(pctx, "\"");
1203 print_sstring(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1204 cfg_print_cstr(pctx, "\"");
1205 if ((pctx->flags & CFG_PRINTER_XKEY) != 0) {
1208 cfg_print_cstr(pctx, "?");
1210 cfg_print_ustring(pctx, obj);
1211 cfg_print_cstr(pctx, "\"");
1215 free_string(cfg_parser_t *pctx, cfg_obj_t *obj) {
1216 isc_mem_put(pctx->mctx, obj->value.string.base,
1286 cfg_parse_boolean(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
1292 REQUIRE(pctx != NULL);
1297 result = cfg_gettoken(pctx, 0);
1301 if (pctx->token.type != isc_tokentype_string)
1304 if ((strcasecmp(TOKEN_STRING(pctx), "true") == 0) ||
1305 (strcasecmp(TOKEN_STRING(pctx), "yes") == 0) ||
1306 (strcmp(TOKEN_STRING(pctx), "1") == 0)) {
1308 } else if ((strcasecmp(TOKEN_STRING(pctx), "false") == 0) ||
1309 (strcasecmp(TOKEN_STRING(pctx), "no") == 0) ||
1310 (strcmp(TOKEN_STRING(pctx), "0") == 0)) {
1316 CHECK(cfg_create_obj(pctx, &cfg_type_boolean, &obj));
1322 cfg_parser_error(pctx, CFG_LOG_NEAR, "boolean expected");
1330 cfg_print_boolean(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1331 REQUIRE(pctx != NULL);
1335 cfg_print_cstr(pctx, "yes");
1337 cfg_print_cstr(pctx, "no");
1350 cfg_create_list(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **obj) {
1353 REQUIRE(pctx != NULL);
1357 CHECK(cfg_create_obj(pctx, type, obj));
1364 create_listelt(cfg_parser_t *pctx, cfg_listelt_t **eltp) {
1367 elt = isc_mem_get(pctx->mctx, sizeof(*elt));
1377 free_listelt(cfg_parser_t *pctx, cfg_listelt_t *elt) {
1379 cfg_obj_destroy(pctx, &elt->obj);
1380 isc_mem_put(pctx->mctx, elt, sizeof(*elt));
1384 free_list(cfg_parser_t *pctx, cfg_obj_t *obj) {
1391 free_listelt(pctx, elt);
1396 cfg_parse_listelt(cfg_parser_t *pctx, const cfg_type_t *elttype,
1403 REQUIRE(pctx != NULL);
1407 CHECK(create_listelt(pctx, &elt));
1409 result = cfg_parse_obj(pctx, elttype, &value);
1419 isc_mem_put(pctx->mctx, elt, sizeof(*elt));
1428 parse_list(cfg_parser_t *pctx, const cfg_type_t *listtype, cfg_obj_t **ret)
1435 CHECK(cfg_create_list(pctx, listtype, &listobj));
1438 CHECK(cfg_peektoken(pctx, 0));
1439 if (pctx->token.type == isc_tokentype_special &&
1440 pctx->token.value.as_char == /*{*/ '}')
1442 CHECK(cfg_parse_listelt(pctx, listof, &elt));
1443 CHECK(parse_semicolon(pctx));
1452 free_listelt(pctx, elt);
1458 print_list(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1466 if ((pctx->flags & CFG_PRINTER_ONELINE) != 0) {
1467 cfg_print_obj(pctx, elt->obj);
1468 cfg_print_cstr(pctx, "; ");
1470 cfg_print_indent(pctx);
1471 cfg_print_obj(pctx, elt->obj);
1472 cfg_print_cstr(pctx, ";\n");
1478 cfg_parse_bracketed_list(cfg_parser_t *pctx, const cfg_type_t *type,
1483 REQUIRE(pctx != NULL);
1487 CHECK(cfg_parse_special(pctx, '{'));
1488 CHECK(parse_list(pctx, type, ret));
1489 CHECK(cfg_parse_special(pctx, '}'));
1495 cfg_print_bracketed_list(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1496 REQUIRE(pctx != NULL);
1499 print_open(pctx);
1500 print_list(pctx, obj);
1501 print_close(pctx);
1505 cfg_doc_bracketed_list(cfg_printer_t *pctx, const cfg_type_t *type) {
1506 REQUIRE(pctx != NULL);
1509 cfg_print_cstr(pctx, "{ ");
1510 cfg_doc_obj(pctx, type->of);
1511 cfg_print_cstr(pctx, "; ... }");
1520 cfg_parse_spacelist(cfg_parser_t *pctx, const cfg_type_t *listtype,
1527 REQUIRE(pctx != NULL);
1531 CHECK(cfg_create_list(pctx, listtype, &listobj));
1536 CHECK(cfg_peektoken(pctx, 0));
1537 if (pctx->token.type == isc_tokentype_special &&
1538 pctx->token.value.as_char == ';')
1540 CHECK(cfg_parse_listelt(pctx, listof, &elt));
1552 cfg_print_spacelist(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1556 REQUIRE(pctx != NULL);
1562 cfg_print_obj(pctx, elt->obj);
1564 cfg_print_cstr(pctx, " ");
1632 cfg_parse_mapbody(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
1645 REQUIRE(pctx != NULL);
1649 CHECK(create_map(pctx, type, &obj));
1660 CHECK(cfg_gettoken(pctx, 0));
1662 if (pctx->token.type != isc_tokentype_string) {
1663 cfg_ungettoken(pctx);
1671 if (strcasecmp(TOKEN_STRING(pctx), "include") == 0) {
1677 CHECK(cfg_parse_obj(pctx, &cfg_type_qstring, &includename));
1678 CHECK(parse_semicolon(pctx));
1679 CHECK(parser_openfile(pctx, includename->
1681 cfg_obj_destroy(pctx, &includename);
1690 if (strcasecmp(TOKEN_STRING(pctx),
1697 cfg_parser_error(pctx, CFG_LOG_NOPREP, "unknown option");
1702 CHECK(cfg_parse_obj(pctx, &cfg_type_unsupported, &eltobj));
1703 cfg_obj_destroy(pctx, &eltobj);
1704 CHECK(parse_semicolon(pctx));
1712 cfg_parser_warning(pctx, 0, "option '%s' is obsolete",
1715 cfg_parser_warning(pctx, 0, "option '%s' is "
1718 cfg_parser_warning(pctx, 0, "option '%s' is "
1722 cfg_parser_warning(pctx, 0, "option '%s' was not "
1728 cfg_parser_warning(pctx, 0, "option '%s' was not "
1749 CHECK(cfg_create_list(pctx,
1759 cfg_parser_error(pctx, CFG_LOG_NEAR,
1762 isc_mem_put(pctx->mctx, list,
1772 CHECK(cfg_parse_listelt(pctx, clause->type, &elt));
1773 CHECK(parse_semicolon(pctx));
1782 CHECK(parse_symtab_elt(pctx, clause->name,
1786 CHECK(parse_semicolon(pctx));
1788 cfg_parser_error(pctx, CFG_LOG_NEAR, "'%s' redefined",
1793 cfg_parser_error(pctx, CFG_LOG_NEAR,
1813 parse_symtab_elt(cfg_parser_t *pctx, const char *name,
1821 CHECK(cfg_parse_obj(pctx, elttype, &obj));
1823 if (callback && pctx->callback != NULL)
1824 CHECK(pctx->callback(name, obj, pctx->callbackarg));
1841 cfg_parse_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1844 REQUIRE(pctx != NULL);
1848 CHECK(cfg_parse_special(pctx, '{'));
1849 CHECK(cfg_parse_mapbody(pctx, type, ret));
1850 CHECK(cfg_parse_special(pctx, '}'));
1859 parse_any_named_map(cfg_parser_t *pctx, cfg_type_t *nametype,
1866 REQUIRE(pctx != NULL);
1871 CHECK(cfg_parse_obj(pctx, nametype, &idobj));
1872 CHECK(cfg_parse_map(pctx, type, &mapobj));
1887 cfg_parse_named_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1888 return (parse_any_named_map(pctx, &cfg_type_astring, type, ret));
1896 cfg_parse_addressed_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1897 return (parse_any_named_map(pctx, &cfg_type_netaddr, type, ret));
1905 cfg_parse_netprefix_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
1906 return (parse_any_named_map(pctx, &cfg_type_netprefix, type, ret));
1910 print_symval(cfg_printer_t *pctx, const char *name, cfg_obj_t *obj) {
1911 if ((pctx->flags & CFG_PRINTER_ONELINE) == 0)
1912 cfg_print_indent(pctx);
1914 cfg_print_cstr(pctx, name);
1915 cfg_print_cstr(pctx, " ");
1916 cfg_print_obj(pctx, obj);
1918 if ((pctx->flags & CFG_PRINTER_ONELINE) == 0)
1919 cfg_print_cstr(pctx, ";\n");
1921 cfg_print_cstr(pctx, "; ");
1925 cfg_print_mapbody(cfg_printer_t *pctx, const cfg_obj_t *obj) {
1929 REQUIRE(pctx != NULL);
1953 print_symval(pctx,
1959 print_symval(pctx, clause->name,
1988 cfg_print_clauseflags(cfg_printer_t *pctx, unsigned int flags) {
1994 cfg_print_cstr(pctx, " // ");
1996 cfg_print_cstr(pctx, ", ");
1997 cfg_print_cstr(pctx, p->text);
2004 cfg_doc_mapbody(cfg_printer_t *pctx, const cfg_type_t *type) {
2008 REQUIRE(pctx != NULL);
2013 cfg_print_cstr(pctx, clause->name);
2014 cfg_print_cstr(pctx, " ");
2015 cfg_doc_obj(pctx, clause->type);
2016 cfg_print_cstr(pctx, ";");
2017 cfg_print_clauseflags(pctx, clause->flags);
2018 cfg_print_cstr(pctx, "\n\n");
2024 cfg_print_map(cfg_printer_t *pctx, const cfg_obj_t *obj) {
2025 REQUIRE(pctx != NULL);
2029 cfg_print_obj(pctx, obj->value.map.id);
2030 cfg_print_cstr(pctx, " ");
2032 print_open(pctx);
2033 cfg_print_mapbody(pctx, obj);
2034 print_close(pctx);
2038 cfg_doc_map(cfg_printer_t *pctx, const cfg_type_t *type) {
2042 REQUIRE(pctx != NULL);
2046 cfg_doc_obj(pctx, &cfg_type_astring);
2047 cfg_print_cstr(pctx, " ");
2049 cfg_doc_obj(pctx, &cfg_type_netaddr);
2050 cfg_print_cstr(pctx, " ");
2052 cfg_doc_obj(pctx, &cfg_type_netprefix);
2053 cfg_print_cstr(pctx, " ");
2056 print_open(pctx);
2060 cfg_print_indent(pctx);
2061 cfg_print_cstr(pctx, clause->name);
2063 cfg_print_cstr(pctx, " ");
2064 cfg_doc_obj(pctx, clause->type);
2065 cfg_print_cstr(pctx, ";");
2066 cfg_print_clauseflags(pctx, clause->flags);
2067 cfg_print_cstr(pctx, "\n");
2070 print_close(pctx);
2165 parse_token(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
2172 CHECK(cfg_create_obj(pctx, &cfg_type_token, &obj));
2173 CHECK(cfg_gettoken(pctx, CFG_LEXOPT_QSTRING));
2174 if (pctx->token.type == isc_tokentype_eof) {
2175 cfg_ungettoken(pctx);
2180 isc_lex_getlasttokentext(pctx->lexer, &pctx->token, &r);
2182 obj->value.string.base = isc_mem_get(pctx->mctx, r.length + 1);
2195 isc_mem_put(pctx->mctx, obj, sizeof(*obj));
2210 parse_unsupported(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
2215 CHECK(cfg_create_list(pctx, type, &listobj));
2220 CHECK(cfg_peektoken(pctx, 0));
2221 if (pctx->token.type == isc_tokentype_special) {
2222 if (pctx->token.value.as_char == '{')
2224 else if (pctx->token.value.as_char == '}')
2226 else if (pctx->token.value.as_char == ';')
2230 if (pctx->token.type == isc_tokentype_eof || braces < 0) {
2231 cfg_parser_error(pctx, CFG_LOG_NEAR, "unexpected token");
2236 CHECK(cfg_parse_listelt(pctx, &cfg_type_token, &elt));
2263 token_addr(cfg_parser_t *pctx, unsigned int flags, isc_netaddr_t *na) {
2268 if (pctx->token.type != isc_tokentype_string)
2271 s = TOKEN_STRING(pctx);
2338 cfg_parse_rawaddr(cfg_parser_t *pctx, unsigned int flags, isc_netaddr_t *na) {
2343 REQUIRE(pctx != NULL);
2346 CHECK(cfg_gettoken(pctx, 0));
2347 result = token_addr(pctx, flags, na);
2354 cfg_parser_error(pctx, CFG_LOG_NEAR,
2358 cfg_parser_error(pctx, CFG_LOG_NEAR,
2362 cfg_parser_error(pctx, CFG_LOG_NEAR,
2371 cfg_lookingat_netaddr(cfg_parser_t *pctx, unsigned int flags) {
2375 REQUIRE(pctx != NULL);
2377 result = token_addr(pctx, flags, &na_dummy);
2382 cfg_parse_rawport(cfg_parser_t *pctx, unsigned int flags, in_port_t *port) {
2385 REQUIRE(pctx != NULL);
2388 CHECK(cfg_gettoken(pctx, ISC_LEXOPT_NUMBER));
2391 pctx->token.type == isc_tokentype_string &&
2392 strcmp(TOKEN_STRING(pctx), "*") == 0) {
2396 if (pctx->token.type != isc_tokentype_number) {
2397 cfg_parser_error(pctx, CFG_LOG_NEAR,
2401 if (pctx->token.value.as_ulong >= 65536U) {
2402 cfg_parser_error(pctx, CFG_LOG_NEAR,
2406 *port = (in_port_t)(pctx->token.value.as_ulong);
2413 cfg_print_rawaddr(cfg_printer_t *pctx, const isc_netaddr_t *na) {
2418 REQUIRE(pctx != NULL);
2424 cfg_print_chars(pctx, isc_buffer_base(&buf),
2429 cfg_parse_dscp(cfg_parser_t *pctx, isc_dscp_t *dscp) {
2432 REQUIRE(pctx != NULL);
2435 CHECK(cfg_gettoken(pctx, ISC_LEXOPT_NUMBER | ISC_LEXOPT_CNUMBER));
2437 if (pctx->token.type != isc_tokentype_number) {
2438 cfg_parser_error(pctx, CFG_LOG_NEAR,
2442 if (pctx->token.value.as_ulong > 63U) {
2443 cfg_parser_error(pctx, CFG_LOG_NEAR,
2447 *dscp = (isc_dscp_t)(pctx->token.value.as_ulong);
2462 parse_netaddr(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
2468 CHECK(cfg_create_obj(pctx, type, &obj));
2469 CHECK(cfg_parse_rawaddr(pctx, flags, &netaddr));
2479 cfg_doc_netaddr(cfg_printer_t *pctx, const cfg_type_t *type) {
2483 cfg_print_cstr(pctx, "( ");
2485 cfg_print_cstr(pctx, "<ipv4_address>");
2490 cfg_print_cstr(pctx, " | ");
2491 cfg_print_cstr(pctx, "<ipv6_address>");
2496 cfg_print_cstr(pctx, " | ");
2497 cfg_print_cstr(pctx, "*");
2502 cfg_print_cstr(pctx, " )");
2533 cfg_parse_netprefix(cfg_parser_t *pctx, const cfg_type_t *type,
2541 REQUIRE(pctx != NULL);
2546 CHECK(cfg_parse_rawaddr(pctx, CFG_ADDR_V4OK | CFG_ADDR_V4PREFIXOK |
2559 CHECK(cfg_peektoken(pctx, 0));
2560 if (pctx->token.type == isc_tokentype_special &&
2561 pctx->token.value.as_char == '/') {
2562 CHECK(cfg_gettoken(pctx, 0)); /* read "/" */
2563 CHECK(cfg_gettoken(pctx, ISC_LEXOPT_NUMBER));
2564 if (pctx->token.type != isc_tokentype_number) {
2565 cfg_parser_error(pctx, CFG_LOG_NEAR,
2569 prefixlen = pctx->token.value.as_ulong;
2571 cfg_parser_error(pctx, CFG_LOG_NOPREP,
2578 CHECK(cfg_create_obj(pctx, &cfg_type_netprefix, &obj));
2584 cfg_parser_error(pctx, CFG_LOG_NEAR, "expected network prefix");
2589 print_netprefix(cfg_printer_t *pctx, const cfg_obj_t *obj) {
2592 cfg_print_rawaddr(pctx, &p->address);
2593 cfg_print_cstr(pctx, "/");
2594 cfg_print_rawuint(pctx, p->prefixlen);
2621 parse_sockaddrsub(cfg_parser_t *pctx, const cfg_type_t *type,
2631 CHECK(cfg_create_obj(pctx, type, &obj));
2632 CHECK(cfg_parse_rawaddr(pctx, flags, &netaddr));
2634 CHECK(cfg_peektoken(pctx, 0));
2635 if (pctx->token.type == isc_tokentype_string) {
2636 if (strcasecmp(TOKEN_STRING(pctx), "port") == 0) {
2637 CHECK(cfg_gettoken(pctx, 0)); /* read "port" */
2638 CHECK(cfg_parse_rawport(pctx, flags, &port));
2641 strcasecmp(TOKEN_STRING(pctx), "dscp") == 0)
2643 CHECK(cfg_gettoken(pctx, 0)); /* read "dscp" */
2644 CHECK(cfg_parse_dscp(pctx, &dscp));
2652 cfg_parser_error(pctx, 0, "expected at most one port");
2658 cfg_parser_error(pctx, 0, "expected at most one dscp");
2686 cfg_parse_sockaddr(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
2689 REQUIRE(pctx != NULL);
2695 return (parse_sockaddrsub(pctx, &cfg_type_sockaddr, *flagp, ret));
2699 cfg_print_sockaddr(cfg_printer_t *pctx, const cfg_obj_t *obj) {
2704 REQUIRE(pctx != NULL);
2709 cfg_print_cstr(pctx, buf);
2712 cfg_print_cstr(pctx, " port ");
2713 cfg_print_rawuint(pctx, port);
2716 cfg_print_cstr(pctx, " dscp ");
2717 cfg_print_rawuint(pctx, obj->value.sockaddrdscp.dscp);
2722 cfg_doc_sockaddr(cfg_printer_t *pctx, const cfg_type_t *type) {
2726 REQUIRE(pctx != NULL);
2729 cfg_print_cstr(pctx, "( ");
2731 cfg_print_cstr(pctx, "<ipv4_address>");
2736 cfg_print_cstr(pctx, " | ");
2737 cfg_print_cstr(pctx, "<ipv6_address>");
2742 cfg_print_cstr(pctx, " | ");
2743 cfg_print_cstr(pctx, "*");
2747 cfg_print_cstr(pctx, " ) ");
2749 cfg_print_cstr(pctx, "[ port ( <integer> | * ) ]");
2751 cfg_print_cstr(pctx, "[ port <integer> ]");
2754 cfg_print_cstr(pctx, " [ dscp <integer> ]");
2777 cfg_gettoken(cfg_parser_t *pctx, int options) {
2780 REQUIRE(pctx != NULL);
2782 if (pctx->seen_eof)
2788 pctx->token.type = isc_tokentype_unknown;
2789 result = isc_lex_gettoken(pctx->lexer, options, &pctx->token);
2790 pctx->ungotten = ISC_FALSE;
2791 pctx->line = isc_lex_getsourceline(pctx->lexer);
2795 if (pctx->token.type == isc_tokentype_eof) {
2796 result = isc_lex_close(pctx->lexer);
2800 if (isc_lex_getsourcename(pctx->lexer) != NULL) {
2805 elt = ISC_LIST_TAIL(pctx->open_files->
2808 ISC_LIST_UNLINK(pctx->open_files->
2810 ISC_LIST_APPEND(pctx->closed_files->
2814 pctx->seen_eof = ISC_TRUE;
2820 cfg_parser_error(pctx, CFG_LOG_NEAR, "token too big");
2824 cfg_parser_error(pctx, 0, "%s",
2829 cfg_parser_error(pctx, CFG_LOG_NEAR, "%s",
2837 cfg_ungettoken(cfg_parser_t *pctx) {
2838 REQUIRE(pctx != NULL);
2840 if (pctx->seen_eof)
2842 isc_lex_ungettoken(pctx->lexer, &pctx->token);
2843 pctx->ungotten = ISC_TRUE;
2847 cfg_peektoken(cfg_parser_t *pctx, int options) {
2850 REQUIRE(pctx != NULL);
2852 CHECK(cfg_gettoken(pctx, options));
2853 cfg_ungettoken(pctx);
2863 cfg_getstringtoken(cfg_parser_t *pctx) {
2866 result = cfg_gettoken(pctx, CFG_LEXOPT_QSTRING);
2870 if (pctx->token.type != isc_tokentype_string &&
2871 pctx->token.type != isc_tokentype_qstring) {
2872 cfg_parser_error(pctx, CFG_LOG_NEAR, "expected string");
2879 cfg_parser_error(cfg_parser_t *pctx, unsigned int flags, const char *fmt, ...) {
2882 REQUIRE(pctx != NULL);
2886 parser_complain(pctx, ISC_FALSE, flags, fmt, args);
2888 pctx->errors++;
2892 cfg_parser_warning(cfg_parser_t *pctx, unsigned int flags, const char *fmt, ...) {
2895 REQUIRE(pctx != NULL);
2899 parser_complain(pctx, ISC_TRUE, flags, fmt, args);
2901 pctx->warnings++;
2907 have_current_file(cfg_parser_t *pctx) {
2909 if (pctx->open_files == NULL)
2912 elt = ISC_LIST_TAIL(pctx->open_files->value.list);
2920 current_file(cfg_parser_t *pctx) {
2925 if (!have_current_file(pctx))
2928 elt = ISC_LIST_TAIL(pctx->open_files->value.list);
2938 parser_complain(cfg_parser_t *pctx, isc_boolean_t is_warning,
2953 if (have_current_file(pctx))
2955 current_file(pctx), pctx->line);
2956 else if (pctx->buf_name != NULL)
2957 snprintf(where, sizeof(where), "%s: ", pctx->buf_name);
2969 if (pctx->ungotten)
2970 (void)cfg_gettoken(pctx, 0);
2972 if (pctx->token.type == isc_tokentype_eof) {
2974 } else if (pctx->token.type == isc_tokentype_unknown) {
2978 isc_lex_getlasttokentext(pctx->lexer,
2979 &pctx->token, &r);
2998 isc_log_write(pctx->lctx, CAT, MOD, level,
3041 cfg_create_obj(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
3045 REQUIRE(pctx != NULL);
3049 obj = isc_mem_get(pctx->mctx, sizeof(cfg_obj_t));
3054 obj->file = current_file(pctx);
3055 obj->line = pctx->line;
3056 obj->pctx = pctx;
3060 isc_mem_put(pctx->mctx, obj, sizeof(cfg_obj_t));
3074 cfg_parser_t *pctx = (cfg_parser_t *)userarg;
3079 cfg_obj_destroy(pctx, &obj);
3083 create_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
3088 CHECK(cfg_create_obj(pctx, type, &obj));
3089 CHECK(isc_symtab_create(pctx->mctx, 5, /* XXX */
3091 pctx, ISC_FALSE, &symtab));
3100 isc_mem_put(pctx->mctx, obj, sizeof(*obj));
3105 free_map(cfg_parser_t *pctx, cfg_obj_t *obj) {
3120 * Destroy 'obj', a configuration object created in 'pctx'.
3123 cfg_obj_destroy(cfg_parser_t *pctx, cfg_obj_t **objp) {
3128 REQUIRE(pctx != NULL);
3134 obj->type->rep->free(pctx, obj);
3136 isc_mem_put(pctx->mctx, obj, sizeof(cfg_obj_t));
3151 free_noop(cfg_parser_t *pctx, cfg_obj_t *obj) {
3152 UNUSED(pctx);
3157 cfg_doc_obj(cfg_printer_t *pctx, const cfg_type_t *type) {
3158 REQUIRE(pctx != NULL);
3161 type->doc(pctx, type);
3165 cfg_doc_terminal(cfg_printer_t *pctx, const cfg_type_t *type) {
3166 REQUIRE(pctx != NULL);
3169 cfg_print_cstr(pctx, "<");
3170 cfg_print_cstr(pctx, type->name);
3171 cfg_print_cstr(pctx, ">");
3179 cfg_printer_t pctx;
3181 pctx.f = f;
3182 pctx.closure = closure;
3183 pctx.indent = 0;
3184 pctx.flags = 0;
3185 cfg_doc_obj(&pctx, type);
3189 cfg_parser_mapadd(cfg_parser_t *pctx, cfg_obj_t *mapobj,
3200 REQUIRE(pctx != NULL);
3223 CHECK(cfg_create_list(pctx, &cfg_type_implicitlist,
3225 CHECK(create_listelt(pctx, &elt));
3240 CHECK(create_listelt(pctx, &elt));
3252 free_listelt(pctx, elt);